Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/board/system76/common/include/board/options.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ enum {
OPT_ALLOW_BAT_BOOST,
OPT_ALWAYS_ON_USB,
OPT_GPU_MUX_CTRL,
OPT_KB_PRIVACY,
OPT_KB_PRIVACY_MAX_DELAY_MS,
NUM_OPTIONS
};

Expand Down
32 changes: 29 additions & 3 deletions src/board/system76/common/kbc.c
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
// SPDX-License-Identifier: GPL-3.0-only

#include "include/board/options.h"
#include <arch/delay.h>
#include <arch/time.h>
#include <board/kbc.h>
#include <board/kbscan.h>
#include <board/keymap.h>
#include <common/debug.h>
#include <common/macro.h>
#include <common/rng.h>
#include <ec/espi.h>
#include <ec/ps2.h>

Expand Down Expand Up @@ -80,10 +83,14 @@ static const uint16_t kbc_typematic_period[32] = {
};
// clang-format on

static uint8_t kbc_buffer[16] = { 0 };
static uint8_t kbc_buffer[32] = { 0 };
static uint8_t kbc_buffer_head = 0;
static uint8_t kbc_buffer_tail = 0;

static bool kbc_buffer_privacy = false;
static uint32_t kbc_buffer_privacy_last_time = 0;
static uint16_t kbc_buffer_privacy_delay = 0;

static bool kbc_buffer_pop(uint8_t *scancode) {
if (kbc_buffer_head == kbc_buffer_tail) {
return false;
Expand Down Expand Up @@ -459,8 +466,23 @@ void kbc_event(struct Kbc *kbc) {
uint8_t sts;

// Read from scancode buffer when possible
if (state == KBC_STATE_NORMAL && kbc_buffer_pop(&state_data)) {
state = KBC_STATE_KEYBOARD;
if (state == KBC_STATE_NORMAL) {
if (options_get(OPT_KB_PRIVACY)) {
uint32_t time = time_get();
if (time - kbc_buffer_privacy_last_time >= (uint32_t)kbc_buffer_privacy_delay) {
TRACE("KB_Priv: delay of %d passed\n", kbc_buffer_privacy_delay);
if (kbc_buffer_pop(&state_data)) {
state = KBC_STATE_KEYBOARD;
kbc_buffer_privacy_last_time = time;
kbc_buffer_privacy_delay = (uint16_t)(nondeterministic_rng() %
options_get(OPT_KB_PRIVACY_MAX_DELAY_MS));
}
}
} else {
if (kbc_buffer_pop(&state_data)) {
state = KBC_STATE_KEYBOARD;
}
}
}

// Read from touchpad when possible
Expand Down Expand Up @@ -521,3 +543,7 @@ void kbc_event(struct Kbc *kbc) {
kbc_on_output_empty(kbc);
}
}

void kbc_toggle_delay_randomization() {
options_set(OPT_KB_PRIVACY, options_get(OPT_KB_PRIVACY) ^ 1);
}
9 changes: 9 additions & 0 deletions src/board/system76/common/kbscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <board/power.h>
#include <common/macro.h>
#include <common/debug.h>
#include <common/rng.h>

// Default to not n-key rollover
#ifndef KM_NKEY
Expand Down Expand Up @@ -202,6 +203,13 @@ bool kbscan_press(uint16_t key, bool pressed, uint8_t *layer) {
pmc_swi();
}

if (key == K_KB_PRIVACY && pressed) {
DEBUG("Toggling keyboard privacy\n");
rng_seed(time_get());
kbc_toggle_delay_randomization();
return true;
}

if (key == K_FNLOCK && pressed) {
DEBUG("Toggling FnLock\n");
keymap_fnlock ^= 1;
Expand Down Expand Up @@ -316,6 +324,7 @@ static inline bool key_should_repeat(uint16_t key) {
case K_CAMERA_TOGGLE:
case K_DISPLAY_TOGGLE:
case K_FAN_TOGGLE:
case K_KB_PRIVACY:
case K_KBD_BKL:
case K_KBD_COLOR:
case K_KBD_TOGGLE:
Expand Down
2 changes: 2 additions & 0 deletions src/board/system76/common/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ uint8_t DEFAULT_OPTIONS[NUM_OPTIONS] = {
[OPT_ALLOW_BAT_BOOST] = 0,
[OPT_ALWAYS_ON_USB] = 0,
[OPT_GPU_MUX_CTRL] = 0,
[OPT_KB_PRIVACY] = 0,
[OPT_KB_PRIVACY_MAX_DELAY_MS] = 100,
};
// clang-format on

Expand Down
1 change: 1 addition & 0 deletions src/common/common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
common-y += i2c.c
common-y += keymap.c
common-y += version.c
common-y += rng.c
1 change: 1 addition & 0 deletions src/common/include/common/keymap.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,5 +284,6 @@ uint16_t keymap_translate(uint16_t key);

#define KF_CUSTOM (0x0200)
#define K_FNLOCK (KF_CUSTOM | 0x01)
#define K_KB_PRIVACY (KF_CUSTOM | 0x02)

#endif // _COMMON_KEYMAP_H
12 changes: 12 additions & 0 deletions src/common/include/common/rng.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// SPDX-License-Identifier: GPL-3.0-only

#ifndef _COMMON_RNG_H
#define _COMMON_RNG_H

#include <stdint.h>

void rng_seed(uint16_t seed);
uint16_t simple_rng(void);
uint16_t nondeterministic_rng(void);

#endif
36 changes: 36 additions & 0 deletions src/common/rng.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// SPDX-License-Identifier: GPL-3.0-only
//
#include <common/rng.h>
#include <arch/time.h>

#define LFSR_MASK 0xB400u

static uint16_t simple_rng_reg = -1U;
static uint16_t nondeterministic_rng_reg = -1U;

void rng_seed(uint16_t seed) {
// 0 is invalid state, the generator locks up on 0
uint16_t s = seed ? seed : -1U;
simple_rng_reg = s;
nondeterministic_rng_reg = s;
}

uint16_t _galois_fsr(uint16_t lfsr) {
uint16_t bit = lfsr & 1U;
lfsr >>= 1U;
if (bit) {
lfsr ^= LFSR_MASK;
}
return lfsr;
}

uint16_t simple_rng(void) {
simple_rng_reg = _galois_fsr(simple_rng_reg);
return simple_rng_reg;
}

uint16_t nondeterministic_rng(void) {
nondeterministic_rng_reg += (uint16_t)(time_get());
nondeterministic_rng_reg = _galois_fsr(nondeterministic_rng_reg);
return nondeterministic_rng_reg;
}
2 changes: 1 addition & 1 deletion src/ec/ite/include/ec/kbc.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ uint8_t kbc_status(struct Kbc *kbc);
uint8_t kbc_read(struct Kbc *kbc);
bool kbc_keyboard(struct Kbc *kbc, uint8_t data, uint16_t timeout);
bool kbc_mouse(struct Kbc *kbc, uint8_t data, uint16_t timeout);

void kbc_toggle_delay_randomization();
volatile uint8_t __xdata __at(0x1300) KBHICR;
volatile uint8_t __xdata __at(0x1302) KBIRQR;
volatile uint8_t __xdata __at(0x1304) KBHISR;
Expand Down
4 changes: 2 additions & 2 deletions src/keyboard/system76/14in_83/keymap/combo_iso_ansi.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ LAYOUT_ISO(
),
LAYOUT_ISO(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_PRINT_SCREEN, K_PAUSE, K_NUM_LOCK, K_SCROLL_LOCK,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_4, K_5, K_6, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_ASTERISK, K_MINUS, K_EQUALS, K_BKSP,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_MIC_MUTE, K_5, K_6, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_ASTERISK, K_MINUS, K_EQUALS, K_BKSP,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_NUM_4, K_NUM_5, K_NUM_6, K_NUM_SLASH, K_BRACE_OPEN, K_BRACE_CLOSE, K_ENTER,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_BACKSLASH,
K_FNLOCK, K_A, K_KB_PRIVACY, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_BACKSLASH,
K_LEFT_SHIFT, K_INT_1, K_Z, K_X, K_C, K_V, K_B, K_N, K_NUM_0, K_COMMA, K_NUM_PERIOD, K_NUM_PLUS, K_RIGHT_SHIFT,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_HOME, K_UP, K_END,
K_LEFT, K_DOWN, K_RIGHT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ LAYOUT_ISO(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_PRINT_SCREEN, K_PAUSE, K_NUM_LOCK, K_SCROLL_LOCK,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_MIC_MUTE, K_5, K_6, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_ASTERISK, K_MINUS, K_EQUALS, K_BKSP,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_NUM_4, K_NUM_5, K_NUM_6, K_NUM_SLASH, K_BRACE_OPEN, K_BRACE_CLOSE, K_ENTER,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_BACKSLASH,
K_FNLOCK, K_A, K_KB_PRIVACY, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_BACKSLASH,
K_LEFT_SHIFT, K_INT_1, K_Z, K_X, K_C, K_V, K_B, K_N, K_NUM_0, K_COMMA, K_NUM_PERIOD, K_NUM_PLUS, K_RIGHT_SHIFT,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_HOME, K_UP, K_END,
K_LEFT, K_DOWN, K_RIGHT
Expand Down
2 changes: 1 addition & 1 deletion src/keyboard/system76/15in_102/keymap/default.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ LAYOUT(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_F4, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_PRINT_SCREEN, K_SCROLL_LOCK, K_DEL, K_HOME, K_END, K_PAUSE, K_PAUSE,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_KBD_COLOR, K_KBD_TOGGLE, K_KBD_DOWN,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, K_KBD_UP,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6,
K_FNLOCK, K_A, K_KB_PRIVACY, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6,
K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_N, K_M, K_COMMA, K_PERIOD, K_SLASH, K_RIGHT_SHIFT, K_UP, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_ENTER,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT, K_NUM_0, K_NUM_PERIOD
)
Expand Down
Loading