Merge branch 'vfw' into vial
This commit is contained in:
@@ -22,6 +22,10 @@
|
||||
#include "dynamic_keymap.h"
|
||||
#include "via.h" // for default VIA_EEPROM_ADDR_END
|
||||
|
||||
#ifdef VIAL_ENABLE
|
||||
#include "vial.h"
|
||||
#endif
|
||||
|
||||
#ifndef DYNAMIC_KEYMAP_MACRO_COUNT
|
||||
# define DYNAMIC_KEYMAP_MACRO_COUNT 16
|
||||
#endif
|
||||
@@ -90,6 +94,9 @@ void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t c
|
||||
}
|
||||
|
||||
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column) {
|
||||
if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS)
|
||||
return KC_NO;
|
||||
|
||||
void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
|
||||
// Big endian, so we can read/write EEPROM directly from host if we want
|
||||
uint16_t keycode = eeprom_read_byte(address) << 8;
|
||||
@@ -98,6 +105,9 @@ uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column)
|
||||
}
|
||||
|
||||
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode) {
|
||||
if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS)
|
||||
return;
|
||||
|
||||
void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
|
||||
// Big endian, so we can read/write EEPROM directly from host if we want
|
||||
eeprom_update_byte(address, (uint8_t)(keycode >> 8));
|
||||
@@ -183,6 +193,12 @@ extern uint16_t g_vial_magic_keycode_override;
|
||||
|
||||
// This overrides the one in quantum/keymap_common.c
|
||||
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) {
|
||||
#ifdef VIAL_ENABLE
|
||||
/* Disable any keycode processing while unlocking */
|
||||
if (vial_unlock_in_progress)
|
||||
return KC_NO;
|
||||
#endif
|
||||
|
||||
#ifdef VIAL_ENCODERS_ENABLE
|
||||
if (key.row == 254 && key.col == 254)
|
||||
return g_vial_magic_keycode_override;
|
||||
|
||||
@@ -46,6 +46,10 @@ extern backlight_config_t backlight_config;
|
||||
# include "haptic.h"
|
||||
#endif
|
||||
|
||||
#ifdef VIAL_ENABLE
|
||||
# include "vial.h"
|
||||
#endif
|
||||
|
||||
#ifdef AUDIO_ENABLE
|
||||
# ifndef GOODBYE_SONG
|
||||
# define GOODBYE_SONG SONG(GOODBYE_SOUND)
|
||||
@@ -121,6 +125,12 @@ __attribute__((weak)) void post_process_record_kb(uint16_t keycode, keyrecord_t
|
||||
__attribute__((weak)) void post_process_record_user(uint16_t keycode, keyrecord_t *record) {}
|
||||
|
||||
void reset_keyboard(void) {
|
||||
#ifdef VIAL_ENABLE
|
||||
/* Until keyboard is unlocked, disable processing of the RESET keycode */
|
||||
if (!vial_unlocked)
|
||||
return;
|
||||
#endif
|
||||
|
||||
clear_keyboard();
|
||||
#if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
|
||||
process_midi_all_notes_off();
|
||||
|
||||
+26
-2
@@ -218,6 +218,13 @@ __attribute__((weak)) void raw_hid_receive_kb(uint8_t *data, uint8_t length) {
|
||||
void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||
uint8_t *command_id = &(data[0]);
|
||||
uint8_t *command_data = &(data[1]);
|
||||
|
||||
#ifdef VIAL_ENABLE
|
||||
/* When unlock is in progress, only command we react to is unlock_poll */
|
||||
if (vial_unlock_in_progress && (data[0] != id_vial_prefix || data[1] != vial_unlock_poll))
|
||||
goto skip;
|
||||
#endif
|
||||
|
||||
switch (*command_id) {
|
||||
case id_get_protocol_version: {
|
||||
command_data[0] = VIA_PROTOCOL_VERSION >> 8;
|
||||
@@ -243,6 +250,11 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||
break;
|
||||
}
|
||||
case id_switch_matrix_state: {
|
||||
#ifdef VIAL_ENABLE
|
||||
/* We don't need this wannabe keylogger */
|
||||
goto skip;
|
||||
#endif
|
||||
|
||||
#if ((MATRIX_COLS / 8 + 1) * MATRIX_ROWS <= 28)
|
||||
uint8_t i = 1;
|
||||
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
||||
@@ -362,6 +374,11 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||
break;
|
||||
}
|
||||
case id_dynamic_keymap_macro_set_buffer: {
|
||||
#ifdef VIAL_ENABLE
|
||||
/* Until keyboard is unlocked, don't allow changing macros */
|
||||
if (!vial_unlocked)
|
||||
goto skip;
|
||||
#endif
|
||||
uint16_t offset = (command_data[0] << 8) | command_data[1];
|
||||
uint16_t size = command_data[2]; // size <= 28
|
||||
if (size <= 28)
|
||||
@@ -395,6 +412,11 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||
break;
|
||||
}
|
||||
case id_bootloader_jump: {
|
||||
#ifdef VIAL_ENABLE
|
||||
/* Until keyboard is unlocked, don't allow jumping to bootloader */
|
||||
if (!vial_unlocked)
|
||||
goto skip;
|
||||
#endif
|
||||
// Need to send data back before the jump
|
||||
// Informs host that the command is handled
|
||||
raw_hid_send(data, length);
|
||||
@@ -404,7 +426,7 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||
break;
|
||||
}
|
||||
#ifdef VIAL_ENABLE
|
||||
case 0xFE: {
|
||||
case id_vial_prefix: {
|
||||
vial_handle_cmd(data, length);
|
||||
break;
|
||||
}
|
||||
@@ -416,7 +438,9 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef VIAL_ENABLE
|
||||
skip:
|
||||
#endif
|
||||
// Return the same buffer, optionally with values changed
|
||||
// (i.e. returning state to the host, or the unhandled state).
|
||||
raw_hid_send(data, length);
|
||||
|
||||
@@ -78,6 +78,7 @@ enum via_command_id {
|
||||
id_dynamic_keymap_get_layer_count = 0x11,
|
||||
id_dynamic_keymap_get_buffer = 0x12,
|
||||
id_dynamic_keymap_set_buffer = 0x13,
|
||||
id_vial_prefix = 0xFE,
|
||||
id_unhandled = 0xFF,
|
||||
};
|
||||
|
||||
|
||||
+71
-7
@@ -25,13 +25,24 @@
|
||||
|
||||
#include "vial_ensure_keycode.h"
|
||||
|
||||
enum {
|
||||
vial_get_keyboard_id = 0x00,
|
||||
vial_get_size = 0x01,
|
||||
vial_get_def = 0x02,
|
||||
vial_get_encoder = 0x03,
|
||||
vial_set_encoder = 0x04,
|
||||
};
|
||||
#define VIAL_UNLOCK_COUNTER_MAX 50
|
||||
|
||||
#ifdef VIAL_INSECURE
|
||||
#pragma message "Building Vial-enabled firmware in insecure mode."
|
||||
int vial_unlocked = 1;
|
||||
#else
|
||||
int vial_unlocked = 0;
|
||||
#endif
|
||||
int vial_unlock_in_progress = 0;
|
||||
static int vial_unlock_counter = 0;
|
||||
static uint16_t vial_unlock_timer;
|
||||
|
||||
#ifndef VIAL_INSECURE
|
||||
static uint8_t vial_unlock_combo_rows[] = VIAL_UNLOCK_COMBO_ROWS;
|
||||
static uint8_t vial_unlock_combo_cols[] = VIAL_UNLOCK_COMBO_COLS;
|
||||
#define VIAL_UNLOCK_NUM_KEYS (sizeof(vial_unlock_combo_rows)/sizeof(vial_unlock_combo_rows[0]))
|
||||
_Static_assert(VIAL_UNLOCK_NUM_KEYS < 15, "Max 15 unlock keys");
|
||||
#endif
|
||||
|
||||
void vial_handle_cmd(uint8_t *msg, uint8_t length) {
|
||||
/* All packets must be fixed 32 bytes */
|
||||
@@ -89,6 +100,59 @@ void vial_handle_cmd(uint8_t *msg, uint8_t length) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
case vial_get_unlock_status: {
|
||||
/* Reset message to all FF's */
|
||||
memset(msg, 0xFF, length);
|
||||
/* First byte of message contains the status: whether board is unlocked */
|
||||
msg[0] = vial_unlocked;
|
||||
msg[1] = 0;
|
||||
#ifndef VIAL_INSECURE
|
||||
/* Rest of the message are keys in the matrix that should be held to unlock the board */
|
||||
for (size_t i = 0; i < VIAL_UNLOCK_NUM_KEYS; ++i) {
|
||||
msg[2 + i * 2] = vial_unlock_combo_rows[i];
|
||||
msg[2 + i * 2 + 1] = vial_unlock_combo_cols[i];
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case vial_unlock_start: {
|
||||
vial_unlock_in_progress = 1;
|
||||
vial_unlock_counter = VIAL_UNLOCK_COUNTER_MAX;
|
||||
vial_unlock_timer = timer_read();
|
||||
break;
|
||||
}
|
||||
case vial_unlock_poll: {
|
||||
#ifndef VIAL_INSECURE
|
||||
if (vial_unlock_in_progress) {
|
||||
int holding = 1;
|
||||
for (size_t i = 0; i < VIAL_UNLOCK_NUM_KEYS; ++i)
|
||||
holding &= matrix_is_on(vial_unlock_combo_rows[i], vial_unlock_combo_cols[i]);
|
||||
|
||||
if (timer_elapsed(vial_unlock_timer) > 100 && holding) {
|
||||
vial_unlock_timer = timer_read();
|
||||
|
||||
vial_unlock_counter--;
|
||||
if (vial_unlock_counter == 0) {
|
||||
/* ok unlock succeeded */
|
||||
vial_unlock_in_progress = 0;
|
||||
vial_unlocked = 1;
|
||||
}
|
||||
} else {
|
||||
vial_unlock_counter = VIAL_UNLOCK_COUNTER_MAX;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
msg[0] = vial_unlocked;
|
||||
msg[1] = vial_unlock_in_progress;
|
||||
msg[2] = vial_unlock_counter;
|
||||
break;
|
||||
}
|
||||
case vial_lock: {
|
||||
#ifndef VIAL_INSECURE
|
||||
vial_unlocked = 0;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,3 +26,18 @@ void vial_handle_cmd(uint8_t *data, uint8_t length);
|
||||
#ifdef VIAL_ENCODERS_ENABLE
|
||||
void vial_encoder_update(uint8_t index, bool clockwise);
|
||||
#endif
|
||||
|
||||
extern int vial_unlocked;
|
||||
extern int vial_unlock_in_progress;
|
||||
|
||||
enum {
|
||||
vial_get_keyboard_id = 0x00,
|
||||
vial_get_size = 0x01,
|
||||
vial_get_def = 0x02,
|
||||
vial_get_encoder = 0x03,
|
||||
vial_set_encoder = 0x04,
|
||||
vial_get_unlock_status = 0x05,
|
||||
vial_unlock_start = 0x06,
|
||||
vial_unlock_poll = 0x07,
|
||||
vial_lock = 0x08,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user