[Keymap] Add BB8520 trackpad support for CrKbd (#5925)
* Add vlukash CrKbd keymap to support trackpad adapter. The trackpad adapter uses Elite-C board that has five extra pins. Also SPI pins are taken for trackpad, keymap config updates column data pins for matrix scan. * Update vlukash keymap * Enable pointing devide, configure mouse BTN1 * Set TAPPING_TERM to 300 * Add support for the BlackBerry 8520 trackpad * Add vlukash keymap for master-right no-trackpad version * Remap backspace * Set EXTRAKEY_ENABLE = yes * Update thumb keys mappings * Set bootloader to atmel-dfu * Sync keymap * Add scrolling support * Make debug LEDS conditional * Add support for both flex and no-flex PCBs * Add readme and rename root folders * Update readme file with blog link * Fix readme file formatting * Remove ADJUST keycode, code cleanup. * Add Win key to the keymap.master
parent
2558466d78
commit
b92387b749
|
@ -0,0 +1,21 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* Select hand configuration */
|
||||||
|
|
||||||
|
#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
|
|
@ -0,0 +1,227 @@
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
#include "bootloader.h"
|
||||||
|
#ifdef PROTOCOL_LUFA
|
||||||
|
#include "lufa.h"
|
||||||
|
#include "split_util.h"
|
||||||
|
#endif
|
||||||
|
#ifdef SSD1306OLED
|
||||||
|
#include "ssd1306.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
//Following line allows macro to read current RGB settings
|
||||||
|
extern rgblight_config_t rgblight_config;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern uint8_t is_master;
|
||||||
|
|
||||||
|
enum layer_names {
|
||||||
|
_QWERTY,
|
||||||
|
_LOWER,
|
||||||
|
_RAISE,
|
||||||
|
_ADJUST
|
||||||
|
};
|
||||||
|
|
||||||
|
enum custom_keycodes {
|
||||||
|
QWERTY = SAFE_RANGE,
|
||||||
|
LOWER,
|
||||||
|
RAISE,
|
||||||
|
RGBRST,
|
||||||
|
MBTN1,
|
||||||
|
SCRL
|
||||||
|
};
|
||||||
|
|
||||||
|
#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_CTLA CTL_T(KC_A)
|
||||||
|
#define KC_CTLSC CTL_T(KC_SCLN)
|
||||||
|
#define KC_SFTZ SFT_T(KC_Z)
|
||||||
|
#define KC_SFTSL SFT_T(KC_SLSH)
|
||||||
|
#define KC_WINX LWIN_T(KC_X)
|
||||||
|
#define KC_WINDO RWIN_T(KC_DOT)
|
||||||
|
|
||||||
|
#define KC_MBTN1 MBTN1
|
||||||
|
#define KC_SCRL SCRL
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[_QWERTY] = LAYOUT_kc(
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
TAB, CTLA, S, D, F, G, H, J, K, L, CTLSC, QUOT,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
GRAVE, SFTZ, WINX, C, V, B, N, M, COMM, WINDO, SFTSL,BSLASH,
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
LOWER, SPC, SCRL, MBTN1, ENT, RAISE
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
),
|
||||||
|
|
||||||
|
[_LOWER] = LAYOUT_kc(
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
ESC, XXXXX, PGDN, PSCR, PGUP, LBRC, RBRC, 7, 8, 9, XXXXX, XXXXX,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
XXXXX, LCTRL, PLUS, MINS, EQL, LPRN, RPRN, 4, 5, 6, RCTRL, XXXXX,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
XXXXX, LSFT, HOME, XXXXX, END, LCBR, RCBR, 1, 2, 3, RSFT, XXXXX,
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
LOWER, SPC, SCRL, MBTN1, ENT, 0
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
),
|
||||||
|
|
||||||
|
[_RAISE] = LAYOUT_kc(
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
ESC, XXXXX, F7, F8, F9, F10, BTN2, BTN2, MNXT, MPRV, MPLY, MSTP,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
XXXXX, LCTRL, F4, F5, F6, F11, LEFT, DOWN, UP, RIGHT, RCTRL, XXXXX,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
XXXXX, LSFT, F1, F2, F3, F12, XXXXX, XXXXX, VOLU, VOLD, MUTE, RSFT,
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
LOWER, SPC, SCRL, MBTN1, ENT, RAISE
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
),
|
||||||
|
|
||||||
|
[_ADJUST] = LAYOUT_kc(
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
RST, LRST, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, RST,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
LOWER, SPC, SCRL, MBTN1, ENT, RAISE
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
int RGB_current_mode;
|
||||||
|
|
||||||
|
void persistent_default_layer_set(uint16_t default_layer) {
|
||||||
|
eeconfig_update_default_layer(default_layer);
|
||||||
|
default_layer_set(default_layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setting ADJUST layer RGB back to default
|
||||||
|
void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
|
||||||
|
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
|
||||||
|
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);
|
||||||
|
|
||||||
|
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());
|
||||||
|
} 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
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
case QWERTY:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
persistent_default_layer_set(1UL<<_QWERTY);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
# CrKbd with the Trackpad support
|
||||||
|
|
||||||
|
CrKbd version that supports BlackBerry 8520 trackpad via additional PCB.
|
||||||
|
See this repository for more details:
|
||||||
|
- https://github.com/vlukash/corne-trackpad
|
||||||
|
- https://vlukash.com/2019/01/15/trackpad-in-keycap-corne-crkbd-keyboard
|
||||||
|
|
||||||
|
This firmware is for the Left keyboard.
|
||||||
|
|
||||||
|
# Build
|
||||||
|
|
||||||
|
```
|
||||||
|
make crkbd:vlukash_trackpad_left:dfu
|
||||||
|
```
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Build Options
|
||||||
|
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
||||||
|
|
||||||
|
BOOTLOADER = atmel-dfu
|
||||||
|
|
||||||
|
# If you want to change the display of OLED, you need to change here
|
||||||
|
SRC += ./lib/glcdfont.c \
|
||||||
|
./lib/rgb_state_reader.c \
|
||||||
|
./lib/layer_state_reader.c \
|
||||||
|
./lib/logo_reader.c \
|
||||||
|
./lib/keylogger.c \
|
|
@ -0,0 +1,35 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define NO_DEBUG_LEDS
|
||||||
|
|
||||||
|
// Connector PCB version
|
||||||
|
// 1 - PCB that supports flex caple and the trackpad sensor is mounted on an 'H' keycap
|
||||||
|
// - https://github.com/vlukash/corne-trackpad/tree/master/connector
|
||||||
|
// 2 - PCB woth no flex option, track sensor mounted directly on the PCB
|
||||||
|
// - https://github.com/vlukash/corne-trackpad/tree/master/connector-no-flex
|
||||||
|
#define TRACKPAD_CONNECTOR_VER 1
|
||||||
|
|
||||||
|
/* Select hand configuration */
|
||||||
|
#define MASTER_RIGHT
|
||||||
|
|
||||||
|
#define USE_SERIAL_PD2
|
||||||
|
|
||||||
|
#define TAPPING_FORCE_HOLD
|
||||||
|
#define TAPPING_TERM 300
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
// Rows are doubled-up
|
||||||
|
#undef MATRIX_COL_PINS
|
||||||
|
#define MATRIX_COL_PINS { F4, F5, F6, F7, B7, D5 }
|
||||||
|
|
||||||
|
/* ws2812 RGB LED */
|
||||||
|
#undef RGB_DI_PIN
|
||||||
|
#define RGB_DI_PIN B5
|
|
@ -0,0 +1,199 @@
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
#include "bootloader.h"
|
||||||
|
#include "mousekey.h"
|
||||||
|
#include "pointing_device.h"
|
||||||
|
#include "report.h"
|
||||||
|
|
||||||
|
#ifdef PROTOCOL_LUFA
|
||||||
|
#include "lufa.h"
|
||||||
|
#include "split_util.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern bool isScrollMode;
|
||||||
|
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
//Following line allows macro to read current RGB settings
|
||||||
|
extern rgblight_config_t rgblight_config;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern uint8_t is_master;
|
||||||
|
|
||||||
|
enum layer_names {
|
||||||
|
_QWERTY,
|
||||||
|
_LOWER,
|
||||||
|
_RAISE,
|
||||||
|
_ADJUST
|
||||||
|
};
|
||||||
|
|
||||||
|
enum custom_keycodes {
|
||||||
|
QWERTY = SAFE_RANGE,
|
||||||
|
LOWER,
|
||||||
|
RAISE,
|
||||||
|
RGBRST,
|
||||||
|
MBTN1,
|
||||||
|
SCRL
|
||||||
|
};
|
||||||
|
|
||||||
|
#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_CTLA CTL_T(KC_A)
|
||||||
|
#define KC_CTLSC CTL_T(KC_SCLN)
|
||||||
|
#define KC_SFTZ SFT_T(KC_Z)
|
||||||
|
#define KC_SFTSL SFT_T(KC_SLSH)
|
||||||
|
#define KC_WINX LWIN_T(KC_X)
|
||||||
|
#define KC_WINDO RWIN_T(KC_DOT)
|
||||||
|
|
||||||
|
#define KC_MBTN1 MBTN1
|
||||||
|
#define KC_SCRL SCRL
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[_QWERTY] = LAYOUT_kc(
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
TAB, CTLA, S, D, F, G, H, J, K, L, CTLSC, QUOT,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
GRAVE, SFTZ, WINX, C, V, B, N, M, COMM, WINDO, SFTSL,BSLASH,
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
LOWER, SPC, SCRL, MBTN1, ENT, RAISE
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
),
|
||||||
|
|
||||||
|
[_LOWER] = LAYOUT_kc(
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
ESC, XXXXX, PGDN, PSCR, PGUP, LBRC, RBRC, 7, 8, 9, XXXXX, XXXXX,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
XXXXX, LCTRL, PLUS, MINS, EQL, LPRN, RPRN, 4, 5, 6, RCTRL, XXXXX,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
XXXXX, LSFT, HOME, XXXXX, END, LCBR, RCBR, 1, 2, 3, RSFT, XXXXX,
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
LOWER, SPC, SCRL, MBTN1, ENT, 0
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
),
|
||||||
|
|
||||||
|
[_RAISE] = LAYOUT_kc(
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
ESC, XXXXX, F7, F8, F9, F10, BTN2, BTN2, MNXT, MPRV, MPLY, MSTP,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
XXXXX, LCTRL, F4, F5, F6, F11, LEFT, DOWN, UP, RIGHT, RCTRL, XXXXX,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
XXXXX, LSFT, F1, F2, F3, F12, XXXXX, XXXXX, VOLU, VOLD, MUTE, RSFT,
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
LOWER, SPC, SCRL, MBTN1, ENT, RAISE
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
),
|
||||||
|
|
||||||
|
[_ADJUST] = LAYOUT_kc(
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
RST, LRST, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, RST,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
LOWER, SPC, SCRL, MBTN1, ENT, RAISE
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
int RGB_current_mode;
|
||||||
|
|
||||||
|
void persistent_default_layer_set(uint16_t default_layer) {
|
||||||
|
eeconfig_update_default_layer(default_layer);
|
||||||
|
default_layer_set(default_layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setting ADJUST layer RGB back to default
|
||||||
|
void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
|
||||||
|
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
|
||||||
|
layer_on(layer3);
|
||||||
|
} else {
|
||||||
|
layer_off(layer3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
RGB_current_mode = rgblight_config.mode;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
report_mouse_t currentReport = {};
|
||||||
|
switch (keycode) {
|
||||||
|
case QWERTY:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
persistent_default_layer_set(1UL<<_QWERTY);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
case RGBRST:
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
if (record->event.pressed) {
|
||||||
|
eeconfig_update_rgblight_default();
|
||||||
|
rgblight_enable();
|
||||||
|
RGB_current_mode = rgblight_config.mode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case MBTN1:
|
||||||
|
currentReport = pointing_device_get_report();
|
||||||
|
if (record->event.pressed) {
|
||||||
|
currentReport.buttons |= MOUSE_BTN1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
currentReport.buttons &= ~MOUSE_BTN1;
|
||||||
|
}
|
||||||
|
pointing_device_set_report(currentReport);
|
||||||
|
pointing_device_send();
|
||||||
|
return false;
|
||||||
|
case SCRL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
isScrollMode = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isScrollMode = false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
# CrKbd with the Trackpad support
|
||||||
|
|
||||||
|
CrKbd version that supports BlackBerry 8520 trackpad via additional PCB.
|
||||||
|
See this repository for more details:
|
||||||
|
- https://github.com/vlukash/corne-trackpad
|
||||||
|
- https://vlukash.com/2019/01/15/trackpad-in-keycap-corne-crkbd-keyboard
|
||||||
|
|
||||||
|
This firmware is for the Right keyboard.
|
||||||
|
|
||||||
|
# Build
|
||||||
|
|
||||||
|
```
|
||||||
|
make crkbd:vlukash_trackpad_right:dfu
|
||||||
|
```
|
|
@ -0,0 +1,10 @@
|
||||||
|
# Build Options
|
||||||
|
POINTING_DEVICE_ENABLE = yes # Generic Pointer, not as big as mouse keys hopefully.
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
||||||
|
|
||||||
|
BOOTLOADER = atmel-dfu
|
||||||
|
|
||||||
|
# Add support for the BB 8520 trackpad
|
||||||
|
SRC += trackpad.c
|
|
@ -0,0 +1,78 @@
|
||||||
|
#include "trackpad.h"
|
||||||
|
|
||||||
|
// bool isScrollingMode = false;
|
||||||
|
bool isScrollMode = false;
|
||||||
|
|
||||||
|
void pointing_device_init(void){
|
||||||
|
|
||||||
|
SPI_Init(SPI_SPEED_FCPU_DIV_8 | SPI_MODE_MASTER);
|
||||||
|
|
||||||
|
// Set as output
|
||||||
|
TP_RESET_INIT;
|
||||||
|
TP_SHUTDOWN_INIT;
|
||||||
|
TP_CS_INIT;
|
||||||
|
LVL_SHIFT_EN_INIT;
|
||||||
|
|
||||||
|
// Reset level shifter
|
||||||
|
LVL_SHIFT_EN_LO;
|
||||||
|
wait_ms(100);
|
||||||
|
LVL_SHIFT_EN_HI;
|
||||||
|
|
||||||
|
// Force a BB-8520 reset
|
||||||
|
TP_RESET_HI;
|
||||||
|
wait_ms(100);
|
||||||
|
TP_RESET_LO;
|
||||||
|
|
||||||
|
// Turn on BB-8520 trackpad
|
||||||
|
TP_SHUTDOWN_LO;
|
||||||
|
|
||||||
|
TP_CS_HI;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t readRegister(uint8_t address) {
|
||||||
|
uint8_t data;
|
||||||
|
|
||||||
|
TP_CS_LO;
|
||||||
|
|
||||||
|
// Read the data
|
||||||
|
SPI_TransferByte(address);
|
||||||
|
data = SPI_TransferByte(0x00);
|
||||||
|
|
||||||
|
TP_CS_HI;
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pointing_device_task(void){
|
||||||
|
uint8_t motion = readRegister(0x02);
|
||||||
|
|
||||||
|
// Motion has occurred on the trackpad
|
||||||
|
if (motion > 127) {
|
||||||
|
|
||||||
|
int8_t dx, dy;
|
||||||
|
|
||||||
|
if(TRACKPAD_CONNECTOR_VER == 1) {
|
||||||
|
dx = readRegister(0x03);
|
||||||
|
dy = -readRegister(0x04);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dy = -readRegister(0x03);
|
||||||
|
dx = -readRegister(0x04);
|
||||||
|
}
|
||||||
|
|
||||||
|
report_mouse_t currentReport = pointing_device_get_report();
|
||||||
|
if (isScrollMode)
|
||||||
|
{
|
||||||
|
currentReport.h = dx/SCROLL_SPEED_DIVIDER;
|
||||||
|
currentReport.v = dy/SCROLL_SPEED_DIVIDER;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentReport.x = dx * POINTER_SPEED_MULTIPLIER;
|
||||||
|
currentReport.y = dy * POINTER_SPEED_MULTIPLIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
pointing_device_set_report(currentReport);
|
||||||
|
pointing_device_send();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "pointing_device.h"
|
||||||
|
#include "quantum.h"
|
||||||
|
#include "report.h"
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include "../../lib/lufa/LUFA/Drivers/Peripheral/SPI.h"
|
||||||
|
|
||||||
|
// Trackpad speed adjustments
|
||||||
|
#define POINTER_SPEED_MULTIPLIER 2
|
||||||
|
#define SCROLL_SPEED_DIVIDER 6
|
||||||
|
|
||||||
|
// Pins on corresponding ports
|
||||||
|
#define TP_RESET 1
|
||||||
|
#define TP_SHUTDOWN 0
|
||||||
|
#define TP_CS 0
|
||||||
|
#define LVL_SHIFT_EN 7
|
||||||
|
|
||||||
|
// Configure as output
|
||||||
|
#define TP_RESET_INIT DDRF |= (1 << TP_RESET);
|
||||||
|
#define TP_SHUTDOWN_INIT DDRF |= (1 << TP_SHUTDOWN);
|
||||||
|
#define TP_CS_INIT DDRB |= (1 << TP_CS);
|
||||||
|
#define LVL_SHIFT_EN_INIT DDRC |= (1 << LVL_SHIFT_EN);
|
||||||
|
|
||||||
|
#define TP_RESET_HI PORTF |= (1 << TP_RESET);
|
||||||
|
#define TP_RESET_LO PORTF &= ~ (1 << TP_RESET);
|
||||||
|
#define TP_SHUTDOWN_HI PORTF |= (1 << TP_SHUTDOWN);
|
||||||
|
#define TP_SHUTDOWN_LO PORTF &= ~ (1 << TP_SHUTDOWN);
|
||||||
|
#define TP_CS_HI PORTB |= (1 << TP_CS);
|
||||||
|
#define TP_CS_LO PORTB &= ~ (1 << TP_CS);
|
||||||
|
#define LVL_SHIFT_EN_HI PORTC |= (1 << LVL_SHIFT_EN);
|
||||||
|
#define LVL_SHIFT_EN_LO PORTC &= ~ (1 << LVL_SHIFT_EN);
|
|
@ -93,6 +93,44 @@ uint8_t matrix_cols(void)
|
||||||
return MATRIX_COLS;
|
return MATRIX_COLS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tx_rx_leds_init(void)
|
||||||
|
{
|
||||||
|
#ifndef NO_DEBUG_LEDS
|
||||||
|
TX_RX_LED_INIT;
|
||||||
|
TXLED0;
|
||||||
|
RXLED0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void tx_led_on(void)
|
||||||
|
{
|
||||||
|
#ifndef NO_DEBUG_LEDS
|
||||||
|
TXLED1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void tx_led_off(void)
|
||||||
|
{
|
||||||
|
#ifndef NO_DEBUG_LEDS
|
||||||
|
TXLED0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void rx_led_on(void)
|
||||||
|
{
|
||||||
|
#ifndef NO_DEBUG_LEDS
|
||||||
|
RXLED1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void rx_led_off(void)
|
||||||
|
{
|
||||||
|
#ifndef NO_DEBUG_LEDS
|
||||||
|
RXLED0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void matrix_init(void)
|
void matrix_init(void)
|
||||||
{
|
{
|
||||||
debug_enable = true;
|
debug_enable = true;
|
||||||
|
@ -102,9 +140,7 @@ void matrix_init(void)
|
||||||
unselect_rows();
|
unselect_rows();
|
||||||
init_cols();
|
init_cols();
|
||||||
|
|
||||||
TX_RX_LED_INIT;
|
tx_rx_leds_init();
|
||||||
TXLED0;
|
|
||||||
RXLED0;
|
|
||||||
|
|
||||||
// initialize matrix state: all keys off
|
// initialize matrix state: all keys off
|
||||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
|
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
|
||||||
|
@ -189,10 +225,10 @@ int serial_transaction(int master_changed) {
|
||||||
int ret=serial_update_buffers();
|
int ret=serial_update_buffers();
|
||||||
#endif
|
#endif
|
||||||
if (ret ) {
|
if (ret ) {
|
||||||
if(ret==2) RXLED1;
|
if(ret==2) rx_led_on();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
RXLED0;
|
rx_led_off();
|
||||||
memcpy(&matrix[slaveOffset],
|
memcpy(&matrix[slaveOffset],
|
||||||
(void *)serial_slave_buffer, SERIAL_SLAVE_BUFFER_LENGTH);
|
(void *)serial_slave_buffer, SERIAL_SLAVE_BUFFER_LENGTH);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -241,7 +277,7 @@ uint8_t matrix_master_scan(void) {
|
||||||
if( serial_transaction(mchanged) ) {
|
if( serial_transaction(mchanged) ) {
|
||||||
#endif
|
#endif
|
||||||
// turn on the indicator led when halves are disconnected
|
// turn on the indicator led when halves are disconnected
|
||||||
TXLED1;
|
tx_led_on();
|
||||||
|
|
||||||
error_count++;
|
error_count++;
|
||||||
|
|
||||||
|
@ -254,7 +290,7 @@ uint8_t matrix_master_scan(void) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// turn off the indicator led on no error
|
// turn off the indicator led on no error
|
||||||
TXLED0;
|
tx_led_off();
|
||||||
error_count = 0;
|
error_count = 0;
|
||||||
}
|
}
|
||||||
matrix_scan_quantum();
|
matrix_scan_quantum();
|
||||||
|
|
Loading…
Reference in New Issue