[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.
This commit is contained in:
		
				
					committed by
					
						
						Drashna Jaelre
					
				
			
			
				
	
			
			
			
						parent
						
							2558466d78
						
					
				
				
					commit
					b92387b749
				
			
							
								
								
									
										21
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_left/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_left/config.h
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										227
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_left/keymap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										227
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_left/keymap.c
									
									
									
									
									
										Normal file
									
								
							@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_left/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_left/readme.md
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										11
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_left/rules.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_left/rules.mk
									
									
									
									
									
										Normal file
									
								
							@@ -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 \
 | 
			
		||||
							
								
								
									
										35
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										199
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/keymap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										199
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/keymap.c
									
									
									
									
									
										Normal file
									
								
							@@ -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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/readme.md
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										10
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/rules.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/rules.mk
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
							
								
								
									
										78
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.c
									
									
									
									
									
										Normal file
									
								
							@@ -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();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.h
									
									
									
									
									
										Normal file
									
								
							@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user