diff --git a/common_features.mk b/common_features.mk index a76c522bfc..f5fce5441c 100644 --- a/common_features.mk +++ b/common_features.mk @@ -124,7 +124,7 @@ endif ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) OPT_DEFS += -DRGB_MATRIX_ENABLE SRC += is31fl3731.c - SRC += twi2c.c + I2C_ENABLE = yes SRC += $(QUANTUM_DIR)/color.c SRC += $(QUANTUM_DIR)/rgb_matrix.c CIE1931_CURVE = yes @@ -205,7 +205,7 @@ ifeq ($(strip $(USB_HID_ENABLE)), yes) endif ifeq ($(strip $(I2C_SLAVE_ENABLE)), yes) - SRC += twi2c.c + I2C_ENABLE = yes OPT_DEFS += -DI2C_SLAVE_ENABLE endif @@ -214,6 +214,14 @@ ifeq ($(strip $(ENCODER_ENABLE)), yes) SRC += $(QUANTUM_DIR)/encoder.c endif +ifeq ($(strip $(QWIIC_KEYBOARD_ENABLE)), yes) + SRC += qwiic/qwiic_keyboard.c + OPT_DEFS += -DQWIIC_KEYBOARD_ENABLE +endif + +ifeq ($(strip $(I2C_ENABLE)), yes) + SRC += twi2c.c +endif QUANTUM_SRC:= \ $(QUANTUM_DIR)/quantum.c \ diff --git a/drivers/arm/twi2c.c b/drivers/arm/twi2c.c index 53af437bc2..973a822430 100644 --- a/drivers/arm/twi2c.c +++ b/drivers/arm/twi2c.c @@ -20,10 +20,6 @@ #include "chprintf.h" #include "memstreams.h" #include "printf.h" -#include "matrix.h" - -#ifdef I2C_SLAVE_ENABLE - #include "hal_i2cslave.h" /** @@ -40,9 +36,8 @@ // 400000 // }; -I2CSlaveMsgCB twi2c_slave_message_process, catchError, clearAfterSend; - -#endif +I2CSlaveMsgCB twi2c_incoming_message_process, twi2c_catch_error, twi2c_clear_after_send; +twi2c_message_received twi2c_message_received_callback; static uint8_t twi2c_address; @@ -54,62 +49,6 @@ static const I2CConfig i2cconfig = { 0 }; -char initialReplyBody[50] = "Initial reply"; // 'Status' response if read without preceding write - - -uint32_t messageCounter = 0; /* Counts number of messages received to return as part of response */ - -uint8_t rxBody[2]; /* stores last message master sent us (intentionally a few bytes smaller than txBody) */ -uint8_t txBody[MATRIX_ROWS/2]; /* Return message buffer for computed replies */ - -BaseSequentialStream *chp = NULL; // Used for serial logging - - -#ifdef I2C_SLAVE_ENABLE - -// Handler when something sent to us -const I2CSlaveMsg echoRx = -{ - sizeof(rxBody), /* max sizeof received msg body */ - rxBody, /* body of received msg */ - NULL, /* do nothing on address match */ - twi2c_slave_message_process, /* Routine to process received messages */ - catchError /* Error hook */ -}; - - -// // 'Empty' reply when nothing to say, and no message received. In RAM, to allow update -I2CSlaveMsg initialReply = -{ - sizeof(initialReplyBody), /* trailing zero byte will be repeated as needed */ - (uint8_t *)initialReplyBody, - NULL, /* do nothing on address match */ - NULL, /* do nothing after reply sent */ - catchError /* Error hook */ -}; - -// // 'Empty' reply when nothing to say, and no message received. In RAM, to allow update -// I2CSlaveMsg initialReply = -// { -// 0, /* trailing zero byte will be repeated as needed */ -// NULL, -// NULL, /* do nothing on address match */ -// NULL, /* do nothing after reply sent */ -// catchError /* Error hook */ -// }; - - -// Response to received messages -I2CSlaveMsg echoReply = { /* this is in RAM so size may be updated */ - MATRIX_ROWS / 2, /* filled in with the length of the message to send */ - txBody, /* Response message */ - NULL, /* do nothing special on address match */ - clearAfterSend, /* Clear receive buffer once replied */ - catchError /* Error hook */ -}; - - - /** * Track I2C errors */ @@ -123,95 +62,26 @@ void noteI2cError(uint32_t flags) gotI2cError = 1; } - - /** * Generic error handler * * Called in interrupt context, so need to watch what we do */ -void catchError(I2CDriver *i2cp) +void twi2c_catch_error(I2CDriver *i2cp) { noteI2cError(i2cp->errors); } -extern void matrix_copy(matrix_row_t * copy); - -const char hexString[16] = "0123456789abcdef"; - - - -/** - * Message processor - looks at received message, determines reply as quickly as possible - * - * Responds with the value of the messageCounter (in hex), followed by the received message in [..] - * - * Note: Called in interrupt context, so need to be quick! - */ -void twi2c_slave_message_process(I2CDriver *i2cp) { - - // size_t len = i2cSlaveBytes(i2cp); // Number of bytes received - - // memset(txBody, 0, MATRIX_ROWS / 2 * sizeof(matrix_row_t)); - matrix_copy(txBody); - - echoReply.size = MATRIX_ROWS / 2; - i2cSlaveReplyI(i2cp, &echoReply); -} - - /** * Callback after sending of response complete - restores default reply in case polled */ -void clearAfterSend(I2CDriver *i2cp) +void twi2c_clear_after_send(I2CDriver *i2cp) { // echoReply.size = 0; // Clear receive message // i2cSlaveReplyI(i2cp, &initialReply); } - -/** - * Start the I2C Slave port to accept comms from master CPU - * - * We then go into a loop checking for errors, and never return - */ - -void twi2c_slave_init(void) { - - twi2c_init(); - - - i2cStart(&I2C_DRIVER, &i2cconfig); -#if HAL_USE_I2C_SLAVE - I2C_DRIVER.slaveTimeout = MS2ST(100); // Time for complete message -#endif - - // i2cSlaveConfigure(&I2C_DRIVER, &echoRx, &initialReply); - - memset(txBody, 0, MATRIX_ROWS / 2 * sizeof(matrix_row_t)); - - i2cSlaveConfigure(&I2C_DRIVER, &echoRx, &echoReply); - - // Enable match address after everything else set up - i2cMatchAddress(&I2C_DRIVER, slaveI2Caddress/2); -// i2cMatchAddress(&I2C_DRIVER, myOtherI2Caddress/2); - // i2cMatchAddress(&I2C_DRIVER, 0); /* "all call" */ - - printf("Slave I2C started\n\r"); - -} - -void twi2c_slave_task(void) { - if (gotI2cError) { - gotI2cError = 0; - printf("I2cError: %04x\r\n", lastI2cErrorFlags); - } -} - -#endif - -uint8_t twi2c_start(uint8_t address) { - twi2c_address = address; +uint8_t twi2c_start(void) { i2cStart(&I2C_DRIVER, &i2cconfig); return 0; } @@ -233,8 +103,66 @@ uint8_t twi2c_write(uint8_t data) { return i2cMasterTransmitTimeout(&I2C_DRIVER, twi2c_address/2, &data, 1, 0, 0, MS2ST(100)); } -uint8_t twi2c_transmit(uint8_t address, uint8_t* data, uint16_t length) { - twi2c_address = address; - i2cStart(&I2C_DRIVER, &i2cconfig); - return i2cMasterTransmitTimeout(&I2C_DRIVER, twi2c_address/2, data, length, 0, 0, MS2ST(100)); +uint8_t twi2c_transmit(uint8_t address, uint8_t * data, uint16_t length) { + return i2cMasterTransmitTimeout(&I2C_DRIVER, address/2, data, length, 0, 0, MS2ST(100)); +} + +uint8_t twi2c_receive(uint8_t address, uint8_t * data, uint16_t length) { + return i2cMasterReceiveTimeout(&I2C_DRIVER, address/2, data, length, MS2ST(100)); +} + + +uint8_t twi2c_incoming_body[50]; +uint8_t twi2c_outgoing_body[1024]; + +// Response to received messages +I2CSlaveMsg twi2c_incoming_message = { + sizeof(twi2c_incoming_body), + twi2c_incoming_body, + NULL, + twi2c_incoming_message_process, + twi2c_catch_error /* Error hook */ +}; + +void twi2c_incoming_message_process(I2CDriver * i2cp) { + size_t len = i2cSlaveBytes(i2cp); + (*twi2c_message_received_callback)(i2cp, twi2c_incoming_body, len); +} + +// Response to received messages +I2CSlaveMsg twi2c_outgoing_message = { + sizeof(twi2c_outgoing_body), + twi2c_outgoing_body, + NULL, + twi2c_clear_after_send, + twi2c_catch_error +}; + +uint8_t twi2c_reply(I2CDriver * i2cp, uint8_t * data, uint16_t length) { + memcpy(twi2c_outgoing_body, data, length); + twi2c_outgoing_message.size = length; + i2cSlaveReplyI(i2cp, &twi2c_outgoing_message); + return 0; +} + +uint8_t twi2c_transmit_receive(uint8_t address, uint8_t * tx_body, uint16_t tx_length, uint8_t * rx_body, uint16_t rx_length) { + return i2cMasterTransmitTimeout(&I2C_DRIVER, address/2, tx_body, tx_length, rx_body, rx_length, MS2ST(100)); +} + +uint8_t twi2c_start_listening(uint8_t address, twi2c_message_received callback) { + twi2c_message_received_callback = callback; + I2C_DRIVER.slaveTimeout = MS2ST(100); + i2cSlaveConfigure(&I2C_DRIVER, &twi2c_incoming_message, &twi2c_outgoing_message); + i2cMatchAddress(&I2C_DRIVER, address/2); + return 0; +} + +uint8_t twi2c_restart_listening(uint8_t address) { + i2cMatchAddress(&I2C_DRIVER, address/2); + return 0; +} + +void twi2c_stop(void) { + i2cUnmatchAll(&I2C_DRIVER); + i2cStop(&I2C_DRIVER); } diff --git a/drivers/arm/twi2c.h b/drivers/arm/twi2c.h index 57cc54070e..daa55fb2d1 100644 --- a/drivers/arm/twi2c.h +++ b/drivers/arm/twi2c.h @@ -14,6 +14,9 @@ * along with this program. If not, see . */ +#ifndef TWI2C_H +#define TWI2C_H + #include "ch.h" #include "hal.h" @@ -23,17 +26,11 @@ #define slaveI2Caddress 0x30 /* Address in our terms - halved by later code */ //#define myOtherI2Caddress 0x19 - -#ifdef I2C_SLAVE_ENABLE - -I2CSlaveMsgCB twi2c_slave_message_process, catchError, clearAfterSend; - -void twi2c_slave_init(void); - -#endif +I2CSlaveMsgCB twi2c_incoming_message_process, twi2c_catch_error, twi2c_clear_after_send; +typedef void (*twi2c_message_received)(I2CDriver *, uint8_t *, uint16_t); void twi2c_init(void); -uint8_t twi2c_start(uint8_t address); +uint8_t twi2c_start(void); uint8_t twi2c_write(uint8_t data); uint8_t twi2c_read_ack(void); uint8_t twi2c_read_nack(void); @@ -42,3 +39,10 @@ uint8_t twi2c_receive(uint8_t address, uint8_t* data, uint16_t length); uint8_t twi2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length); uint8_t twi2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length); void twi2c_stop(void); + +uint8_t twi2c_reply(I2CDriver * i2cp, uint8_t * data, uint16_t length); +uint8_t twi2c_transmit_receive(uint8_t address, uint8_t * tx_body, uint16_t tx_length, uint8_t * rx_body, uint16_t rx_length); +uint8_t twi2c_start_listening(uint8_t address, twi2c_message_received callback); +uint8_t twi2c_restart_listening(uint8_t address); + +#endif diff --git a/drivers/qwiic/qwiic_keyboard.c b/drivers/qwiic/qwiic_keyboard.c new file mode 100644 index 0000000000..088c70f848 --- /dev/null +++ b/drivers/qwiic/qwiic_keyboard.c @@ -0,0 +1,199 @@ +/* Copyright 2018 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "qwiic_keyboard.h" +#include "keymap.h" +#include "matrix.h" +#include "keyboard.h" +#include "twi2c.h" +#include +#include "usb_main.h" +#include "usb_driver.h" + +#define QWIIC_KEYBOARD_LAYERS 16 +#define QWIIC_KEYBOARD_ROWS 8 +#define QWIIC_KEYBOARD_COLS 8 + +#define qwiic_matrix_t uint8_t + +#define QWIIC_KEYBOARD_HANDSHAKE_ADDRESS 0b01010100 +#define QWIIC_KEYBOARD_LISTENING_ADDRESS_START 0b01010110 +#define QWIIC_KEYBOARD_HANDSHAKE_MESSAGE_SIZE (QWIIC_KEYBOARD_LAYERS * QWIIC_KEYBOARD_ROWS * QWIIC_KEYBOARD_COLS) +#define QWIIC_KEYBOARD_MATRIX_MESSAGE_SIZE MATRIX_ROWS + +void qwiic_keyboard_write_keymap(uint8_t * pointer); +void qwiic_keyboard_read_keymap(uint8_t * pointer); + +bool qwiic_keyboard_master = false; +bool qwiic_keyboard_connected = false; +uint8_t qwiic_keyboard_handshake_message[QWIIC_KEYBOARD_HANDSHAKE_MESSAGE_SIZE] = {0}; +uint8_t qwiic_keyboard_matrix_message[QWIIC_KEYBOARD_ROWS] = {0}; +twi2c_message_received qwiic_keyboard_message_received_ptr = qwiic_keyboard_message_received; + +uint16_t qwiic_keyboard_keymap[QWIIC_KEYBOARD_LAYERS][QWIIC_KEYBOARD_ROWS][QWIIC_KEYBOARD_COLS] = {0}; +uint8_t qwiic_keyboard_listening_address = QWIIC_KEYBOARD_LISTENING_ADDRESS_START; +uint8_t qwiic_keyboard_processing_slave = false; + +void qwiic_keyboard_init(void) { + twi2c_init(); + twi2c_start(); + twi2c_start_listening(QWIIC_KEYBOARD_HANDSHAKE_ADDRESS, qwiic_keyboard_message_received_ptr); +} + +void qwiic_keyboard_set_master(void) { + twi2c_stop(); + twi2c_start(); + qwiic_keyboard_master = true; +} + +uint8_t command[1] = { 0x00 }; + +void qwiic_keyboard_task(void) { + if (USB_DRIVER.state == USB_ACTIVE) + qwiic_keyboard_master = true; + else + qwiic_keyboard_master = false; + if (qwiic_keyboard_master) { + if (qwiic_keyboard_connected) { + // send empty message, expecting matrix info + if (MSG_OK == twi2c_transmit_receive(qwiic_keyboard_listening_address, + command, 1, + qwiic_keyboard_matrix_message, QWIIC_KEYBOARD_MATRIX_MESSAGE_SIZE + )) { + // majority of this is pulled from keyboard.c:keyboard_task() + static qwiic_matrix_t matrix_prev[QWIIC_KEYBOARD_ROWS]; + qwiic_matrix_t matrix_row = 0; + qwiic_matrix_t matrix_change = 0; + qwiic_keyboard_processing_slave = true; + for (uint8_t r = 0; r < QWIIC_KEYBOARD_ROWS; r++) { + matrix_row = qwiic_keyboard_matrix_message[r]; + matrix_change = matrix_row ^ matrix_prev[r]; + if (matrix_change) { + for (uint8_t c = 0; c < QWIIC_KEYBOARD_COLS; c++) { + if (matrix_change & ((qwiic_matrix_t)1<= QMK_KEYS_PER_SCAN) + #endif + // process a key per task call + //goto MATRIX_LOOP_END; + } + } + } + } + // call with pseudo tick event when no real key event. + #ifdef QMK_KEYS_PER_SCAN + // we can get here with some keys processed now. + if (!keys_processed) + #endif + action_exec(TICK); + //MATRIX_LOOP_END: + qwiic_keyboard_processing_slave = false; + } else { + // disconnect + // qwiic_keyboard_connected = false; + } + } else { // if not connected + // send new address to listen on, expect back keymap + if (MSG_OK == twi2c_transmit_receive(QWIIC_KEYBOARD_HANDSHAKE_ADDRESS, + &qwiic_keyboard_listening_address, 1, + qwiic_keyboard_handshake_message, QWIIC_KEYBOARD_HANDSHAKE_MESSAGE_SIZE + )) { + qwiic_keyboard_connected = true; + // load keymap into memory + qwiic_keyboard_read_keymap(qwiic_keyboard_handshake_message); + } + } + } +} + +float song_one_up[][2] = SONG(ONE_UP_SOUND); +bool first_message = true; + +void qwiic_keyboard_message_received(I2CDriver *i2cp, uint8_t * body, uint16_t size) { + if (qwiic_keyboard_connected) { + for (uint8_t row = 0; row < QWIIC_KEYBOARD_ROWS; row++) { + if (row < MATRIX_ROWS) { + qwiic_keyboard_matrix_message[row] = matrix_get_row(row); + } else { + qwiic_keyboard_matrix_message[row] = 0; + } + } + twi2c_reply(i2cp, qwiic_keyboard_matrix_message, QWIIC_KEYBOARD_MATRIX_MESSAGE_SIZE); + if (first_message) { + PLAY_SONG(song_one_up); + first_message = false; + } + } else { + qwiic_keyboard_connected = true; + qwiic_keyboard_master = false; + qwiic_keyboard_listening_address = body[0]; + twi2c_restart_listening(qwiic_keyboard_listening_address); + qwiic_keyboard_write_keymap(qwiic_keyboard_handshake_message); + twi2c_reply(i2cp, qwiic_keyboard_handshake_message, QWIIC_KEYBOARD_HANDSHAKE_MESSAGE_SIZE); + } +} + +// qwiic_keyboard_message_received_ptr = qwiic_keyboard_message_received; + +__attribute__((optimize("O0"))) +void qwiic_keyboard_write_keymap(uint8_t * pointer) { + for (uint8_t layer = 0; layer < QWIIC_KEYBOARD_LAYERS; layer++) { + for (uint8_t row = 0; row < QWIIC_KEYBOARD_ROWS; row++) { + for (uint8_t col = 0; col < QWIIC_KEYBOARD_COLS; col++) { + uint16_t keycode = pgm_read_word(&keymaps[layer][row][col]); + *pointer++ = (keycode >> 8); + *pointer++ = (keycode & 0xFF); + } + } + } +} + +void qwiic_keyboard_read_keymap(uint8_t * pointer) { + for (uint8_t layer = 0; layer < QWIIC_KEYBOARD_LAYERS; layer++) { + for (uint8_t row = 0; row < QWIIC_KEYBOARD_ROWS; row++) { + for (uint8_t col = 0; col < QWIIC_KEYBOARD_COLS; col++) { + uint16_t keycode = *pointer++; + keycode |= ((*pointer++) << 8); + qwiic_keyboard_keymap[layer][row][col] = keycode; + } + } + } +} + +// overwrite the built-in function - slaves don't need to process keycodes +bool is_keyboard_master(void) { + return qwiic_keyboard_master; +} + +// overwrite the built-in function +uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { + if (qwiic_keyboard_processing_slave) { + // trick the built-in handling to accept our replacement keymap + //return qwiic_keyboard_keymap[(layer)][(key.row)][(key.col)]; + return KC_A; + } else { + // Read entire word (16bits) + return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); + } +} diff --git a/drivers/qwiic/qwiic_keyboard.h b/drivers/qwiic/qwiic_keyboard.h new file mode 100644 index 0000000000..813a02bb9e --- /dev/null +++ b/drivers/qwiic/qwiic_keyboard.h @@ -0,0 +1,26 @@ +/* Copyright 2018 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef QWIIC_KEYBOARD_H +#define QWIIC_KEYBOARD_H + +#include "quantum.h" + +void qwiic_keyboard_init(void); +void qwiic_keyboard_task(void); +void qwiic_keyboard_message_received(I2CDriver *i2cp, uint8_t * body, uint16_t size); + +#endif diff --git a/keyboards/_qmk_handwire/keymaps/default/readme.md b/keyboards/_qmk_handwire/keymaps/default/readme.md deleted file mode 100644 index 32d4bfba61..0000000000 --- a/keyboards/_qmk_handwire/keymaps/default/readme.md +++ /dev/null @@ -1 +0,0 @@ -# The default keymap for clueboard 60% diff --git a/keyboards/muon_light/config.h b/keyboards/muon_light/config.h index b4c7b6051b..b8df031a4a 100644 --- a/keyboards/muon_light/config.h +++ b/keyboards/muon_light/config.h @@ -149,4 +149,6 @@ along with this program. If not, see . #define DRIVER_2_LED_TOTAL 24 #define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL +#define NO_USB_STARTUP_CHECK + #endif diff --git a/keyboards/muon_light/halconf.h b/keyboards/muon_light/halconf.h index c3e0cbb728..2e8eed14f4 100644 --- a/keyboards/muon_light/halconf.h +++ b/keyboards/muon_light/halconf.h @@ -79,6 +79,13 @@ #define HAL_USE_I2C TRUE #endif +/** + * @brief Enables the I2C Slave subsystem. + */ +#if !defined(HAL_USE_I2C_SLAVE) || defined(__DOXYGEN__) +#define HAL_USE_I2C_SLAVE TRUE +#endif + /** * @brief Enables the I2S subsystem. */ diff --git a/keyboards/muon_light/muon_light.c b/keyboards/muon_light/muon_light.c index 1896a40c0d..9b6cbb824c 100644 --- a/keyboards/muon_light/muon_light.c +++ b/keyboards/muon_light/muon_light.c @@ -28,13 +28,13 @@ void matrix_scan_kb(void) { matrix_scan_user(); } -void suspend_power_down_kb(void) { - rgb_matrix_set_suspend_state(true); -} +// void suspend_power_down_kb(void) { +// rgb_matrix_set_suspend_state(true); +// } -void suspend_wakeup_init_kb(void) { - rgb_matrix_set_suspend_state(false); -} +// void suspend_wakeup_init_kb(void) { +// rgb_matrix_set_suspend_state(false); +// } const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_ortho_4x6( 18, 19, 20, 21, 22, 23, @@ -43,73 +43,73 @@ const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_ortho_4x6( 0, 1, 2, 3, 4, 5 ); -const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { -/* Refer to IS31 manual for these locations - * driver - * | R location - * | | G location - * | | | B location - * | | | | */ - {0, C1_3, C2_3, C3_3}, - {0, C1_4, C2_4, C3_4}, - {0, C1_5, C2_5, C3_5}, - {0, C1_11, C2_11, C3_11}, - {0, C1_12, C2_12, C3_12}, - {0, C1_13, C2_13, C3_13}, - - {0, C1_6, C2_6, C3_6}, - {0, C1_7, C2_7, C3_7}, - {0, C1_8, C2_8, C3_8}, - {0, C1_14, C2_14, C3_14}, - {0, C1_15, C2_15, C3_15}, - {0, C1_16, C2_16, C3_16}, - - {0, C9_1, C8_1, C7_1}, - {0, C9_2, C8_2, C7_2}, - {0, C9_3, C8_3, C7_3}, - {0, C9_9, C8_9, C7_9}, - {0, C9_10, C8_10, C7_10}, - {0, C9_11, C8_11, C7_11}, - - {0, C9_4, C8_4, C7_4}, - {0, C9_5, C8_5, C7_5}, - {0, C9_6, C8_6, C7_6}, - {0, C9_12, C8_12, C7_12}, - {0, C9_13, C8_13, C7_13}, - {0, C9_14, C8_14, C7_14} -}; - -const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { - - /*{row | col << 4} - | {x=0..224, y=0..64} - | | modifier - | | | */ - {{0|(0<<4)}, {20.36*0, 21.33*0}, 1}, - {{0|(1<<4)}, {20.36*1, 21.33*0}, 0}, - {{0|(2<<4)}, {20.36*2, 21.33*0}, 0}, - {{0|(3<<4)}, {20.36*3, 21.33*0}, 0}, - {{0|(4<<4)}, {20.36*4, 21.33*0}, 0}, - {{0|(5<<4)}, {20.36*5, 21.33*0}, 0}, - - {{1|(0<<4)}, {20.36*0, 21.33*1}, 1}, - {{1|(1<<4)}, {20.36*1, 21.33*1}, 0}, - {{1|(2<<4)}, {20.36*2, 21.33*1}, 0}, - {{1|(3<<4)}, {20.36*3, 21.33*1}, 0}, - {{1|(4<<4)}, {20.36*4, 21.33*1}, 0}, - {{1|(5<<4)}, {20.36*5, 21.33*1}, 0}, - - {{2|(0<<4)}, {20.36*0, 21.33*2}, 1}, - {{2|(1<<4)}, {20.36*1, 21.33*2}, 0}, - {{2|(2<<4)}, {20.36*2, 21.33*2}, 0}, - {{2|(3<<4)}, {20.36*3, 21.33*2}, 0}, - {{2|(4<<4)}, {20.36*4, 21.33*2}, 0}, - {{2|(5<<4)}, {20.36*5, 21.33*2}, 0}, - - {{3|(0<<4)}, {20.36*0, 21.33*3}, 1}, - {{3|(1<<4)}, {20.36*1, 21.33*3}, 1}, - {{3|(2<<4)}, {20.36*2, 21.33*3}, 1}, - {{3|(3<<4)}, {20.36*3, 21.33*3}, 1}, - {{3|(4<<4)}, {20.36*4, 21.33*3}, 1}, - {{3|(5<<4)}, {20.36*5, 21.33*3}, 0} -}; +// const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { +// /* Refer to IS31 manual for these locations +// * driver +// * | R location +// * | | G location +// * | | | B location +// * | | | | */ +// {0, C1_3, C2_3, C3_3}, +// {0, C1_4, C2_4, C3_4}, +// {0, C1_5, C2_5, C3_5}, +// {0, C1_11, C2_11, C3_11}, +// {0, C1_12, C2_12, C3_12}, +// {0, C1_13, C2_13, C3_13}, + +// {0, C1_6, C2_6, C3_6}, +// {0, C1_7, C2_7, C3_7}, +// {0, C1_8, C2_8, C3_8}, +// {0, C1_14, C2_14, C3_14}, +// {0, C1_15, C2_15, C3_15}, +// {0, C1_16, C2_16, C3_16}, + +// {0, C9_1, C8_1, C7_1}, +// {0, C9_2, C8_2, C7_2}, +// {0, C9_3, C8_3, C7_3}, +// {0, C9_9, C8_9, C7_9}, +// {0, C9_10, C8_10, C7_10}, +// {0, C9_11, C8_11, C7_11}, + +// {0, C9_4, C8_4, C7_4}, +// {0, C9_5, C8_5, C7_5}, +// {0, C9_6, C8_6, C7_6}, +// {0, C9_12, C8_12, C7_12}, +// {0, C9_13, C8_13, C7_13}, +// {0, C9_14, C8_14, C7_14} +// }; + +// const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { + +// {row | col << 4} +// | {x=0..224, y=0..64} +// | | modifier +// | | | +// {{0|(0<<4)}, {20.36*0, 21.33*0}, 1}, +// {{0|(1<<4)}, {20.36*1, 21.33*0}, 0}, +// {{0|(2<<4)}, {20.36*2, 21.33*0}, 0}, +// {{0|(3<<4)}, {20.36*3, 21.33*0}, 0}, +// {{0|(4<<4)}, {20.36*4, 21.33*0}, 0}, +// {{0|(5<<4)}, {20.36*5, 21.33*0}, 0}, + +// {{1|(0<<4)}, {20.36*0, 21.33*1}, 1}, +// {{1|(1<<4)}, {20.36*1, 21.33*1}, 0}, +// {{1|(2<<4)}, {20.36*2, 21.33*1}, 0}, +// {{1|(3<<4)}, {20.36*3, 21.33*1}, 0}, +// {{1|(4<<4)}, {20.36*4, 21.33*1}, 0}, +// {{1|(5<<4)}, {20.36*5, 21.33*1}, 0}, + +// {{2|(0<<4)}, {20.36*0, 21.33*2}, 1}, +// {{2|(1<<4)}, {20.36*1, 21.33*2}, 0}, +// {{2|(2<<4)}, {20.36*2, 21.33*2}, 0}, +// {{2|(3<<4)}, {20.36*3, 21.33*2}, 0}, +// {{2|(4<<4)}, {20.36*4, 21.33*2}, 0}, +// {{2|(5<<4)}, {20.36*5, 21.33*2}, 0}, + +// {{3|(0<<4)}, {20.36*0, 21.33*3}, 1}, +// {{3|(1<<4)}, {20.36*1, 21.33*3}, 1}, +// {{3|(2<<4)}, {20.36*2, 21.33*3}, 1}, +// {{3|(3<<4)}, {20.36*3, 21.33*3}, 1}, +// {{3|(4<<4)}, {20.36*4, 21.33*3}, 1}, +// {{3|(5<<4)}, {20.36*5, 21.33*3}, 0} +// }; diff --git a/keyboards/muon_light/rules.mk b/keyboards/muon_light/rules.mk index 7047f6566e..4cca7a3b0c 100644 --- a/keyboards/muon_light/rules.mk +++ b/keyboards/muon_light/rules.mk @@ -51,12 +51,13 @@ COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # USB Nkey Rollover CUSTOM_MATRIX = yes # Custom matrix file AUDIO_ENABLE = yes -RGB_MATRIX_ENABLE = yes -ENCODER_ENABLE = yes +# RGB_MATRIX_ENABLE = yes +# ENCODER_ENABLE = yes # SERIAL_LINK_ENABLE = yes +I2C_SLAVE_ENABLE = yes +QWIIC_KEYBOARD_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend LAYOUTS = ortho_4x6 -LAYOUTS_HAS_RGB = no diff --git a/keyboards/_qmk_handwire/boards/GENERIC_STM32_F303XC/board.c b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c similarity index 100% rename from keyboards/_qmk_handwire/boards/GENERIC_STM32_F303XC/board.c rename to keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c diff --git a/keyboards/_qmk_handwire/boards/GENERIC_STM32_F303XC/board.h b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h similarity index 100% rename from keyboards/_qmk_handwire/boards/GENERIC_STM32_F303XC/board.h rename to keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h diff --git a/keyboards/_qmk_handwire/boards/GENERIC_STM32_F303XC/board.mk b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk similarity index 100% rename from keyboards/_qmk_handwire/boards/GENERIC_STM32_F303XC/board.mk rename to keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk diff --git a/keyboards/_qmk_handwire/bootloader_defs.h b/keyboards/proton_c/bootloader_defs.h similarity index 100% rename from keyboards/_qmk_handwire/bootloader_defs.h rename to keyboards/proton_c/bootloader_defs.h diff --git a/keyboards/_qmk_handwire/chconf.h b/keyboards/proton_c/chconf.h similarity index 100% rename from keyboards/_qmk_handwire/chconf.h rename to keyboards/proton_c/chconf.h diff --git a/keyboards/_qmk_handwire/config.h b/keyboards/proton_c/config.h similarity index 98% rename from keyboards/_qmk_handwire/config.h rename to keyboards/proton_c/config.h index fe0ad1d5c4..ad14553bed 100644 --- a/keyboards/_qmk_handwire/config.h +++ b/keyboards/proton_c/config.h @@ -23,8 +23,8 @@ #define PRODUCT_ID 0x1770 #define DEVICE_VER 0x0001 #define MANUFACTURER QMK -#define PRODUCT Handwire -#define DESCRIPTION "Handwire protoboard" +#define PRODUCT Proton C +#define DESCRIPTION "Proton C protoboard" /* key matrix size */ #define MATRIX_ROWS 12 diff --git a/keyboards/_qmk_handwire/halconf.h b/keyboards/proton_c/halconf.h similarity index 100% rename from keyboards/_qmk_handwire/halconf.h rename to keyboards/proton_c/halconf.h diff --git a/keyboards/_qmk_handwire/keymaps/default/keymap.c b/keyboards/proton_c/keymaps/default/keymap.c similarity index 99% rename from keyboards/_qmk_handwire/keymaps/default/keymap.c rename to keyboards/proton_c/keymaps/default/keymap.c index 168be875c2..ee2b13e588 100644 --- a/keyboards/_qmk_handwire/keymaps/default/keymap.c +++ b/keyboards/proton_c/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -#include "_qmk_handwire.h" +#include QMK_KEYBOARD_H #define _______ KC_TRNS diff --git a/keyboards/proton_c/keymaps/default/readme.md b/keyboards/proton_c/keymaps/default/readme.md new file mode 100644 index 0000000000..3aec70f621 --- /dev/null +++ b/keyboards/proton_c/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for the Proton C diff --git a/keyboards/_qmk_handwire/led.c b/keyboards/proton_c/led.c similarity index 100% rename from keyboards/_qmk_handwire/led.c rename to keyboards/proton_c/led.c diff --git a/keyboards/_qmk_handwire/matrix.c b/keyboards/proton_c/matrix.c similarity index 100% rename from keyboards/_qmk_handwire/matrix.c rename to keyboards/proton_c/matrix.c diff --git a/keyboards/_qmk_handwire/mcuconf.h b/keyboards/proton_c/mcuconf.h similarity index 100% rename from keyboards/_qmk_handwire/mcuconf.h rename to keyboards/proton_c/mcuconf.h diff --git a/keyboards/_qmk_handwire/_qmk_handwire.c b/keyboards/proton_c/proton_c.c similarity index 96% rename from keyboards/_qmk_handwire/_qmk_handwire.c rename to keyboards/proton_c/proton_c.c index a7f460b1a9..33ba31a080 100644 --- a/keyboards/_qmk_handwire/_qmk_handwire.c +++ b/keyboards/proton_c/proton_c.c @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "_qmk_handwire.h" +#include "proton_c.h" void matrix_init_kb(void) { diff --git a/keyboards/_qmk_handwire/_qmk_handwire.h b/keyboards/proton_c/proton_c.h similarity index 93% rename from keyboards/_qmk_handwire/_qmk_handwire.h rename to keyboards/proton_c/proton_c.h index f482861f9a..d3d1049c6d 100644 --- a/keyboards/_qmk_handwire/_qmk_handwire.h +++ b/keyboards/proton_c/proton_c.h @@ -14,15 +14,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef QMK_HANDWIRE_H -#define QMK_HANDWIRE_H +#ifndef PROTON_C_H +#define PROTON_C_H #include "quantum.h" /* - * These are shortcuts to help you work with the various layout options. If your + * These are shortcuts to help you work with the various layout options. If your * keymap works with one of the LAYOUT_...() macros you are encouraged to use that - * and to contribute your keymap to the corresponding layout in + * and to contribute your keymap to the corresponding layout in * `qmk_firmware/layouts/community`. */ @@ -56,4 +56,4 @@ { k50, k51, k52, 0, 0, 0, 0 } \ } -#endif \ No newline at end of file +#endif diff --git a/keyboards/_qmk_handwire/readme.md b/keyboards/proton_c/readme.md similarity index 83% rename from keyboards/_qmk_handwire/readme.md rename to keyboards/proton_c/readme.md index d74c3aa52d..e133cd9e0f 100644 --- a/keyboards/_qmk_handwire/readme.md +++ b/keyboards/proton_c/readme.md @@ -1,14 +1,14 @@ -# QMK Handwire +# Proton C An Arm-based handwire board. * Keyboard Maintainer: [Jack Humbert](https://github.com/jackhumbert) -* Hardware Supported: QMK Handwire +* Hardware Supported: QMK Proton C * rev1 (1.0) * Hardware Availability: [qmk.fm](https://qmk.fm/) Make example for this keyboard (after setting up your build environment): - make _qmk_handwire:default + make proton_c:default See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/_qmk_handwire/rules.mk b/keyboards/proton_c/rules.mk similarity index 100% rename from keyboards/_qmk_handwire/rules.mk rename to keyboards/proton_c/rules.mk diff --git a/lib/chibios b/lib/chibios index 587968d6cb..c846437e39 160000 --- a/lib/chibios +++ b/lib/chibios @@ -1 +1 @@ -Subproject commit 587968d6cbc2b0e1c7147540872f2a67e59ca18b +Subproject commit c846437e39423ef9394aecd3a96393db24c51ebf diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 4eff764e2d..07f6c6eb33 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -69,6 +69,9 @@ along with this program. If not, see . #ifdef MIDI_ENABLE # include "process_midi.h" #endif +#ifdef QWIIC_KEYBOARD_ENABLE +# include "qwiic/qwiic_keyboard.h" +#endif #ifdef MATRIX_HAS_GHOST extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; @@ -181,11 +184,14 @@ void keyboard_init(void) { #if defined(NKRO_ENABLE) && defined(FORCE_NKRO) keymap_config.nkro = 1; #endif +#ifdef QWIIC_KEYBOARD_ENABLE + qwiic_keyboard_init(); +#endif } /** \brief Keyboard task: Do keyboard routine jobs * - * Do routine keyboard jobs: + * Do routine keyboard jobs: * * * scan matrix * * handle mouse movements @@ -291,6 +297,10 @@ MATRIX_LOOP_END: midi_task(); #endif +#ifdef QWIIC_KEYBOARD_ENABLE + qwiic_keyboard_task(); +#endif + // update LED if (led_status != host_keyboard_leds()) { led_status = host_keyboard_leds();