]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
[Keymap] Add BB8520 trackpad support for CrKbd (#5925)
authorVolodymyr Lukashevych <vlukash@users.noreply.github.com>
Tue, 11 Jun 2019 22:18:14 +0000 (15:18 -0700)
committerDrashna Jaelre <drashna@live.com>
Tue, 11 Jun 2019 22:18:14 +0000 (15:18 -0700)
* 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.

keyboards/crkbd/keymaps/vlukash_trackpad_left/config.h [new file with mode: 0644]
keyboards/crkbd/keymaps/vlukash_trackpad_left/keymap.c [new file with mode: 0644]
keyboards/crkbd/keymaps/vlukash_trackpad_left/readme.md [new file with mode: 0644]
keyboards/crkbd/keymaps/vlukash_trackpad_left/rules.mk [new file with mode: 0644]
keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h [new file with mode: 0644]
keyboards/crkbd/keymaps/vlukash_trackpad_right/keymap.c [new file with mode: 0644]
keyboards/crkbd/keymaps/vlukash_trackpad_right/readme.md [new file with mode: 0644]
keyboards/crkbd/keymaps/vlukash_trackpad_right/rules.mk [new file with mode: 0644]
keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.c [new file with mode: 0644]
keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.h [new file with mode: 0644]
keyboards/crkbd/rev1/matrix.c

diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_left/config.h b/keyboards/crkbd/keymaps/vlukash_trackpad_left/config.h
new file mode 100644 (file)
index 0000000..bdd1a09
--- /dev/null
@@ -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
diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_left/keymap.c b/keyboards/crkbd/keymaps/vlukash_trackpad_left/keymap.c
new file mode 100644 (file)
index 0000000..48f6041
--- /dev/null
@@ -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;
+}
+
diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_left/readme.md b/keyboards/crkbd/keymaps/vlukash_trackpad_left/readme.md
new file mode 100644 (file)
index 0000000..91b8847
--- /dev/null
@@ -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
+```
diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_left/rules.mk b/keyboards/crkbd/keymaps/vlukash_trackpad_left/rules.mk
new file mode 100644 (file)
index 0000000..46be73c
--- /dev/null
@@ -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 \
diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h b/keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h
new file mode 100644 (file)
index 0000000..8cbd8e9
--- /dev/null
@@ -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 (file)
index 0000000..8749f7a
--- /dev/null
@@ -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 (file)
index 0000000..cd51101
--- /dev/null
@@ -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 (file)
index 0000000..bd53c19
--- /dev/null
@@ -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 (file)
index 0000000..afccb8c
--- /dev/null
@@ -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 (file)
index 0000000..755abc7
--- /dev/null
@@ -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);
index 718cc574481a4c36bfff451f4b8b5c8f7af789bb..dd93506db1d287e277e554a5649cb029ff0781c0 100644 (file)
@@ -93,6 +93,44 @@ uint8_t matrix_cols(void)
     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)
 {
     debug_enable = true;
@@ -102,9 +140,7 @@ void matrix_init(void)
     unselect_rows();
     init_cols();
 
-    TX_RX_LED_INIT;
-    TXLED0;
-    RXLED0;
+    tx_rx_leds_init();
 
     // initialize matrix state: all keys off
     for (uint8_t i=0; i < MATRIX_ROWS; i++) {
@@ -189,10 +225,10 @@ int serial_transaction(int master_changed) {
     int ret=serial_update_buffers();
 #endif
     if (ret ) {
-        if(ret==2) RXLED1;
+        if(ret==2) rx_led_on();
         return 1;
     }
-    RXLED0;
+    rx_led_off();
     memcpy(&matrix[slaveOffset],
         (void *)serial_slave_buffer, SERIAL_SLAVE_BUFFER_LENGTH);
     return 0;
@@ -241,7 +277,7 @@ uint8_t matrix_master_scan(void) {
     if( serial_transaction(mchanged) ) {
 #endif
         // turn on the indicator led when halves are disconnected
-        TXLED1;
+        tx_led_on();
 
         error_count++;
 
@@ -254,7 +290,7 @@ uint8_t matrix_master_scan(void) {
         }
     } else {
         // turn off the indicator led on no error
-        TXLED0;
+        tx_led_off();
         error_count = 0;
     }
     matrix_scan_quantum();