diff options
author | Volodymyr Lukashevych <vlukash@users.noreply.github.com> | 2019-06-11 15:18:14 -0700 |
---|---|---|
committer | Drashna Jaelre <drashna@live.com> | 2019-06-11 15:18:14 -0700 |
commit | b92387b7499e21603e241d136db92c6e716b0cba (patch) | |
tree | 98626a4cd72b4fbd043a24a5c63b731c3ce0cd89 /keyboards/crkbd/keymaps/vlukash_trackpad_right | |
parent | 2558466d78a2c2436dedeff593491bdb20780cfc (diff) |
[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.
Diffstat (limited to 'keyboards/crkbd/keymaps/vlukash_trackpad_right')
6 files changed, 368 insertions, 0 deletions
diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h b/keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h new file mode 100644 index 0000000000..8cbd8e9078 --- /dev/null +++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h @@ -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 diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_right/keymap.c b/keyboards/crkbd/keymaps/vlukash_trackpad_right/keymap.c new file mode 100644 index 0000000000..8749f7a686 --- /dev/null +++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/keymap.c @@ -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; +} diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_right/readme.md b/keyboards/crkbd/keymaps/vlukash_trackpad_right/readme.md new file mode 100644 index 0000000000..cd511018c1 --- /dev/null +++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/readme.md @@ -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 +``` diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_right/rules.mk b/keyboards/crkbd/keymaps/vlukash_trackpad_right/rules.mk new file mode 100644 index 0000000000..bd53c19211 --- /dev/null +++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/rules.mk @@ -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 diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.c b/keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.c new file mode 100644 index 0000000000..afccb8c7ed --- /dev/null +++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/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(); + } +} diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.h b/keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.h new file mode 100644 index 0000000000..755abc7de2 --- /dev/null +++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.h @@ -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); |