* 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.pull/6122/head
@ -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); |