Compare commits

..

10 Commits

Author SHA1 Message Date
skullY 471722f495 wip 2019-03-17 01:56:27 -07:00
skullY 5e66140fbc wip 2019-03-17 01:56:27 -07:00
skullY ef8de0e6f0 wip 2019-03-17 01:56:27 -07:00
skullY d495b26d2d wip 2019-03-17 01:56:27 -07:00
skullY e992079e08 stm32 cleanup 2019-03-17 01:56:26 -07:00
skullY 0aa30138ff Get Clueboard 66% hotswap working with led_matrix 2019-03-17 01:56:26 -07:00
skullY aa11627383 Bring this branch up to date with led_matrix 2019-03-17 01:55:58 -07:00
skullY 5c132afbf5 wip 2019-03-17 01:55:09 -07:00
skullY b4feae42b4 Fix LAYOUT_66_ansi 2019-03-17 01:52:24 -07:00
skullY b867398408 Initial Clueboard 66% arm support 2019-03-17 01:52:24 -07:00
273 changed files with 2530 additions and 14101 deletions
+5 -5
View File
@@ -308,16 +308,16 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
OPT_DEFS += -DSPLIT_KEYBOARD
# Include files used by all split keyboards
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_util.c
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_flags.c \
$(QUANTUM_DIR)/split_common/split_util.c
# Determine which (if any) transport files are required
ifneq ($(strip $(SPLIT_TRANSPORT)), custom)
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/transport.c
# Functions added via QUANTUM_LIB_SRC are only included in the final binary if they're called.
# Unused functions are pruned away, which is why we can add multiple drivers here without bloat.
QUANTUM_LIB_SRC += $(QUANTUM_DIR)/split_common/serial.c \
i2c_master.c \
i2c_slave.c
# Unused functions are pruned away, which is why we can add both drivers here without bloat.
QUANTUM_LIB_SRC += $(QUANTUM_DIR)/split_common/i2c.c \
$(QUANTUM_DIR)/split_common/serial.c
endif
COMMON_VPATH += $(QUANTUM_PATH)/split_common
endif
+1 -1
View File
@@ -12,7 +12,7 @@ place:
``` text
+------+ +-----+ +----------+ +----------+ +----+
| User |-------->| Key |------>| Firmware |----->| USB wire |---->| OS |
+------+ +-----+ +----------+ +----------+ +----+
+------+ +-----+ +----------+ +----------+ |----+
```
This scheme is a very simple view of what's going on, and more details follow
+1 -1
View File
@@ -12,7 +12,7 @@ The I2C Master drivers used in QMK have a set of common functions to allow porta
|`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(void);` |Ends an I2C transaction. |
|`uint8_t i2c_stop(uint16_t timeout);` |Stops the I2C driver. |
### Function Return
+6 -3
View File
@@ -65,11 +65,13 @@ uint8_t i2c_start(uint8_t address)
return 0;
}
uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
int8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
{
//xprintf("i2c_transmit(0x%x, 0x%x, %d, 0x%x) address:0x%x\n", address, data, length, timeout, address >> 1);
i2c_address = address;
i2cStart(&I2C_DRIVER, &i2cconfig);
return i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, 0, 0, MS2ST(timeout));
int8_t result = i2cMasterTransmitTimeout(&I2C_DRIVER, i2c_address, data, length, 0, 0, MS2ST(timeout));
return result;
}
uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
@@ -101,7 +103,8 @@ uint8_t i2c_readReg(uint8_t devaddr, uint8_t* regaddr, uint8_t* data, uint16_t l
return i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), regaddr, 1, data, length, MS2ST(timeout));
}
uint8_t i2c_stop(void)
// This is usually not needed. It releases the driver to allow pins to become GPIO again.
uint8_t i2c_stop(uint16_t timeout)
{
i2cStop(&I2C_DRIVER);
return 0;
+2 -2
View File
@@ -42,9 +42,9 @@
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);
int8_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(void);
uint8_t i2c_stop(uint16_t timeout);
+100 -74
View File
@@ -7,44 +7,43 @@
#include "i2c_master.h"
#include "timer.h"
#include "wait.h"
#ifndef F_SCL
# define F_SCL 400000UL // SCL frequency
#define F_SCL 400000UL // SCL frequency
#endif
#define Prescaler 1
#define TWBR_val ((((F_CPU / F_SCL) / Prescaler) - 16) / 2)
#define TWBR_val ((((F_CPU / F_SCL) / Prescaler) - 16 ) / 2)
void i2c_init(void) {
TWSR = 0; /* no prescaler */
void i2c_init(void)
{
TWSR = 0; /* no prescaler */
TWBR = (uint8_t)TWBR_val;
}
i2c_status_t i2c_start(uint8_t address, uint16_t timeout) {
i2c_status_t i2c_start(uint8_t address, uint16_t timeout)
{
// reset TWI control register
TWCR = 0;
// transmit START condition
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
uint16_t timeout_timer = timer_read();
while (!(TWCR & (1 << TWINT))) {
while( !(TWCR & (1<<TWINT)) ) {
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
return I2C_STATUS_TIMEOUT;
}
}
// check if the start condition was successfully transmitted
if (((TW_STATUS & 0xF8) != TW_START) && ((TW_STATUS & 0xF8) != TW_REP_START)) {
return I2C_STATUS_ERROR;
}
if(((TW_STATUS & 0xF8) != TW_START) && ((TW_STATUS & 0xF8) != TW_REP_START)){ return I2C_STATUS_ERROR; }
// load slave address into data register
TWDR = address;
// start transmission of address
TWCR = (1 << TWINT) | (1 << TWEN);
TWCR = (1<<TWINT) | (1<<TWEN);
timeout_timer = timer_read();
while (!(TWCR & (1 << TWINT))) {
while( !(TWCR & (1<<TWINT)) ) {
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
return I2C_STATUS_TIMEOUT;
}
@@ -52,39 +51,38 @@ i2c_status_t i2c_start(uint8_t address, uint16_t timeout) {
// check if the device has acknowledged the READ / WRITE mode
uint8_t twst = TW_STATUS & 0xF8;
if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
return I2C_STATUS_ERROR;
}
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return I2C_STATUS_ERROR;
return I2C_STATUS_SUCCESS;
}
i2c_status_t i2c_write(uint8_t data, uint16_t timeout) {
i2c_status_t i2c_write(uint8_t data, uint16_t timeout)
{
// load data into data register
TWDR = data;
// start transmission of data
TWCR = (1 << TWINT) | (1 << TWEN);
TWCR = (1<<TWINT) | (1<<TWEN);
uint16_t timeout_timer = timer_read();
while (!(TWCR & (1 << TWINT))) {
while( !(TWCR & (1<<TWINT)) ) {
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
return I2C_STATUS_TIMEOUT;
}
}
if ((TW_STATUS & 0xF8) != TW_MT_DATA_ACK) {
return I2C_STATUS_ERROR;
}
if( (TW_STATUS & 0xF8) != TW_MT_DATA_ACK ){ return I2C_STATUS_ERROR; }
return I2C_STATUS_SUCCESS;
}
int16_t i2c_read_ack(uint16_t timeout) {
int16_t i2c_read_ack(uint16_t timeout)
{
// start TWI module and acknowledge data after reception
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA);
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
uint16_t timeout_timer = timer_read();
while (!(TWCR & (1 << TWINT))) {
while( !(TWCR & (1<<TWINT)) ) {
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
return I2C_STATUS_TIMEOUT;
}
@@ -94,12 +92,14 @@ int16_t i2c_read_ack(uint16_t timeout) {
return TWDR;
}
int16_t i2c_read_nack(uint16_t timeout) {
int16_t i2c_read_nack(uint16_t timeout)
{
// start receiving without acknowledging reception
TWCR = (1 << TWINT) | (1 << TWEN);
TWCR = (1<<TWINT) | (1<<TWEN);
uint16_t timeout_timer = timer_read();
while (!(TWCR & (1 << TWINT))) {
while( !(TWCR & (1<<TWINT)) ) {
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
return I2C_STATUS_TIMEOUT;
}
@@ -109,89 +109,115 @@ int16_t i2c_read_nack(uint16_t timeout) {
return TWDR;
}
i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) {
i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
{
i2c_status_t status = i2c_start(address | I2C_WRITE, timeout);
if (status) return status;
for (uint16_t i = 0; i < length && status >= 0; i++) {
for (uint16_t i = 0; i < length; i++) {
status = i2c_write(data[i], timeout);
if (status) return status;
}
i2c_stop();
status = i2c_stop(timeout);
if (status) return status;
return status;
return I2C_STATUS_SUCCESS;
}
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) {
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
{
i2c_status_t status = i2c_start(address | I2C_READ, timeout);
if (status) return status;
for (uint16_t i = 0; i < (length - 1) && status >= 0; i++) {
for (uint16_t i = 0; i < (length-1); i++) {
status = i2c_read_ack(timeout);
if (status >= 0) {
data[i] = status;
} else {
return status;
}
}
if (status >= 0) {
status = i2c_read_nack(timeout);
if (status >= 0) {
data[(length - 1)] = status;
}
status = i2c_read_nack(timeout);
if (status >= 0 ) {
data[(length-1)] = status;
} else {
return status;
}
i2c_stop();
status = i2c_stop(timeout);
if (status) return status;
return (status < 0) ? status : I2C_STATUS_SUCCESS;
return I2C_STATUS_SUCCESS;
}
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) {
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
{
i2c_status_t status = i2c_start(devaddr | 0x00, timeout);
if (status >= 0) {
status = i2c_write(regaddr, timeout);
for (uint16_t i = 0; i < length && status >= 0; i++) {
status = i2c_write(data[i], timeout);
}
}
i2c_stop();
return status;
}
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) {
i2c_status_t status = i2c_start(devaddr, timeout);
if (status < 0) {
goto error;
}
if (status) return status;
status = i2c_write(regaddr, timeout);
if (status < 0) {
goto error;
if (status) return status;
for (uint16_t i = 0; i < length; i++) {
status = i2c_write(data[i], timeout);
if (status) return status;
}
status = i2c_start(devaddr | 0x01, timeout);
status = i2c_stop(timeout);
if (status) return status;
for (uint16_t i = 0; i < (length - 1) && status >= 0; i++) {
return I2C_STATUS_SUCCESS;
}
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
{
i2c_status_t status = i2c_start(devaddr, timeout);
if (status) return status;
status = i2c_write(regaddr, timeout);
if (status) return status;
status = i2c_stop(timeout);
if (status) return status;
status = i2c_start(devaddr | 0x01, timeout);
if (status) return status;
for (uint16_t i = 0; i < (length-1); i++) {
status = i2c_read_ack(timeout);
if (status >= 0) {
data[i] = status;
} else {
return status;
}
}
if (status >= 0) {
status = i2c_read_nack(timeout);
if (status >= 0) {
data[(length - 1)] = status;
}
status = i2c_read_nack(timeout);
if (status >= 0 ) {
data[(length-1)] = status;
} else {
return status;
}
error:
i2c_stop();
status = i2c_stop(timeout);
if (status) return status;
return (status < 0) ? status : I2C_STATUS_SUCCESS;
return I2C_STATUS_SUCCESS;
}
void i2c_stop(void) {
i2c_status_t i2c_stop(uint16_t timeout)
{
// transmit STOP condition
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
uint16_t timeout_timer = timer_read();
while(TWCR & (1<<TWSTO)) {
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
return I2C_STATUS_TIMEOUT;
}
}
return I2C_STATUS_SUCCESS;
}
+1 -1
View File
@@ -26,6 +26,6 @@ i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint1
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
void i2c_stop(void);
i2c_status_t i2c_stop(uint16_t timeout);
#endif // I2C_MASTER_H
+1 -1
View File
@@ -16,7 +16,7 @@ static volatile bool slave_has_register_set = false;
void i2c_slave_init(uint8_t address){
// load address into TWI address register
TWAR = address;
TWAR = (address << 1);
// set the TWCR to enable address matching and enable TWI, clear TWINT, enable TWI interrupt
TWCR = (1 << TWIE) | (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
}
+227
View File
@@ -0,0 +1,227 @@
/* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert
* Copyright 2019 Clueboard
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef __AVR__
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#else
#include "wait.h"
#endif
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "is31fl3235a.h"
#include "i2c_master.h"
#include "progmem.h"
#include "print.h"
#define ISSI_REG_CONFIG 0x00 // FIXME: Not on 3235?
#define ISSI_REG_CONFIG_PICTUREMODE 0x00 // FIXME: Not on 3235?
//#define ISSI_REG_AUDIOSYNC 0x06 // FIXME: Not on 3235?
#define ISSI_COMMANDREGISTER 0xFD // FIXME: Not on 3235?
#define ISSI_BANK_FUNCTIONREG 0x0B // FIXME: Not on 3235?
#ifndef ISSI_TIMEOUT
#define ISSI_TIMEOUT 100
#endif
#ifndef ISSI_PERSISTENCE
#define ISSI_PERSISTENCE 0
#endif
// Transfer buffer for TWITransmitData()
uint8_t g_3235a_transfer_buffer[20];
// These buffers match the IS31FL3235A PWM registers 0x05-0x20.
// 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 IS31FL3235A_write_pwm_buffer() but it's
// probably not worth the extra complexity.
uint8_t g_rgb7seg_buffer[IS31FL3235A_COUNT][IS31FL3235A_LED_MAX];
bool g_rgb7seg_buffer_update_required = false;
/* There's probably a better way to init this... */
#if IS31FL3235A_COUNT == 1
uint8_t g_3235a_control_registers[IS31FL3235A_COUNT][18] = {{0}};
#elif IS31FL3235A_COUNT == 2
uint8_t g_3235a_control_registers[IS31FL3235A_COUNT][18] = {{0}, {0}};
#elif IS31FL3235A_COUNT == 3
uint8_t g_3235a_control_registers[IS31FL3235A_COUNT][18] = {{0}, {0}, {0}};
#elif IS31FL3235A_COUNT == 4
uint8_t g_3235a_control_registers[IS31FL3235A_COUNT][18] = {{0}, {0}, {0}, {0}};
#endif
bool g_rgb7seg_control_registers_update_required = false;
void IS31FL3235A_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
g_3235a_transfer_buffer[0] = reg;
g_3235a_transfer_buffer[1] = data;
xprintf("IS31FL3235A_write_register(0x%x, 0x%x, 0x%x); g_3235a_transfer_buffer:0x%x\n", addr, reg, data, g_3235a_transfer_buffer);
#if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr, g_3235a_transfer_buffer, 2, ISSI_TIMEOUT) == 0) {
break;
}
}
#else
if (i2c_transmit(addr, g_3235a_transfer_buffer, 2, ISSI_TIMEOUT) == -1) {
// When we encounter a timeout ChibiOS says the bus must be reset as it's in an unknown state
xprintf("i2c transmit timeout, resetting i2c bus!\n");
i2c_stop(ISSI_TIMEOUT);
wait_ms(5);
i2c_start(ISSI_TIMEOUT);
}
#endif
}
void IS31FL3235A_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
// assumes bank is already selected
// transmit PWM registers in 9 transfers of 16 bytes
// g_3235a_transfer_buffer[] is 20 bytes
// iterate over the pwm_buffer contents at 16 byte intervals
for (int i = 0; i < IS31FL3235A_LED_MAX; i += 16) {
// set the first register, e.g. 0x24, 0x34, 0x44, etc.
g_3235a_transfer_buffer[0] = 0x24 + i;
// copy the data from i to i+15
// device will auto-increment register for data after the first byte
// thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer
for (int j = 0; j < 16; j++) {
g_3235a_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_3235a_transfer_buffer, 17, ISSI_TIMEOUT) == 0)
break;
}
#else
if (i2c_transmit(addr << 1, g_3235a_transfer_buffer, 17, ISSI_TIMEOUT) == -1) {
// When we encounter a timeout ChibiOS says the bus must be reset as it's in an unknown state
xprintf("i2c transmit timeout, resetting i2c bus!\n");
i2c_stop(ISSI_TIMEOUT);
wait_ms(5);
i2c_start(ISSI_TIMEOUT);
}
#endif
}
}
void IS31FL3235A_init(uint8_t addr) {
wait_ms(2000); // Give QMK Toolbox time to attach
xprintf("IS31FS3235A_init(0x%x)\n", addr);
// In order to avoid the LEDs being driven with garbage data
// in the LED driver's PWM registers, first enable software shutdown,
// then set up the mode and other settings, clear the PWM registers,
// then disable software shutdown.
// Reset settings to default
//IS31FL3235A_write_register(addr, ISSI_REG_RESET_REG, 0);
// this delay was copied from other drivers, might not be needed
wait_ms(10);
// This is how the Arduino code does init...
uint8_t i = 0;
for (i=0x2A; i<=0x45; i++) {
IS31FL3235A_write_register(addr, i, 0xFF); // Turn off all LEDs
}
for (i=0x05; i<=0x20; i++) {
IS31FL3235A_write_register(addr, i, 0x00); // Write all PWM set 0x00
}
IS31FL3235A_write_register(addr, 0x25, 0x00); //update PWM&Control registers
IS31FL3235A_write_register(addr, 0x4B, 0x01); //frequency setting 22KHz
IS31FL3235A_write_register(addr, 0x00, 0x01); //normal operation
// This is how the Arduino code does LED turn on
IS31FL3235A_write_register(addr, 0x05, 0xFF); // set PWM
IS31FL3235A_write_register(addr, 0x25, 0x00); // update PWM&Control registers
IS31FL3235A_write_register(addr, 0x08, 0xFF); // set PWM
IS31FL3235A_write_register(addr, 0x25, 0x00); // update PWM&Control registers
IS31FL3235A_write_register(addr, 0x12, 0xFF); // set PWM
IS31FL3235A_write_register(addr, 0x25, 0x00); // update PWM&Control registers
// FIXME: This is for testing, turn on OUT1 at full brightness
//IS31FL3235A_write_register(addr, 0x2A, 0xFF);
//IS31FL3235A_write_register(addr, 0x05, 0x00);
// I think this finally turns it on?
//IS31FL3235A_write_register(addr, 0x25, 0x00); //update PWM&Control registers
//IS31FL3235A_write_register(addr, 0x4B, 0x01); //frequency setting 22KHz
//IS31FL3235A_write_register(addr, 0x00, 0x01); //normal operation
}
void IS31FL3235A_set_value(int index, uint8_t value) {
/*
if (index >= 0 && index < IS31FL3235A_LED_COUNT) {
is31_led led = g_is31_leds[index];
// Subtract 0x24 to get the second index of g_rgb7seg_buffer
g_rgb7seg_buffer[led.driver][led.v - 0x24] = value;
g_rgb7seg_buffer_update_required = true;
}
*/
}
void IS31FL3235A_set_value_all(uint8_t value) {
for (int i = 0; i < IS31FL3235A_LED_COUNT; i++) {
IS31FL3235A_set_value(i, value);
}
}
void IS31FL3235A_set_led_control_register(uint8_t index, bool value) {
/*
is31_led led = g_is31_leds[index];
uint8_t control_register = (led.v - 0x24) / 8;
uint8_t bit_value = (led.v - 0x24) % 8;
if (value) {
g_3235a_control_registers[led.driver][control_register] |= (1 << bit_value);
} else {
g_3235a_control_registers[led.driver][control_register] &= ~(1 << bit_value);
}
g_rgb7seg_control_registers_update_required = true;
*/
}
void IS31FL3235A_update_pwm_buffers(uint8_t addr, uint8_t index) {
//xprintf("IS31FS3235A_update_pwm_buffers(0x%x, %d)\n", addr, index);
if (g_rgb7seg_buffer_update_required) {
IS31FL3235A_write_pwm_buffer(addr, g_rgb7seg_buffer[index]);
g_rgb7seg_buffer_update_required = false;
}
}
void IS31FL3235A_update_led_control_registers(uint8_t addr, uint8_t index) {
if (g_rgb7seg_control_registers_update_required) {
for (int i=0; i<18; i++) {
IS31FL3235A_write_register(addr, i, g_3235a_control_registers[index][i]);
}
}
}
+141
View File
@@ -0,0 +1,141 @@
/* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert
* Copyright 2019 Clueboard
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef IS31FL3235A_DRIVER_H
#define IS31FL3235A_DRIVER_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:
// 0b0111111 AD <-> VCC
// 0b0111110 AD <-> SDA
// 0b0111101 AD <-> SCL
// 0b0111100 AD <-> GND
#ifndef IS31FL3235A_COUNT
#define IS31FL3235A_COUNT 1
#endif
#ifndef IS31FL3235A_DRIVER_ADDR_1
#define IS31FL3235A_DRIVER_ADDR_1 0b0111111
//#define IS31FL3235A_DRIVER_ADDR_1 0x7E
#endif
#ifndef IS31FL3235A_DRIVER_ADDR_2
#define IS31FL3235A_DRIVER_ADDR_2 0b0111110
#endif
#ifndef IS31FL3235A_DRIVER_ADDR_3
#define IS31FL3235A_DRIVER_ADDR_3 0b0111101
#endif
#ifndef IS31FL3235A_DRIVER_ADDR_4
#define IS31FL3235A_DRIVER_ADDR_4 0b0111100
#endif
// This is the max number of LEDs this driver supports per IC
#define IS31FL3235A_LED_MAX 28
#ifndef IS31FL3235A_LED_COUNT
#define IS31FL3235A_LED_COUNT IS31FL3235A_LED_MAX
#endif
// Registers we will need to write to
#define ISSI_REG_SHUTDOWN 0x00 // Control the software shutdown state of the controller
#define ISSI_REG_GLOBAL_CONTROL 0x4A // Write 0 for normal operation, 1 to shutdown all LEDs
#define ISSI_REG_OUTPUT_FREQ 0x4B // Write 0 for 3kHz PWM, 1 for 22kHz
#define ISSI_REG_RESET_REG 0x4F // Write 0 to reset all registers to default value
void IS31FL3235A_init(uint8_t addr);
void IS31FL3235A_write_register(uint8_t addr, uint8_t reg, uint8_t data);
void IS31FL3235A_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
void IS31FL3235A_set_value(int index, uint8_t value);
void IS31FL3235A_set_value_all(uint8_t value);
void IS31FL3235A_set_led_control_register(uint8_t index, bool value);
// 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 IS31FL3235A_update_pwm_buffers(uint8_t addr, uint8_t index);
void IS31FL3235A_update_led_control_registers(uint8_t addr, uint8_t index);
// The address for each LED in the is31fl3235a's Control Register
enum control_register {
CR_OUT1 = 0x2A,
CR_OUT2,
CR_OUT3,
CR_OUT4,
CR_OUT5,
CR_OUT6,
CR_OUT7,
CR_OUT8,
CR_OUT9,
CR_OUT10,
CR_OUT11,
CR_OUT12,
CR_OUT13,
CR_OUT14,
CR_OUT15,
CR_OUT16,
CR_OUT17,
CR_OUT18,
CR_OUT19,
CR_OUT20,
CR_OUT21,
CR_OUT22,
CR_OUT23,
CR_OUT24,
CR_OUT25,
CR_OUT26,
CR_OUT27,
CR_OUT28
};
// The address for each LED in the is31fl3235a's PWM Register
enum pwm_register {
OUT1 = 0x05,
OUT2,
OUT3,
OUT4,
OUT5,
OUT6,
OUT7,
OUT8,
OUT9,
OUT10,
OUT11,
OUT12,
OUT13,
OUT14,
OUT15,
OUT16,
OUT17,
OUT18,
OUT19,
OUT20,
OUT21,
OUT22,
OUT23,
OUT24,
OUT25,
OUT26,
OUT27,
OUT28
};
#endif // IS31FL3235A_DRIVER_H
+6
View File
@@ -22,10 +22,16 @@ void qwiic_init(void) {
#ifdef QWIIC_MICRO_OLED_ENABLE
micro_oled_init();
#endif
#ifdef QWIIC_RGB7SEG_ENABLE
rgb7seg_init();
#endif
}
void qwiic_task(void) {
#ifdef QWIIC_JOYSTIIC_ENABLE
joystiic_task();
#endif
#ifdef QWIIC_RGB7SEG_ENABLE
rgb7seg_task();
#endif
}
+3
View File
@@ -23,6 +23,9 @@
#ifdef QWIIC_MICRO_OLED_ENABLE
#include "micro_oled.h"
#endif
#ifdef QWIIC_RGB7SEG_ENABLE
#include "rgb7seg.h"
#endif
void qwiic_init(void);
void qwiic_task(void);
+6
View File
@@ -16,3 +16,9 @@ ifneq ($(filter MICRO_OLED, $(QWIIC_ENABLE)),)
OPT_DEFS += -DQWIIC_MICRO_OLED_ENABLE
SRC += micro_oled.c
endif
ifneq ($(filter RGB7SEG, $(QWIIC_ENABLE)),)
COMMON_VPATH += $(DRIVER_PATH)/issi
OPT_DEFS += -DQWIIC_RGB7SEG_ENABLE
SRC += rgb7seg.c is31fl3235a.c
endif
+168
View File
@@ -0,0 +1,168 @@
/* Copyright 2017 Jason Williams
* Copyright 2017 Jack Humbert
* Copyright 2018 Yiancar
* Copyright 2019 Clueboard
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include "quantum.h"
#include "rgb7seg.h"
#include "is31fl3235a.h"
#include "progmem.h"
#include "config.h"
#include "eeprom.h"
#include <string.h>
#include <math.h>
#ifndef MAX
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
#endif
#ifndef MIN
#define MIN(a,b) ((a) < (b)? (a): (b))
#endif
// State variables
uint32_t g7_tick = 0; // Global tick at 20 Hz
bool rgb7seg_enabled = 0; // Whether or not the display is turned on
/*
const rgb7seg_led g_rgb7seg_leds[IS31FL3235A_COUNT * 8][4] = {
/ * Refer to IS31 manual for these locations
* driver
* | R LED address
* | | G LED address
* | | | B LED address
* | | | | * /
{0, OUT17, OUT16, OUT15}, // A, top middle
{0, OUT22, OUT21, OUT20}, // B, top right
{0, OUT26, OUT27, OUT28}, // C, bottom right
{0, OUT1, OUT2, OUT3}, // D, bottom center
{0, OUT23, OUT24, OUT25}, // DP, dot
{0, OUT4, OUT5, OUT6}, // E, bottom left
{0, OUT9, OUT7, OUT8}, // F, top left
{0, OUT14, OUT13, OUT12}, // G, center
#if IS31FL3235A_COUNT > 1
{1, OUT17, OUT16, OUT15}, // A, top middle
{1, OUT22, OUT21, OUT20}, // B, top right
{1, OUT26, OUT27, OUT28}, // C, bottom right
{1, OUT1, OUT2, OUT3}, // D, bottom center
{1, OUT23, OUT24, OUT25}, // DP, dot
{1, OUT4, OUT5, OUT6}, // E, bottom left
{1, OUT9, OUT7, OUT8}, // F, top left
{1, OUT14, OUT13, OUT12}, // G, center
#endif
#if IS31FL3235A_COUNT > 2
{2, OUT17, OUT16, OUT15}, // A, top middle
{2, OUT17, OUT16, OUT15}, // A, top middle
{2, OUT22, OUT21, OUT20}, // B, top right
{2, OUT26, OUT27, OUT28}, // C, bottom right
{2, OUT1, OUT2, OUT3}, // D, bottom center
{2, OUT23, OUT24, OUT25}, // DP, dot
{2, OUT4, OUT5, OUT6}, // E, bottom left
{2, OUT9, OUT7, OUT8}, // F, top left
{2, OUT14, OUT13, OUT12}, // G, center
#endif
#if IS31FL3235A_COUNT > 3
{3, OUT17, OUT16, OUT15}, // A, top middle
{3, OUT22, OUT21, OUT20}, // B, top right
{3, OUT26, OUT27, OUT28}, // C, bottom right
{3, OUT1, OUT2, OUT3}, // D, bottom center
{3, OUT23, OUT24, OUT25}, // DP, dot
{3, OUT4, OUT5, OUT6}, // E, bottom left
{3, OUT9, OUT7, OUT8}, // F, top left
{3, OUT14, OUT13, OUT12}, // G, center
{3, OUT22, OUT21, OUT20}, // B, top right
#endif
};
*/
// API
void rgb7seg_flush(void) {
IS31FL3235A_update_pwm_buffers(IS31FL3235A_DRIVER_ADDR_1, 0);
#if IS31FL3235A_COUNT > 1
IS31FL3235A_update_pwm_buffers(IS31FL3235A_DRIVER_ADDR_2, 1);
#endif
#if IS31FL3235A_COUNT > 2
IS31FL3235A_update_pwm_buffers(IS31FL3235A_DRIVER_ADDR_3, 2);
#endif
#if IS31FL3235A_COUNT > 3
IS31FL3235A_update_pwm_buffers(IS31FL3235A_DRIVER_ADDR_4, 3);
#endif
}
void rgb7seg_set_index_value(int index, uint8_t value) {
IS31FL3235A_set_value(index, value);
}
void rgb7seg_set_index_value_all(uint8_t value) {
IS31FL3235A_set_value_all(value);
}
// All LEDs off
void rgb7seg_off(void) {
rgb7seg_set_index_value_all(0);
}
void rgb7seg_task(void) {
g7_tick++;
// Do something here?
// Tell the LED driver to update its state
rgb7seg_flush();
}
void rgb7seg_init(void) {
IS31FL3235A_init(IS31FL3235A_DRIVER_ADDR_1);
#if IS31FL3235A_COUNT > 1
IS31FL3235A_init(IS31FL3235A_DRIVER_ADDR_2);
#endif
#if IS31FL3235A_COUNT > 2
IS31FL3235A_init(IS31FL3235A_DRIVER_ADDR_3);
#endif
#if IS31FL3235A_COUNT > 3
IS31FL3235A_init(IS31FL3235A_DRIVER_ADDR_4);
#endif
// Wait half a second for the driver to finish initializing
wait_ms(500);
}
uint32_t rgb7seg_get_tick(void) {
return g7_tick;
}
void rgb7seg_toggle(void) {
rgb7seg_enabled ^= 1;
}
void rgb7seg_enable(void) {
rgb7seg_enabled = 1;
}
void rgb7seg_disable(void) {
rgb7seg_enabled = 0;
}
void rgb7seg_increase_val(void) {
// FIXME: Implement
}
void rgb7seg_decrease_val(void) {
// FIXME: Implement
}
+60
View File
@@ -0,0 +1,60 @@
/* Copyright 2017 Jason Williams
* Copyright 2017 Jack Humbert
* Copyright 2018 Yiancar
* Copyright 2019 Clueboard
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LED_MATRIX_H
#define LED_MATRIX_H
#include "is31fl3235a.h"
#ifndef BACKLIGHT_ENABLE
#error You must define BACKLIGHT_ENABLE with LED_MATRIX_ENABLE
#endif
void rgb7seg_task(void);
void rgb7seg_init(void);
// 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 rgb7seg_flush(void);
uint32_t rgb7seg_get_tick(void);
void rgb7seg_off(void);
void rgb7seg_set_index_value(int index, uint8_t value);
void rgb7seg_set_index_value_all(uint8_t value);
void rgb7seg_toggle(void);
void rgb7seg_enable(void);
void rgb7seg_disable(void);
void rgb7seg_increase_val(void);
void rgb7seg_decrease_val(void);
typedef struct rgb7seg_led {
uint8_t driver;
uint8_t r;
uint8_t g;
uint8_t b;
} __attribute__((packed)) rgb7seg_led;
extern const rgb7seg_led g_rgb7seg_leds[IS31FL3235A_COUNT * 8];
#endif
@@ -1,48 +0,0 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Layer 0
* ,-----------------------------------------------------------------------------------------.
* | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bksp |
* |-----------------------------------------------------------------------------------------+
* | Tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ |
* |-----------------------------------------------------------------------------------------+
* | Esc | a | s | d | f | g | h | j | k | l | ; | ' | Enter |
* |-----------------------------------------------------------------------------------------+
* | Shift | z | x | c | v | b | n | m | , | . | / | Shift |
* |-----------------------------------------------------------------------------------------+
* | Ctrl | L1 | Alt | space | Alt | Sup | L1 | Ctrl |
* \-----------------------------------------------------------------------------------------/
*
*/
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_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_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_ENT,
KC_LSHIFT, KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT, KC_RSHIFT,
KC_LCTL, MO(1), KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL),
/*
* Layer 1
* ,-----------------------------------------------------------------------------------------.
* | | f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10 | f11 | f12 | Del |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | | | Ins | | Paus| | | Prnt |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | L | D | U | R | | | |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | Hom | PDn | PUp | End | | |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | | |
* \-----------------------------------------------------------------------------------------/
*
*/
LAYOUT_all(
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_DEL,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PAUS, KC_TRNS, KC_TRNS, KC_PSCR,
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_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
};
+1 -2
View File
@@ -46,13 +46,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
#define DIODE_DIRECTION ROW2COL
/*
* 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 USE_SERIAL
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
@@ -42,7 +42,3 @@
{ R26, R25, R24, R23, R22, R21, R20 }, \
{ ___, ___, ___, ___, R32, ___, ___ } \
}
#ifdef USE_I2C
#error "I2C not Supported"
#endif
@@ -1,22 +0,0 @@
/* Copyright 2019 Boy_314
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
// place overrides here
#define IGNORE_MOD_TAP_INTERRUPT
#define PERMISSIVE_HOLD
#define TAPPING_TERM 200
@@ -1,141 +0,0 @@
/* Copyright 2019 Boy_314
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Tap Dance Declarations
enum {
TD_SWAP_LAYERS = 0
};
enum layers {
DVORAK,
QWERTY,
LOWER,
RAISE
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* DVORAK
* ,-------------------------------------------------------------------------------------------------.
* |Tab |' |, |. |P |Y |Brght+|= |F |G |C |R |L |Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* |CtlCps|A |O |E |U |I |Brght-|Ctrl+F|D |H |T |N |S |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* |LShift|; |Q |J |K |X |LAlt |- |B |M |W |V |Z |RShift|
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* |TD Swap Layer| |Space |
* `-------------' `-------------'
*/
[DVORAK] = LAYOUT(/* Base Dvorak */
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_BRIU, KC_EQL, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC,
LCTL_T(KC_CAPS), KC_A, KC_O, KC_E, KC_U, KC_I, KC_BRID, LCTL(KC_F), 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_LALT, KC_MINS, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSPC,
TD(TD_SWAP_LAYERS), KC_SPC
),
/* QWERTY
* ,-------------------------------------------------------------------------------------------------.
* |Tab |Q |W |E |R |T |Brght+|' |Y |U |I |O |P |Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* |LCtrl |A |S |D |F |G |Brght-|Ctrl+F|H |J |K |L |; |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* |LShift|Z |X |C |V |B |LAlt |- |N |M |, |. |/ |RShift|
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* |TD Swap Layer| |Space |
* `-------------' `-------------'
*/
[QWERTY] = LAYOUT(/* Base Qwerty */
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BRIU, KC_QUOT, 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_BRID, LCTL(KC_F), 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_LALT, KC_MINS, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC,
TD(TD_SWAP_LAYERS), KC_SPC
),
/* LOWER
* ,-------------------------------------------------------------------------------------------------.
* |Esc |1 |2 |3 |4 |5 | |= |6 |7 |8 |9 |0 |/ |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* |Caps |F1 |F2 |F3 |F4 |F5 |F6 |Vol Up|Play |_ |+ |{ |} || |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* | |F7 |F8 |F9 |F10 |F11 |F12 |Vol Dn|Next |Home |PgDn |PgUp |End | |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* | | | |
* `-------------' `-------------'
*/
[LOWER] = LAYOUT(/* Numbers, Function Row, Media Control, Shifted Symbols, Dvorak Slash Key */
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLSH,
KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_VOLU, KC_MPLY, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_MNXT, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_TRNS,
KC_TRNS, KC_TRNS
),
/* RAISE
* ,-------------------------------------------------------------------------------------------------.
* |Reset | | |Up | | | | | | | | | |Del |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* |` | |Left |Down |Right | | | | |- |= |[ |] |\ |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* | |! |@ |# |$ |% | | |^ |& |* |( |) | |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* | | | |
* `-------------' `-------------'
*/
[RAISE] = LAYOUT(/* Arrows, Shifted Numbers, Symbols, Delete, Reset Key */
RESET, 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_DEL,
KC_GRV, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
KC_TRNS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_TRNS, KC_TRNS, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TRNS,
KC_TRNS, KC_TRNS
)
};
void tap_dance_choose_layer (qk_tap_dance_state_t *state, void *user_data) {
switch (state->count) {
case 1:
layer_on(LOWER);
break;
case 2:
layer_on(RAISE);
break;
}
}
void tap_dance_choose_layer_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (state->count) {
case 1:
layer_off(LOWER);
break;
case 2:
layer_off(RAISE);
break;
case 3:
if (default_layer_state == DVORAK) {
default_layer_set(QWERTY);
layer_on(QWERTY);
layer_off(DVORAK);
}
else if (default_layer_state == QWERTY) {
default_layer_set(DVORAK);
layer_on(DVORAK);
layer_off(QWERTY);
}
break;
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
// ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)
[TD_SWAP_LAYERS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_choose_layer, tap_dance_choose_layer_reset)
};
@@ -1,2 +0,0 @@
# Boy_314's keymap for half_n_half
# Currently only supports DVORAK. QWERTY Support is on the TODO list.
@@ -1,5 +0,0 @@
TAP_DANCE_ENABLE = yes # Enable Tap Dance
NKRO_ENABLE = yes # USB Nkey Rollover
# Enable generic behavior for split boards
SPLIT_KEYBOARD = yes
@@ -79,6 +79,3 @@ 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
@@ -1,15 +1,15 @@
# 412-64
![412-64](https://i.imgur.com/ixuv3OM.jpg)
![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, Mark Zero Stand Aside.
Hardware Availability: No longer available, was a tester for Stand Aside. Build definitions are in handwired because two units are in the wild.
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 handwired/412_64:default
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).
-249
View File
@@ -1,249 +0,0 @@
/*
Copyright 2018 Ryota Goto
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xA103
#define PRODUCT_ID 0x0003
#define DEVICE_VER 0x0003
#define MANUFACTURER ai03 Keyboard Designs
#define PRODUCT Orbit
#define DESCRIPTION Split ergonomic keyboard
/* key matrix size */
#define MATRIX_ROWS 10 // Double rows for split keyboards. Orbit has 5, so define 10
#define MATRIX_COLS 7
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define MATRIX_ROW_PINS { F7, F6, F5, F4, D3 }
#define MATRIX_COL_PINS { C7, B4, D7, D6, D4, F1, F0 }
#define MATRIX_ROW_PINS_RIGHT { B6, B5, B4, D7, E6 }
#define MATRIX_COL_PINS_RIGHT { D4, D6, F1, F0, F4, F5, C6 }
#define SPLIT_HAND_PIN D5
//#define USE_I2C
#define SELECT_SOFT_SERIAL_SPEED 1
#define UNUSED_PINS
/* 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
// #define RGB_DI_PIN E2
// #ifdef RGB_DI_PIN
// #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 */
#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.
*
*/
/* 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
View File
@@ -1,91 +0,0 @@
/* Copyright 2018 Ryota Goto
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
MANUAL = SAFE_RANGE,
DBLZERO
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT( /* Base */
TO(1), 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_BSPC, \
TO(1), KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC, KC_BSLS, \
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_ENT, \
KC_NO, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_PSCR, KC_DEL, \
KC_LCTL, KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC, KC_SPC, MO(2), KC_GRV, KC_MENU, KC_MINS, KC_EQL
),
[1] = LAYOUT( /* Fn, Arrowkeys, Media control, Backlight */
TO(2), _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_VOLU, _______, \
TO(2), _______, _______, KC_PGUP, _______, _______, KC_F11, KC_F12, _______, KC_UP, _______, _______, KC_VOLD, BL_STEP, \
TO(0), _______, KC_HOME, KC_PGDN, KC_END, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_MPLY, _______, \
TO(0), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[2] = LAYOUT( /* Mousekeys and Numpad */
KC_NO, _______, _______, _______, _______, _______, _______, KC_NLCK, KC_P7, KC_P8, KC_P9, KC_PSLS, _______, _______, \
KC_NO, _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, _______, KC_P4, KC_P5, KC_P6, KC_PAST, _______, _______, \
TO(1), _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, _______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______, _______, \
TO(1), _______, KC_ACL0, KC_ACL1, KC_ACL2, KC_BTN3, _______, DBLZERO, KC_P0, KC_PDOT, KC_PENT, KC_PPLS, _______, MANUAL, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case MANUAL:
if (record->event.pressed)
{
// Keypress
SEND_STRING("https://kb.ai03.me/redir/orbit");
}
else
{
// Key release
}
break;
case DBLZERO:
if (record->event.pressed)
{
// Keypress
SEND_STRING("00");
}
else
{
// Key release
}
break;
}
return true;
}
void matrix_init_user(void) {
}
void matrix_scan_user(void) {
}
void led_set_user(uint8_t usb_led) {
}
uint32_t layer_state_set_user(uint32_t state) {
return state;
}
@@ -1,3 +0,0 @@
# The default keymap for Orbit
[KLE of layout](http://www.keyboard-layout-editor.com/#/gists/53ebf59524de12515cb7e2e6de94f0d6)
-328
View File
@@ -1,328 +0,0 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* scan matrix
*/
#include <stdint.h>
#include <stdbool.h>
#include "wait.h"
#include "util.h"
#include "matrix.h"
#include "split_util.h"
#include "config.h"
#include "split_flags.h"
#include "quantum.h"
#include "debounce.h"
#include "transport.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
#define ERROR_DISCONNECT_COUNT 5
//#define ROWS_PER_HAND (MATRIX_ROWS / 2)
#ifdef DIRECT_PINS
static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS;
#else
static pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
static pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
#endif
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t raw_matrix[ROWS_PER_HAND];
// row offsets for each hand
uint8_t thisHand, thatHand;
// user-defined overridable functions
__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) {}
// helper functions
inline uint8_t matrix_rows(void) { return MATRIX_ROWS; }
inline uint8_t matrix_cols(void) { return MATRIX_COLS; }
bool matrix_is_modified(void) {
if (debounce_active()) return false;
return true;
}
inline bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & ((matrix_row_t)1 << col)); }
inline matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; }
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");
}
}
uint8_t matrix_key_count(void) {
uint8_t count = 0;
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
count += matrix_bitpop(i);
}
return count;
}
// matrix code
#ifdef DIRECT_PINS
static void init_pins(void) {
for (int row = 0; row < MATRIX_ROWS; row++) {
for (int col = 0; col < MATRIX_COLS; col++) {
pin_t pin = direct_pins[row][col];
if (pin != NO_PIN) {
setPinInputHigh(pin);
}
}
}
}
static bool read_cols_on_row(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++) {
pin_t pin = direct_pins[current_row][col_index];
if (pin != NO_PIN) {
current_matrix[current_row] |= readPin(pin) ? 0 : (ROW_SHIFTER << col_index);
}
}
return (last_row_value != current_matrix[current_row]);
}
#elif (DIODE_DIRECTION == COL2ROW)
static void select_row(uint8_t row) {
setPinOutput(row_pins[row]);
writePinLow(row_pins[row]);
}
static void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); }
static void unselect_rows(void) {
for (uint8_t x = 0; x < ROWS_PER_HAND; x++) {
setPinInputHigh(row_pins[x]);
}
}
static void init_pins(void) {
unselect_rows();
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
setPinInputHigh(col_pins[x]);
}
}
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++) {
// Populate the matrix row with the state of the col pin
current_matrix[current_row] |= readPin(col_pins[col_index]) ? 0 : (ROW_SHIFTER << col_index);
}
// Unselect row
unselect_row(current_row);
return (last_row_value != current_matrix[current_row]);
}
#elif (DIODE_DIRECTION == ROW2COL)
static void select_col(uint8_t col) {
setPinOutput(col_pins[col]);
writePinLow(col_pins[col]);
}
static void unselect_col(uint8_t col) { setPinInputHigh(col_pins[col]); }
static void unselect_cols(void) {
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
setPinInputHigh(col_pins[x]);
}
}
static void init_pins(void) {
unselect_cols();
for (uint8_t x = 0; x < ROWS_PER_HAND; x++) {
setPinInputHigh(row_pins[x]);
}
}
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 (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)) {
matrix_changed = true;
}
}
// Unselect col
unselect_col(current_col);
return matrix_changed;
}
#endif
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
}
thisHand = isLeftHand ? 0 : (ROWS_PER_HAND);
thatHand = ROWS_PER_HAND - thisHand;
// initialize key pins
init_pins();
// initialize matrix state: all keys off
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = 0;
}
debounce_init(ROWS_PER_HAND);
matrix_init_quantum();
}
uint8_t _matrix_scan(void) {
bool changed = false;
#if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW)
// Set row, read cols
for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) {
changed |= read_cols_on_row(raw_matrix, current_row);
}
#elif (DIODE_DIRECTION == ROW2COL)
// Set col, read rows
for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
changed |= read_rows_on_col(raw_matrix, current_col);
}
#endif
debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed);
return 1;
}
uint8_t matrix_scan(void) {
uint8_t ret = _matrix_scan();
if (is_keyboard_master()) {
static uint8_t error_count;
if (!transport_master(matrix + thatHand)) {
error_count++;
if (error_count > ERROR_DISCONNECT_COUNT) {
// reset other half if disconnected
for (int i = 0; i < ROWS_PER_HAND; ++i) {
matrix[thatHand + i] = 0;
}
}
} else {
error_count = 0;
}
matrix_scan_quantum();
} else {
transport_slave(matrix + thisHand);
matrix_slave_scan_user();
}
return ret;
}
-3
View File
@@ -1,3 +0,0 @@
#pragma once
#include <common/matrix.h>
-228
View File
@@ -1,228 +0,0 @@
/* Copyright 2018 Ryota Goto
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "orbit.h"
#include "split_util.h"
#include "transport.h"
// Call led_toggle to set LEDs easily
// LED IDs:
//
// (LEFT) 0 1 2 | 3 4 5 (RIGHT)
void led_toggle(int id, bool on) {
if (isLeftHand) {
switch(id) {
case 0:
// Left hand C6
if (on)
//PORTC |= (1<<6);
writePinHigh(C6);
else
//PORTC &= ~(1<<6);
writePinLow(C6);
break;
case 1:
// Left hand B6
if (on)
//PORTB |= (1<<6);
writePinHigh(B6);
else
//PORTB &= ~(1<<6);
writePinLow(B6);
break;
case 2:
// Left hand B5
if (on)
//PORTB |= (1<<5);
writePinHigh(B5);
else
//PORTB &= ~(1<<5);
writePinLow(B5);
break;
default:
break;
}
} else {
switch(id) {
case 3:
// Right hand F6
if (on)
//PORTF |= (1<<6);
writePinHigh(F6);
else
//PORTF &= ~(1<<6);
writePinLow(F6);
break;
case 4:
// Right hand F7
if (on)
//PORTF |= (1<<7);
writePinHigh(F7);
else
//PORTF &= ~(1<<7);
writePinLow(F7);
break;
case 5:
// Right hand C7
if (on)
//PORTC |= (1<<7);
writePinHigh(C7);
else
//PORTC &= ~(1<<7);
writePinLow(C7);
break;
default:
break;
}
}
}
// Set all LEDs at once using an array of 6 booleans
// LED IDs:
//
// (LEFT) 0 1 2 | 3 4 5 (RIGHT)
//
// Ex. set_all_leds({ false, false, false, true, true, true }) would turn off left hand, turn on right hand
void set_all_leds(bool leds[6]) {
for (int i = 0; i < 6; i++) {
led_toggle(i, leds[i]);
}
}
void set_layer_indicators(uint8_t layer) {
switch (layer)
{
case 0:
led_toggle(0, true);
led_toggle(1, false);
led_toggle(2, false);
break;
case 1:
led_toggle(0, true);
led_toggle(1, true);
led_toggle(2, false);
break;
case 2:
led_toggle(0, true);
led_toggle(1, true);
led_toggle(2, true);
break;
case 3:
led_toggle(0, false);
led_toggle(1, true);
led_toggle(2, true);
break;
case 4:
led_toggle(0, false);
led_toggle(1, false);
led_toggle(2, true);
break;
default:
led_toggle(0, true);
led_toggle(1, false);
led_toggle(2, true);
break;
}
}
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
// Initialize indicator LEDs to output
if (isLeftHand)
{
setPinOutput(C6);
setPinOutput(B6);
setPinOutput(B5);
//DDRC |= (1<<6);
//DDRB |= (1<<6);
//DDRB |= (1<<5);
}
else
{
setPinOutput(F6);
setPinOutput(F7);
setPinOutput(C7);
//DDRF |= (1<<6);
//DDRF |= (1<<7);
//DDRC |= (1<<7);
}
set_layer_indicators(0);
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 (is_keyboard_master()) {
serial_m2s_buffer.nlock_led = IS_LED_ON(usb_led, USB_LED_NUM_LOCK);
serial_m2s_buffer.clock_led = IS_LED_ON(usb_led, USB_LED_CAPS_LOCK);
serial_m2s_buffer.slock_led = IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK);
led_toggle(3, IS_LED_ON(usb_led, USB_LED_NUM_LOCK));
led_toggle(4, IS_LED_ON(usb_led, USB_LED_CAPS_LOCK));
led_toggle(5, IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK));
}
led_set_user(usb_led);
}
uint32_t layer_state_set_kb(uint32_t state) {
if (is_keyboard_master())
{
current_layer = biton32(state);
serial_m2s_buffer.current_layer = biton32(state);
// If left half, do the LED toggle thing
if (isLeftHand)
{
set_layer_indicators(biton32(state));
}
}
// NOTE: Do not set slave LEDs here.
// This is not called on slave
return layer_state_set_user(state);
}
-65
View File
@@ -1,65 +0,0 @@
/* Copyright 2018 Ryota Goto
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ORBIT_H
#define ORBIT_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.
*/
#ifdef USE_I2C
#include <stddef.h>
#ifdef __AVR__
#include <avr/io.h>
#include <avr/interrupt.h>
#endif
#endif
#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, \
L41, L42, L43, L44, L45, L46, R40, R41, R42, R43, R44, R45 \
) \
{ \
{ 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 }, \
{ KC_NO, 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, KC_NO } \
}
uint8_t current_layer;
extern void led_toggle(int id, bool on);
void set_all_leds(bool leds[6]);
extern void set_layer_indicators(uint8_t layer);
#endif
-15
View File
@@ -1,15 +0,0 @@
# Orbit
![Orbit](https://raw.githubusercontent.com/ai03-2725/Orbit/master/Images/PCB-R2.0.jpg)
A split ergonomic keyboard project.
Keyboard Maintainer: [ai03](https://github.com/ai03-2725)
Hardware Supported: The [Orbit PCB](https://github.com/ai03-2725/Orbit)
Hardware Availability: [This repository](https://github.com/ai03-2725/Orbit) has PCB files. Case group buy orders are currently closed.
Make example for this keyboard (after setting up your build environment):
make ai03/orbit: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).
-92
View File
@@ -1,92 +0,0 @@
SRC += split_util.c \
split_flags.c \
serial.c \
transport.c \
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 = 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)
USE_I2C = no # I2C for split communication
CUSTOM_MATRIX = yes # For providing custom matrix.c (in this case, override regular matrix.c with split matrix.c)
# SPLIT_KEYBOARD = yes # Split keyboard flag disabled as manual edits had to be done to the split common files
-546
View File
@@ -1,546 +0,0 @@
/*
* 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
#define F_CPU 16000000
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stddef.h>
#include <stdbool.h>
#include "serial.h"
//#include <pro_micro.h>
#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
#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
#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 (Experimental 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_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 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 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)
-62
View File
@@ -1,62 +0,0 @@
#pragma once
#include <stdbool.h>
// /////////////////////////////////////////////////////////////////
// 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 (using signle-type transaction function)
// /* nothing */
// //// USE flexible API (using multi-type transaction function)
// #define SERIAL_USE_MULTI_TRANSACTION
//
// /////////////////////////////////////////////////////////////////
// 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
-87
View File
@@ -1,87 +0,0 @@
#include "split_util.h"
#include "matrix.h"
#include "keyboard.h"
#include "config.h"
#include "timer.h"
#include "split_flags.h"
#include "transport.h"
#include "quantum.h"
#ifdef EE_HANDS
# include "tmk_core/common/eeprom.h"
# include "eeconfig.h"
#endif
volatile bool isLeftHand = true;
__attribute__((weak))
bool is_keyboard_left(void) {
#ifdef SPLIT_HAND_PIN
// Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand
setPinInput(SPLIT_HAND_PIN);
return readPin(SPLIT_HAND_PIN);
#else
#ifdef EE_HANDS
return eeprom_read_byte(EECONFIG_HANDEDNESS);
#else
#ifdef MASTER_RIGHT
return !is_keyboard_master();
#else
return is_keyboard_master();
#endif
#endif
#endif
}
bool is_keyboard_master(void)
{
#ifdef __AVR__
static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN;
// only check once, as this is called often
if (usbstate == UNKNOWN)
{
USBCON |= (1 << OTGPADE); // enables VBUS pad
wait_us(5);
usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS
}
return (usbstate == MASTER);
#else
return true;
#endif
}
static void keyboard_master_setup(void) {
#if defined(USE_I2C) || defined(EH)
#ifdef SSD1306OLED
matrix_master_OLED_init ();
#endif
#endif
transport_master_init();
// For master the Backlight info needs to be sent on startup
// Otherwise the salve won't start with the proper info until an update
BACKLIT_DIRTY = true;
}
static void keyboard_slave_setup(void)
{
transport_slave_init();
}
// this code runs before the usb and keyboard is initialized
void matrix_setup(void)
{
isLeftHand = is_keyboard_left();
if (is_keyboard_master())
{
keyboard_master_setup();
}
else
{
keyboard_slave_setup();
}
}
-10
View File
@@ -1,10 +0,0 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
extern volatile bool isLeftHand;
void matrix_master_OLED_init (void);
-238
View File
@@ -1,238 +0,0 @@
#include "transport.h"
#include "config.h"
#include "matrix.h"
#include "quantum.h"
#include "orbit.h"
#define ROWS_PER_HAND (MATRIX_ROWS/2)
#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"
#ifndef SLAVE_I2C_ADDRESS
# define SLAVE_I2C_ADDRESS 0x32
#endif
#if (MATRIX_COLS > 8)
# error "Currently only supports 8 COLS"
#endif
// Get rows from other half over i2c
bool transport_master(matrix_row_t matrix[]) {
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[i] = i2c_master_read(I2C_ACK);
}
matrix[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 false;
}
#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 true;
}
void transport_slave(matrix_row_t matrix[]) {
for (int i = 0; i < ROWS_PER_HAND; ++i)
{
i2c_slave_buffer[I2C_KEYMAP_START + i] = matrix[i];
}
// Read Backlight Info
#ifdef BACKLIGHT_ENABLE
if (BACKLIT_DIRTY)
{
backlight_set(i2c_slave_buffer[I2C_BACKLIT_START]);
BACKLIT_DIRTY = false;
}
#endif
#ifdef RGBLIGHT_ENABLE
if (RGB_DIRTY)
{
// Disable interupts (RGB data is big)
cli();
// Create new DWORD for RGB data
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;
// Re-enable interupts now that RGB is set
sei();
}
#endif
}
void transport_master_init(void) {
i2c_master_init();
}
void transport_slave_init(void) {
i2c_slave_init(SLAVE_I2C_ADDRESS);
}
#else // USE_SERIAL
#include "serial.h"
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
}
};
uint8_t slave_layer_cache;
uint8_t slave_nlock_cache;
uint8_t slave_clock_cache;
uint8_t slave_slock_cache;
void transport_master_init(void)
{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); }
void transport_slave_init(void)
{
soft_serial_target_init(transactions, TID_LIMIT(transactions));
slave_layer_cache = 255;
slave_nlock_cache = 255;
slave_clock_cache = 255;
slave_slock_cache = 255;
}
bool transport_master(matrix_row_t matrix[]) {
if (soft_serial_transaction()) {
return false;
}
// TODO: if MATRIX_COLS > 8 change to unpack()
for (int i = 0; i < ROWS_PER_HAND; ++i) {
matrix[i] = serial_s2m_buffer.smatrix[i];
}
#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_m2s_buffer.backlight_level = backlight_config.enable ? backlight_config.level : 0;
#endif
return true;
}
void transport_slave(matrix_row_t matrix[]) {
// TODO: if MATRIX_COLS > 8 change to pack()
for (int i = 0; i < ROWS_PER_HAND; ++i)
{
serial_s2m_buffer.smatrix[i] = matrix[i];
}
#ifdef BACKLIGHT_ENABLE
backlight_set(serial_m2s_buffer.backlight_level);
#endif
#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
// Add serial implementation for RGB here
#endif
if (slave_layer_cache != serial_m2s_buffer.current_layer) {
slave_layer_cache = serial_m2s_buffer.current_layer;
set_layer_indicators(slave_layer_cache);
}
if (slave_nlock_cache != serial_m2s_buffer.nlock_led) {
slave_nlock_cache = serial_m2s_buffer.nlock_led;
led_toggle(3, slave_nlock_cache);
}
if (slave_clock_cache != serial_m2s_buffer.clock_led) {
slave_clock_cache = serial_m2s_buffer.clock_led;
led_toggle(4, slave_clock_cache);
}
if (slave_slock_cache != serial_m2s_buffer.slock_led) {
slave_slock_cache = serial_m2s_buffer.slock_led;
led_toggle(5, slave_slock_cache);
}
}
#endif
-42
View File
@@ -1,42 +0,0 @@
#pragma once
#include <common/matrix.h>
#define ROWS_PER_HAND (MATRIX_ROWS/2)
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;
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
uint8_t current_layer;
uint8_t nlock_led;
uint8_t clock_led;
uint8_t slock_led;
} Serial_m2s_buffer_t;
extern volatile Serial_s2m_buffer_t serial_s2m_buffer;
extern volatile Serial_m2s_buffer_t serial_m2s_buffer;
void transport_master_init(void);
void transport_slave_init(void);
// returns false if valid data not received from slave
bool transport_master(matrix_row_t matrix[]);
void transport_slave(matrix_row_t matrix[]);
+106
View File
@@ -0,0 +1,106 @@
#!/usr/bin/env python
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>, Sebastian Kaim <sebb@sebb767.de>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
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 <firmware.hex>' % 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='')
printDeviceInfo(kb)
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)
+1 -1
View File
@@ -45,4 +45,4 @@ OPT_DEFS = -DDEBUG_LEVEL=0
SRC += i2c_master.c
# programming options
PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex
PROGRAM_CMD = ./keyboards/ps2avrGB/program $(TARGET).hex
@@ -1,21 +0,0 @@
/* Copyright 2018 Jarred Steenvoorden
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
// My hand wire diodes are in the opposite direction to the Atreus62 PCB
#undef DIODE_DIRECTION
#define DIODE_DIRECTION COL2ROW
@@ -1,26 +0,0 @@
/* Copyright 2018 Jarred Steenvoorden
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "jarred.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QW] = LAYOUT_atreus62_grid_wrapper(BLANK_12, QWERTY_1_12, QWERTY_2_12, QWERTY_3_12, QWERTY_L4, KC_NO, KC_NO, QWERTY_R4),
[_LW] = LAYOUT_atreus62_grid_wrapper(BLANK_12, LOWER_1_12 , LOWER_2_12 , LOWER_3_12 , LOWER_L4 , KC_NO, KC_NO, LOWER_R4 ),
[_NV] = LAYOUT_atreus62_grid_wrapper(BLANK_12, NAV_1_12 , NAV_2_12 , NAV_3_12 , NAV_L4 , KC_NO, KC_NO, NAV_R4 ),
[_NP] = LAYOUT_atreus62_grid_wrapper(BLANK_12, NUMPAD_1_12, NUMPAD_2_12, NUMPAD_3_12, NUMPAD_L4, KC_NO, KC_NO, NUMPAD_R4),
[_MS] = LAYOUT_atreus62_grid_wrapper(BLANK_12, MOUSE_1_12 , MOUSE_2_12 , MOUSE_3_12 , MOUSE_L4 , KC_NO, KC_NO, MOUSE_R4 )
};
-43
View File
@@ -1,43 +0,0 @@
/* Copyright 2019
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "bm16a.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);
}
-39
View File
@@ -1,39 +0,0 @@
/* Copyright 2019
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
/* 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_4x4( \
K01, K02, K03, K04, \
K11, K12, K13, K14, \
K21, K22, K23, K24, \
K31, K32, K33, K34 \
) \
{ \
{ K01, K02, K03, K04 }, \
{ K11, K12, K13, K14 }, \
{ K21, K22, K23, K24 }, \
{ K31, K32, K33, K34 } \
}
-246
View File
@@ -1,246 +0,0 @@
/* Copyright 2019
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x424D
#define DEVICE_VER 0x0001
#define MANUFACTURER KPrepublic
#define PRODUCT bm16a
#define DESCRIPTION KPrepublic bm16a
/* key matrix size */
#define MATRIX_ROWS 4
#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 { D3, D5, D1, D2}
#define MATRIX_COL_PINS { D6, D4, D7, B4}
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#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 B6
// #define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 5
#define RGB_DI_PIN E2
#define RGBLED_NUM 4
#define RGBLIGHT_ANIMATIONS
// #ifdef RGB_DI_PIN
// #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 */
#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 */
/* defined by default; to change, uncomment and set to the combination you want */
// #define IS_COMMAND() (get_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_HELP H
//#define MAGIC_KEY_HELP_ALT 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 0
//#define MAGIC_KEY_LAYER0_ALT GRAVE
//#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 B
//#define MAGIC_KEY_BOOTLOADER_ALT ESC
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
//#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
-30
View File
@@ -1,30 +0,0 @@
{
"keyboard_name": "bm16a",
"url": "",
"maintainer": "qmk",
"width": 4,
"height": 4,
"layouts": {
"LAYOUT_ortho_4x4": {
"key_count": 16,
"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}
]
}
}
}
-19
View File
@@ -1,19 +0,0 @@
/* Copyright 2019
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
// place overrides here
-73
View File
@@ -1,73 +0,0 @@
/* Copyright 2019
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layers {
_BASE = 0,
_FN1,
_FN2,
};
// 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] = {
[_BASE] = LAYOUT_ortho_4x4(
KC_PGUP, KC_HOME, KC_UP, KC_END , \
KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, \
MO(_FN2), KC_VOLU, KC_MPLY, KC_MPRV, \
MO(_FN1), KC_VOLD, KC_MUTE, KC_MNXT \
),
[_FN1] = LAYOUT_ortho_4x4(
KC_ESC, KC_P7, KC_P8, KC_P9, \
KC_TAB, KC_P4, KC_P5, KC_P6, \
KC_ENT, KC_P1, KC_P2, KC_P3, \
_______, KC_P0, KC_P0, KC_DOT \
),
[_FN2] = LAYOUT_ortho_4x4(
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \
RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, \
_______, _______, _______, RESET, \
BL_STEP, _______, QMKBEST, QMKURL \
)
};
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;
}
@@ -1 +0,0 @@
# The default keymap for bm16a
-15
View File
@@ -1,15 +0,0 @@
# bm16a
![bm16a](https://ae01.alicdn.com/kf/HTB1RRRQaZfrK1RjSszcq6xGGFXaY.jpg)
A 16 key macropad, with USB C, RGB underglow and backlight.
Keyboard Maintainer: QMK Community
Hardware Supported: The PCBs, controllers supported
Hardware Availability: [KPrepublic](https://kprepublic.com/products/bm16a-16-keys-custom-mechanical-keyboard-pcb-plate-programmed-numpad-layouts-qmk-firmware-with-rgb-bottom-underglow-alps-mx); [AliExpress](https://www.aliexpress.com/store/product/bm16a-16-keys-Custom-Mechanical-Keyboard-PCB-plate-programmed-numpad-layouts-qmk-firmware-with-rgb-bottom/3034003_32970629907.html)
Make example for this keyboard (after setting up your build environment):
make bm16a: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).
-82
View File
@@ -1,82 +0,0 @@
# 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 = 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
# 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
+5 -18
View File
@@ -23,7 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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 CannonKeys
#define MANUFACTURER QMK
#define PRODUCT Satisfaction75
#define DESCRIPTION Satisfaction 75 Keyboard
@@ -76,27 +76,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// 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 0x0F
#define EEPROM_VERSION 0x02
#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*6*16*2)) = (35+768) = 803
// I'm also putting my custom stuff after that
// 1 for enabled encoder modes
// 1 for custom backlighting controls
// 1 for OLED default mode
// 6 for 3x custom encoder settings, left, right, and press (18 total)
#define DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES 803
#define DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT 804
#define DYNAMIC_KEYMAP_DEFAULT_OLED 805
#define DYNAMIC_KEYMAP_CUSTOM_ENCODER 806
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 824
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 200
// Dynamic macro starts after dynamic keymaps (35+(4*6*16*2)) = (35+768)
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 803
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 221
#define DYNAMIC_KEYMAP_MACRO_COUNT 16
@@ -109,7 +109,7 @@ uint8_t i2c_readReg(uint8_t devaddr, uint8_t* regaddr, uint8_t* data, uint16_t l
}
// This is usually not needed. It releases the driver to allow pins to become GPIO again.
uint8_t i2c_stop(void)
uint8_t i2c_stop(uint16_t timeout)
{
i2cStop(&I2C_DRIVER);
return 0;
@@ -1,37 +0,0 @@
/*
Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
const uint16_t 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_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, ENC_PRESS,
KC_TAB, KC_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_ENTER, KC_PGUP,
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_PGDN,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, OLED_TOGG,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CLOCK_SET,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
@@ -1 +0,0 @@
QWIIC_ENABLE = no
@@ -1,19 +0,0 @@
#pragma once
#include "satisfaction75.h"
#define LAYOUT_default( \
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, K113, 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, K315, \
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K413, K415, \
K500, K501, K502, K505, K509, K510, K511, K512, K513, K515 \
) { \
{ K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, KC_NO }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, KC_NO, K115 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, KC_NO, KC_NO, K315 }, \
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, KC_NO, K413, KC_NO, K415 }, \
{ K500, K501, K502, KC_NO, KC_NO, K505, KC_NO, KC_NO, KC_NO, K509, K510, K511, K512, K513, KC_NO, K515 } \
}
@@ -1,108 +0,0 @@
#pragma once
#include "satisfaction75.h"
// This layout is the default - it's what's in VIA
// ANSI, bottom row 1.25/1.25/1.25/6.25/1/1/1
#define LAYOUT_default( \
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, K113, 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, K313, K315, \
K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \
K500, K501, K502, K505, K509, K510, K511, K512, K513, K515 \
) { \
{ K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, KC_NO }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, KC_NO, K115 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO, K315 }, \
{ K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, K415 }, \
{ K500, K501, K502, KC_NO, KC_NO, K505, KC_NO, KC_NO, KC_NO, K509, K510, K511, K512, K513, KC_NO, K515 } \
}
// ISO, bottom row 1.25/1.25/1.25/6.25/1/1/1
#define LAYOUT_iso( \
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, K113, 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, K315, \
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \
K500, K501, K502, K505, K509, K510, K511, K512, K513, K515 \
) { \
{ K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, KC_NO }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, KC_NO, K115 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, KC_NO, K315 }, \
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, K415 }, \
{ K500, K501, K502, KC_NO, KC_NO, K505, KC_NO, KC_NO, KC_NO, K509, K510, K511, K512, K513, KC_NO, K515 } \
}
// ANSI, bottom row 1.25/1.25/1.25/6.25/1.5/1.5
#define LAYOUT_3x2( \
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, K113, 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, K313, K315, \
K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \
K500, K501, K502, K505, K509, K511, K512, K513, K515 \
) { \
{ K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, KC_NO }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, KC_NO, K115 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO, K315 }, \
{ K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, K415 }, \
{ K500, K501, K502, KC_NO, KC_NO, K505, KC_NO, KC_NO, KC_NO, K509, KC_NO, K511, K512, K513, KC_NO, K515 } \
}
// ANSI, WKL bottom row 1.5/1.5/7/1.5/1.5, Split Backspace
#define LAYOUT_2x2( \
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, 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, K313, K315, \
K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \
K500, K501, K505, K509, K511, K512, K513, K515 \
) { \
{ K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, KC_NO }, \
{ 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, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO, K315 }, \
{ K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, K415 }, \
{ K500, K501, KC_NO, KC_NO, KC_NO, K505, KC_NO, KC_NO, KC_NO, K509, KC_NO, K511, K512, K513, KC_NO, K515 } \
}
// ANSI, bottom row 1.25/1.25/1.25/2.25/1.25/2.75/1/1/1
// ANSI, bottom row 1.25/1.25/1.25/2.75/1.25/2.25/1/1/1
#define LAYOUT_split_space( \
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, K113, 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, K313, K315, \
K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \
K500, K501, K502, K503, K505, K507, K509, K510, K511, K512, K513, K515 \
) { \
{ K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, KC_NO }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, KC_NO, K115 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO, K315 }, \
{ K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, K415 }, \
{ K500, K501, K502, K503, KC_NO, K505, KC_NO, K507, KC_NO, K509, K510, K511, K512, K513, KC_NO, K515 } \
}
// Expose All Keys - Split backspace - ISO Extra keys - Split space bottom row
#define LAYOUT_all( \
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, 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, K315, \
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \
K500, K501, K502, K503, K505, K507, K509, K510, K511, K512, K513, K515 \
) { \
{ K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, KC_NO }, \
{ 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, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, KC_NO, K315 }, \
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, K415 }, \
{ K500, K501, K502, K503, KC_NO, K505, KC_NO, K507, KC_NO, K509, K510, K511, K512, K513, KC_NO, K515 } \
}
+1 -1
View File
@@ -54,4 +54,4 @@ QWIIC_ENABLE += MICRO_OLED
# RAW_ENABLE = yes
# DYNAMIC_KEYMAP_ENABLE = yes
DEFAULT_FOLDER = cannonkeys/satisfaction75/rev1
DEFAULT_FOLDER = cannonkeys/satisfaction75
@@ -5,10 +5,9 @@
#include "ch.h"
#include "hal.h"
#ifdef QWIIC_MICRO_OLED_ENABLE
// #ifdef QWIIC_MICRO_OLED_ENABLE
#include "micro_oled.h"
#include "qwiic.h"
#endif
#include "timer.h"
@@ -94,87 +93,21 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
}
case id_get_keyboard_value:
{
switch( command_data[0])
{
case 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;
break;
}
case id_oled_default_mode:
{
uint8_t default_oled = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED);
command_data[1] = default_oled;
break;
}
case id_oled_mode:
{
command_data[1] = oled_mode;
break;
}
case id_encoder_modes:
{
command_data[1] = enabled_encoder_modes;
break;
}
case id_encoder_custom:
{
// uint8_t custom_encoder_idx = command_data[1];
// command_data[2] = 0x00;
// command_data[3] = 0x00;
// command_data[4] = 0x00;
// command_data[5] = 0x00;
// command_data[6] = 0x00;
// command_data[7] = 0x00;
break;
}
default:
{
*command_id = id_unhandled;
break;
}
}
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_set_keyboard_value:
{
switch(command_data[0]){
case id_oled_default_mode:
{
eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED, command_data[1]);
break;
}
case id_oled_mode:
{
oled_mode = command_data[1];
draw_ui();
break;
}
case id_encoder_modes:
{
enabled_encoder_modes = command_data[1];
eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES, enabled_encoder_modes);
break;
}
case id_encoder_custom:
{
// uint8_t custom_encoder_idx = command_data[1];
break;
}
default:
{
*command_id = id_unhandled;
break;
}
}
break;
}
case id_dynamic_keymap_get_keycode:
{
uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] );
@@ -310,11 +243,9 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
queue_for_send = true;
switch (keycode) {
case OLED_TOGG:
if(!clock_set_mode){
if (record->event.pressed) {
oled_mode = (oled_mode + 1) % _NUM_OLED_MODES;
draw_ui();
}
if (record->event.pressed) {
oled_mode = (oled_mode + 1) % _NUM_OLED_MODES;
draw_ui();
}
return false;
case CLOCK_SET:
@@ -394,34 +325,12 @@ void encoder_update_kb(uint8_t index, bool clockwise) {
}
}
void dynamic_keymap_custom_reset(void){
void *p = (void*)(DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT);
void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
while ( p != end ) {
eeprom_update_byte(p, 0);
++p;
}
eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES, 0x1F);
}
void save_backlight_config_to_eeprom(){
eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT, kb_backlight_config.raw);
}
void load_custom_config(){
kb_backlight_config.raw = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT);
#ifdef DYNAMIC_KEYMAP_ENABLE
oled_mode = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED);
enabled_encoder_modes = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES);
#endif
}
void eeprom_init_kb(void)
{
// If the EEPROM has the magic, the data is good.
// OK to load from EEPROM.
if (eeprom_is_valid()) {
load_custom_config();
//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
@@ -432,8 +341,6 @@ void eeprom_init_kb(void)
dynamic_keymap_reset();
// This resets the macros in EEPROM to nothing.
dynamic_keymap_macro_reset();
// Reset the custom stuff
dynamic_keymap_custom_reset();
#endif
// Save the magic number last, in case saving was interrupted
eeprom_set_valid(true);
@@ -460,7 +367,7 @@ void matrix_scan_kb(void) {
queue_for_send = true;
}
}
#ifdef QWIIC_MICRO_OLED_ENABLE
if (queue_for_send && oled_mode != OLED_OFF) {
oled_sleeping = false;
read_host_led_state();
@@ -471,6 +378,5 @@ void matrix_scan_kb(void) {
send_command(DISPLAYOFF); /* 0xAE */
oled_sleeping = true;
}
#endif
}
@@ -2,11 +2,23 @@
#include "quantum.h"
#ifdef KEYBOARD_cannonkeys_satisfaction75_prototype
#include "prototype.h"
#else
#include "rev1.h"
#endif
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
#define LAYOUT_default( \
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, K113, 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, K315, \
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K413, K415, \
K500, K501, K502, K505, K509, K510, K511, K512, K513, K515 \
) { \
{ K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, KC_NO }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, KC_NO, K115 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, KC_NO, KC_NO, K315 }, \
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, KC_NO, K413, KC_NO, K415 }, \
{ K500, K501, K502, KC_NO, KC_NO, K505, KC_NO, KC_NO, KC_NO, K509, K510, K511, K512, K513, KC_NO, K515 } \
}
/* screen off after this many milliseconds */
#define ScreenOffInterval 60000 /* milliseconds */
@@ -27,13 +39,6 @@ enum my_keycodes {
OLED_TOGG
};
enum s75_keyboard_value_id {
id_encoder_modes = 0x80,
id_oled_default_mode,
id_encoder_custom,
id_oled_mode
};
enum encoder_modes {
ENC_MODE_VOLUME,
ENC_MODE_MEDIA,
@@ -109,5 +114,5 @@ void backlight_set(uint8_t level);
bool is_breathing(void);
void breathing_enable(void);
void breathing_disable(void);
void load_custom_config(void);
void save_backlight_config_to_eeprom(void);
// void backlight_save_to_eeprom(uint8_t level);
// uint8_t backlight_config_load();
@@ -10,8 +10,6 @@ void pre_encoder_mode_change(){
// timespec.dstflag = last_timespec.dstflag;
timespec.millisecond = (hour_config * 60 + minute_config) * 60 * 1000;
rtcSetTime(&RTCD1, &timespec);
} else if (encoder_mode == ENC_MODE_BACKLIGHT){
save_backlight_config_to_eeprom();
}
}
@@ -28,9 +26,6 @@ void post_encoder_mode_change(){
void change_encoder_mode(bool negative){
pre_encoder_mode_change();
if(enabled_encoder_modes == 0){
enabled_encoder_modes = 0x1F;
}
do {
if(negative){
if (encoder_mode == 0){
@@ -99,14 +94,12 @@ uint16_t handle_encoder_clockwise(){
mapped_code = KC_WH_D;
break;
case ENC_MODE_BACKLIGHT:
// mapped_code = BL_INC;
kb_backlight_config.level = kb_backlight_config.level + 1;
if(kb_backlight_config.level > BACKLIGHT_LEVELS){
kb_backlight_config.level = BACKLIGHT_LEVELS;
}
backlight_set(kb_backlight_config.level);
if (kb_backlight_config.level != 0){
kb_backlight_config.enable = true;
}
break;
case ENC_MODE_BRIGHTNESS:
mapped_code = KC_BRIGHTNESS_UP;
@@ -138,9 +131,6 @@ uint16_t handle_encoder_ccw(){
kb_backlight_config.level = kb_backlight_config.level - 1;
}
backlight_set(kb_backlight_config.level);
if (kb_backlight_config.level == 0){
kb_backlight_config.enable = false;
}
break;
case ENC_MODE_BRIGHTNESS:
mapped_code = KC_BRIGHTNESS_DOWN;
@@ -3,7 +3,6 @@
__attribute__ ((weak))
void draw_ui() {
#ifdef QWIIC_MICRO_OLED_ENABLE
clear_buffer();
last_flush = timer_read();
send_command(DISPLAYON);
@@ -23,7 +22,6 @@ void draw_ui() {
send_command(DISPLAYOFF);
break;
}
#endif
}
void draw_encoder(int8_t startX, int8_t startY, bool show_legend){
+1 -1
View File
@@ -47,7 +47,7 @@
*
*/
#define MATRIX_ROW_PINS { B0, B1, B2, A15, A10 }
#define MATRIX_COL_PINS { A2, A3, A6, B14, B15, A8, A9, A7, B3, B4, C14, C15, C13, B5, B6 }
#define MATRIX_COL_PINS { A2, A3, A6, B14, B15, A8, A9, A7, B3, B4, C15, C14, C13, B5, B6 }
#define UNUSED_PINS { A0, A1, A9, B7, B8, B9, B10, B11, B12, B13 }
#define DIODE_DIRECTION COL2ROW
+11
View File
@@ -37,6 +37,17 @@
/* 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 IS31FL3235A_COUNT 1
//#define I2C_DRIVER I2CD1
#define I2C1_BANK GPIOB
#define I2C1_SCL 8
#define I2C1_SDA 9
/*
* Feature disable options
* These options are also useful to firmware size reduction.
+1 -1
View File
@@ -76,7 +76,7 @@
* @brief Enables the I2C subsystem.
*/
#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
#define HAL_USE_I2C FALSE
#define HAL_USE_I2C TRUE
#endif
/**
+1 -1
View File
@@ -154,7 +154,7 @@
/*
* I2C driver system settings.
*/
#define STM32_I2C_USE_I2C1 FALSE
#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
+2
View File
@@ -17,6 +17,8 @@ DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
# Build Options
# comment out to disable the options.
#
QWIIC_ENABLE = RGB7SEG
BACKLIGHT_ENABLE = yes
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
@@ -130,6 +130,15 @@
*/
#define BACKLIGHT_LEVELS 10
// For the rgb7seg
#define IS31FL3235A_COUNT 1
/*
#define I2C_DRIVER I2CD2
#define I2C1_BANK GPIOA
#define I2C1_SCL 9
#define I2C1_SDA 10
*/
// 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:
@@ -138,6 +147,9 @@
// 0b1110101 AD <-> SCL
// 0b1110110 AD <-> SDA
#define LED_DRIVER_ADDR_1 0b1110100
/* For the LED driver
*/
#define I2C1_BANK GPIOB
#define I2C1_SCL 8
#define I2C1_SDA 9
+2 -2
View File
@@ -14,7 +14,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "gen1.h"
#include "is31fl3731-simple.h"
void matrix_init_kb(void) {
}
@@ -23,6 +22,8 @@ void matrix_scan_kb(void) {
}
#ifdef LED_MATRIX_ENABLE
#include "is31fl3731-simple.h"
const is31_led g_is31_leds[LED_DRIVER_LED_COUNT] = {
/* Refer to IS31 manual for these locations
* driver
@@ -102,7 +103,6 @@ const is31_led g_is31_leds[LED_DRIVER_LED_COUNT] = {
};
const led_matrix g_leds[LED_DRIVER_LED_COUNT] = {
/*{row | col << 4}
| LED_ROW_COL(row, col)
| | modifier
@@ -155,7 +155,7 @@
* I2C driver system settings.
*/
#define STM32_I2C_USE_I2C1 TRUE
#define STM32_I2C_USE_I2C2 FALSE
#define STM32_I2C_USE_I2C2 TRUE
#define STM32_I2C_BUSY_TIMEOUT 50
#define STM32_I2C_I2C1_IRQ_PRIORITY 10
#define STM32_I2C_I2C2_IRQ_PRIORITY 10
@@ -41,6 +41,9 @@ DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
# LED Configuration
LED_MATRIX_ENABLE = IS31FL3731
# QWIIC Devices
#QWIIC_ENABLE = RGB7SEG
# Build Options
# comment out to disable the options.
#
@@ -28,7 +28,7 @@
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define LAYOUT_all( \
#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
@@ -47,25 +47,6 @@
{ k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
}
#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
k30, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
k40, k41, k42, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
) { \
{ 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, KC_NO, k32, k33, k34, k35, k36, k37 }, \
{ k40, k41, k42, KC_NO, KC_NO, k45, k46, KC_NO }, \
{ k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
{ k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
{ k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
{ k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
{ k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
}
#define LAYOUT_66_ansi( \
k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
-44
View File
@@ -1,44 +0,0 @@
/*
This is the c configuration file for the keymap
Copyright 2012 Jun Wako <wakojun@gmail.com>
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 <http://www.gnu.org/licenses/>.
*/
#pragma once
//#define USE_MATRIX_I2C
/* 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
-182
View File
@@ -1,182 +0,0 @@
#include QMK_KEYBOARD_H
#include "jarred.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
#define LAYOUT_crkbd_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 \
)
#define LAYOUT_crkbd_wrapper(...) LAYOUT(__VA_ARGS__)
#define QWERTY_4_CRKBD KC_LCTL, MO(_LW), KC_SPC, KC_ENT, MO(_LW), KC_RALT
#define BLANK_4_CRKBD KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QW] = LAYOUT_crkbd_wrapper(
QWERTY_1_12,
QWERTY_2_12,
QWERTY_3_12,
QWERTY_4_DOX
),
[_LW] = LAYOUT_crkbd_wrapper(
LOWER_1_12,
LOWER_2_12,
LOWER_3_12,
LOWER_4_DOX
),
[_NV] = LAYOUT_crkbd_wrapper(
NAV_1_12,
NAV_2_12,
NAV_3_12,
NAV_4_DOX
),
[_NP] = LAYOUT_crkbd_wrapper(
NUMPAD_1_12,
NUMPAD_2_12,
NUMPAD_3_12,
NUMPAD_4_DOX
),
[_MS] = LAYOUT_crkbd_wrapper(
MOUSE_1_12,
MOUSE_2_12,
MOUSE_3_12,
MOUSE_4_DOX
)
};
void matrix_init_user(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 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_logo(void);
void set_keylog(uint16_t keycode, keyrecord_t *record);
const char *read_keylog(void);
const char *read_keylogs(void);
char matrix_line_str[24];
const char *read_layer_state(void) {
uint8_t layer = biton32(layer_state);
strcpy(matrix_line_str, "Layer: ");
switch (layer)
{
case _QW:
strcat(matrix_line_str, "Default");
break;
case _LW:
strcat(matrix_line_str, "Lower");
break;
case _NV:
strcat(matrix_line_str, "Navigation");
break;
case _NP:
strcat(matrix_line_str, "Adjust");
break;
case _MS:
strcat(matrix_line_str, "Mouse");
break;
default:
sprintf(matrix_line_str + strlen(matrix_line_str), "Unknown (%d)", layer);
}
return matrix_line_str;
}
const char *read_usb_state(void) {
strcpy(matrix_line_str, "USB : ");
switch (USB_DeviceState) {
case DEVICE_STATE_Unattached:
strcat(matrix_line_str, "Unattached");
break;
case DEVICE_STATE_Suspended:
strcat(matrix_line_str, "Suspended");
break;
case DEVICE_STATE_Configured:
strcat(matrix_line_str, "Connected");
break;
case DEVICE_STATE_Powered:
strcat(matrix_line_str, "Powered");
break;
case DEVICE_STATE_Default:
strcat(matrix_line_str, "Default");
break;
case DEVICE_STATE_Addressed:
strcat(matrix_line_str, "Addressed");
break;
default:
strcat(matrix_line_str, "Invalid");
}
return matrix_line_str;
}
void matrix_scan_user(void) {
iota_gfx_task();
}
void matrix_render_user(struct CharacterMatrix *matrix) {
if (is_master) {
matrix_write_ln(matrix, read_layer_state());
matrix_write_ln(matrix, read_usb_state());
matrix_write_ln(matrix, read_keylogs());
} 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);
}
#endif//SSD1306OLED
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
set_keylog(keycode, record);
}
return true;
}
-9
View File
@@ -1,9 +0,0 @@
# Jarred's CRKBD Layout
Check out [user space readme](../../../../users/jarred/readme.md) for more info
# Build
```
make crkbd:jarred:avrdude
```
-31
View File
@@ -1,31 +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 = 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
# 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/rgb_state_reader.c \
./lib/logo_reader.c \
./lib/keylogger.c \
#./lib/layer_state_reader.c \
# ./lib/mode_icon_reader.c \
# ./lib/host_led_state_reader.c \
# ./lib/timelogger.c \
-16
View File
@@ -1,16 +0,0 @@
![the-frey-layout](https://raw.githubusercontent.com/the-frey/the-frey.github.com/master/assets/images/keyboard-layout.jpg)
# Keyboard layout by the-frey
This is a layout that allows access to all the paren keys easily, has a tab on the lower layer (for SUPER-TAB app switching) and some utility features like PGUP/PGDOWN and HOME/END.
In addition, the arrows are on the lower layer and are bound to the vim keys (h,j,k,l). I've found this a productive layout for programming in emacs and hopefully you will too.
The layout image above shows the keymap, with each key marked with all three layers:
- The top indicates the raise layer
- The middle indicates the default layer
- The bottom indicates the lower layer
All the keys respond as you'd expect to the 'shift' key - i.e. on a UK/GB keyboard, `/` becomes `?` and so on.
-45
View File
@@ -1,45 +0,0 @@
/*
This is the c configuration file for the keymap
Copyright 2012 Jun Wako <wakojun@gmail.com>
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 <http://www.gnu.org/licenses/>.
*/
#pragma once
//#define USE_MATRIX_I2C
#define FORCE_NKRO
/* 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
-244
View File
@@ -1,244 +0,0 @@
#include QMK_KEYBOARD_H
#include "bootloader.h"
#ifdef PROTOCOL_LUFA
#include "lufa.h"
#include "split_util.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.
#define _QWERTY 0
#define _LOWER 3
#define _RAISE 4
#define _ADJUST 16
enum custom_keycodes {
QWERTY = SAFE_RANGE,
LOWER,
RAISE,
ADJUST,
BACKLIT,
RGBRST
};
enum macro_keycodes {
KC_SAMPLEMACRO,
};
#define KC______ KC_TRNS
#define KC_XXXXX KC_NO
#define KC_LOWER LOWER
#define KC_RAISE RAISE
#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_LMOD RGB_MOD
#define KC_CTLTB CTL_T(KC_TAB)
#define KC_GUIEI GUI_T(KC_LANG2)
#define KC_ALTKN ALT_T(KC_LANG1)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_kc( \
//,-----------------------------------------. ,-----------------------------------------.
ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,\
//|------+------+------+------+------+------| |------+------+------+------+------+------|
CTLTB, A, S, D, F, G, H, J, K, L, SCLN, QUOT,\
//|------+------+------+------+------+------| |------+------+------+------+------+------|
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT,\
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
//`--------------------' `--------------------'
),
[_LOWER] = LAYOUT_kc( \
//,-----------------------------------------. ,-----------------------------------------.
TAB, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC,\
//|------+------+------+------+------+------| |------+------+------+------+------+------|
CTLTB, MUTE, VOLD, VOLU, PGUP, PGDN, LEFT, DOWN, UP, RIGHT, HOME, END,\
//|------+------+------+------+------+------| |------+------+------+------+------+------|
LSFT, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, XXXXX,\
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
//`--------------------' `--------------------'
),
[_RAISE] = LAYOUT_kc( \
//,-----------------------------------------. ,-----------------------------------------.
ESC, EXLM, AT, HASH, DLR, PERC, CIRC, AMPR, ASTR, LPRN, RPRN, BSPC,\
//|------+------+------+------+------+------| |------+------+------+------+------+------|
CTLTB, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, MINS, EQL, LCBR, RCBR, PIPE, GRV,\
//|------+------+------+------+------+------| |------+------+------+------+------+------|
LSFT, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, UNDS, PLUS, LBRC, RBRC, BSLS, TILD,\
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
//`--------------------' `--------------------'
),
[_ADJUST] = LAYOUT_kc( \
//,-----------------------------------------. ,-----------------------------------------.
RST, LRST, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
//|------+------+------+------+------+------| |------+------+------+------+------+------|
LTOG, LHUI, LSAI, LVAI, 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 \
//`--------------------' `--------------------'
)
};
int RGB_current_mode;
// 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)) {
layer_on(layer3);
} else {
layer_off(layer3);
}
}
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
// 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_user(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);
}
#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();
}
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_RGB(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
}
return false;
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);
}
return false;
break;
case ADJUST:
if (record->event.pressed) {
layer_on(_ADJUST);
} else {
layer_off(_ADJUST);
}
return false;
break;
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 RGBRST:
#ifdef RGBLIGHT_ENABLE
if (record->event.pressed) {
eeconfig_update_rgblight_default();
rgblight_enable();
RGB_current_mode = rgblight_config.mode;
}
#endif
break;
}
return true;
}
-31
View File
@@ -1,31 +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 = 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
# 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/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 \
+2 -2
View File
@@ -455,10 +455,10 @@ i2c_status_t i2c_transaction(uint8_t address, uint32_t mask, uint8_t col_offset)
matrix[MATRIX_ROWS - 1] |= ((uint32_t)err << (MATRIX_COLS_SCANNED + col_offset)); //add new bits at the end
} else {
i2c_stop();
i2c_stop(10);
return 1;
}
i2c_stop();
i2c_stop(10);
return 0;
}
+2 -1
View File
@@ -22,7 +22,7 @@
#define DEBOUNCE 3
#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 10
#define RGB_MATRIX_SKIP_FRAMES 0
#define RGB_MATRIX_KEYPRESSES
#define DISABLE_RGB_MATRIX_SPLASH
#define DISABLE_RGB_MATRIX_MULTISPLASH
@@ -31,3 +31,4 @@
#define DRIVER_ADDR_2 0b1010000 // this is here for compliancy reasons.
#define DRIVER_COUNT 2
+2 -3
View File
@@ -23,7 +23,7 @@
#define DEBOUNCE 3
#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 10
#define RGB_MATRIX_SKIP_FRAMES 0
#define RGB_MATRIX_KEYPRESSES
#define DISABLE_RGB_MATRIX_SPLASH
#define DISABLE_RGB_MATRIX_MULTISPLASH
@@ -31,5 +31,4 @@
#define DRIVER_ADDR_1 0b1010000
#define DRIVER_ADDR_2 0b1010000 // this is here for compliancy reasons.
#define DRIVER_COUNT 2
#define DRIVER_1_LED_TOTAL 63
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL
@@ -1,6 +1,4 @@
#pragma once
#define dzrgb60_ansi
#undef DRIVER_1_LED_TOTAL
#undef DRIVER_LED_TOTAL
#define DRIVER_1_LED_TOTAL 61
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL
@@ -0,0 +1,3 @@
#pragma once
#define DRIVER_1_LED_TOTAL 63
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL
@@ -10,7 +10,7 @@ extern bool g_suspend_state;
#define _LAYER7 7
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_LAYER0] = LAYOUT( /* 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,\
RESET, RGB_MOD, 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,\
CTL_T(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, RSFT_T(KC_SLSH), KC_UP, LT(2, KC_DEL),\
@@ -60,90 +60,92 @@ void rgb_matrix_indicators_user(void) {
if (!g_suspend_state) {
switch (biton32(layer_state)) {
case _LAYER1:
rgb_matrix_layer_helper(0xFF, 0x00, 0x00, false);
break;
rgb_matrix_layer_helper(0xFF, 0x00, 0x00, false); break;
case _LAYER2:
rgb_matrix_layer_helper(0x00, 0xFF, 0x00, false);
break;
case _LAYER3:
if ( this_led & (1<<USB_LED_NUM_LOCK)) {
rgb_matrix_set_color(13, 0xFF, 0x00, 0x00);
} else {
rgb_matrix_set_color(13, 0x00, 0x00, 0x00);
}
rgb_matrix_set_color(0, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(1, 0x00, 0x00, 0x00);
rgb_matrix_set_color(1, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(2, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(3, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(4, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(5, 0x00, 0x00, 0x00);
rgb_matrix_set_color(6, 0x00, 0x00, 0x00);
rgb_matrix_set_color(7, 0x00, 0x00, 0x00);
rgb_matrix_set_color(8, 0x00, 0x00, 0x00);
rgb_matrix_set_color(9, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(10, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(11, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(12, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(14, 0x00, 0x00, 0xFF);
rgb_matrix_set_color(15, 0x00, 0x00, 0x00);
rgb_matrix_set_color(16, 0x00, 0x00, 0x00);
rgb_matrix_set_color(17, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(18, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(19, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(20, 0x00, 0x00, 0x00);
rgb_matrix_set_color(21, 0x00, 0x00, 0x00);
rgb_matrix_set_color(22, 0x00, 0x00, 0x00);
rgb_matrix_set_color(23, 0x00, 0x00, 0x00);
rgb_matrix_set_color(24, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(25, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(26, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(27, 0x00, 0x00, 0x00);
rgb_matrix_set_color(28, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(29, 0x00, 0x00, 0x00);
rgb_matrix_set_color(30, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(31, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(32, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(33, 0x00, 0x00, 0x00);
rgb_matrix_set_color(34, 0x00, 0x00, 0x00);
rgb_matrix_set_color(35, 0x00, 0x00, 0x00);
rgb_matrix_set_color(36, 0x00, 0x00, 0x00);
rgb_matrix_set_color(37, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(38, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(39, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(40, 0x00, 0x00, 0x00);
rgb_matrix_set_color(41, 0x00, 0x00, 0x00);
rgb_matrix_set_color(42, 0x00, 0x00, 0x00);
rgb_matrix_set_color(43, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(44, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(45, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(46, 0x00, 0x00, 0x00);
rgb_matrix_set_color(47, 0x00, 0x00, 0x00);
rgb_matrix_set_color(48, 0x00, 0x00, 0x00);
rgb_matrix_set_color(49, 0x00, 0x00, 0x00);
rgb_matrix_set_color(50, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(51, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(52, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(53, 0x00, 0x00, 0x00);
rgb_matrix_set_color(54, 0x00, 0x00, 0x00);
rgb_matrix_set_color(55, 0x00, 0x00, 0x00);
rgb_matrix_set_color(56, 0x00, 0x00, 0x00);
rgb_matrix_set_color(57, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(58, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(59, 0xFF, 0x00, 0x00);
rgb_matrix_set_color(60, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(61, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(62, 0x00, 0x00, 0x00);
break;
rgb_matrix_layer_helper(0x00, 0xFF, 0x00, false); break;
case _LAYER4:
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, false);
break;
}
}
if ( this_led & (1<<USB_LED_CAPS_LOCK)) {
rgb_matrix_set_color(40, 0xFF, 0xFF, 0xFF);
}
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, false); break;
}
}
if ( this_led & (1<<USB_LED_CAPS_LOCK)) {
rgb_matrix_set_color(40, 0xFF, 0xFF, 0xFF);
}
switch (biton32(layer_state)) {
case _LAYER3:
if ( this_led & (1<<USB_LED_NUM_LOCK))
{
rgb_matrix_set_color(13, 0xFF, 0x00, 0x00);
}
else
{
rgb_matrix_set_color(13, 0x00, 0x00, 0x00);
}
rgb_matrix_set_color(0, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(1, 0x00, 0x00, 0x00);
rgb_matrix_set_color(1, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(2, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(3, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(4, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(5, 0x00, 0x00, 0x00);
rgb_matrix_set_color(6, 0x00, 0x00, 0x00);
rgb_matrix_set_color(7, 0x00, 0x00, 0x00);
rgb_matrix_set_color(8, 0x00, 0x00, 0x00);
rgb_matrix_set_color(9, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(10, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(11, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(12, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(14, 0x00, 0x00, 0xFF);
rgb_matrix_set_color(15, 0x00, 0x00, 0x00);
rgb_matrix_set_color(16, 0x00, 0x00, 0x00);
rgb_matrix_set_color(17, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(18, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(19, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(20, 0x00, 0x00, 0x00);
rgb_matrix_set_color(21, 0x00, 0x00, 0x00);
rgb_matrix_set_color(22, 0x00, 0x00, 0x00);
rgb_matrix_set_color(23, 0x00, 0x00, 0x00);
rgb_matrix_set_color(24, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(25, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(26, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(27, 0x00, 0x00, 0x00);
rgb_matrix_set_color(28, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(29, 0x00, 0x00, 0x00);
rgb_matrix_set_color(30, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(31, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(32, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(33, 0x00, 0x00, 0x00);
rgb_matrix_set_color(34, 0x00, 0x00, 0x00);
rgb_matrix_set_color(35, 0x00, 0x00, 0x00);
rgb_matrix_set_color(36, 0x00, 0x00, 0x00);
rgb_matrix_set_color(37, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(38, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(39, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(40, 0x00, 0x00, 0x00);
rgb_matrix_set_color(41, 0x00, 0x00, 0x00);
rgb_matrix_set_color(42, 0x00, 0x00, 0x00);
rgb_matrix_set_color(43, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(44, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(45, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(46, 0x00, 0x00, 0x00);
rgb_matrix_set_color(47, 0x00, 0x00, 0x00);
rgb_matrix_set_color(48, 0x00, 0x00, 0x00);
rgb_matrix_set_color(49, 0x00, 0x00, 0x00);
rgb_matrix_set_color(50, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(51, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(52, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(53, 0x00, 0x00, 0x00);
rgb_matrix_set_color(54, 0x00, 0x00, 0x00);
rgb_matrix_set_color(55, 0x00, 0x00, 0x00);
rgb_matrix_set_color(56, 0x00, 0x00, 0x00);
rgb_matrix_set_color(57, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(58, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(59, 0xFF, 0x00, 0x00);
rgb_matrix_set_color(60, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(61, 0xFF, 0xFF, 0x00);
rgb_matrix_set_color(62, 0x00, 0x00, 0x00);
break;
}
}
@@ -1,6 +1,4 @@
#pragma once
#define dzrgb60_hhkb
#undef DRIVER_1_LED_TOTAL
#undef DRIVER_LED_TOTAL
#define DRIVER_1_LED_TOTAL 62
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL
@@ -1,6 +1,4 @@
#pragma once
#define dzrgb60_hhkb_iso
#undef DRIVER_1_LED_TOTAL
#undef DRIVER_LED_TOTAL
#define DRIVER_1_LED_TOTAL 62
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL
@@ -1,6 +1,4 @@
#pragma once
#define dzrgb60_iso
#undef DRIVER_1_LED_TOTAL
#undef DRIVER_LED_TOTAL
#define DRIVER_1_LED_TOTAL 61
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL

Some files were not shown because too many files have changed in this diff Show More