aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolodymyr Lukashevych <vlukash@users.noreply.github.com>2019-06-11 15:18:14 -0700
committerDrashna Jaelre <drashna@live.com>2019-06-11 15:18:14 -0700
commitb92387b7499e21603e241d136db92c6e716b0cba (patch)
tree98626a4cd72b4fbd043a24a5c63b731c3ce0cd89
parent2558466d78a2c2436dedeff593491bdb20780cfc (diff)
downloadqmk_firmware-b92387b7499e21603e241d136db92c6e716b0cba.tar.gz
qmk_firmware-b92387b7499e21603e241d136db92c6e716b0cba.zip
[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.
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_left/config.h21
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_left/keymap.c227
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_left/readme.md14
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_left/rules.mk11
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h35
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_right/keymap.c199
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_right/readme.md14
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_right/rules.mk10
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.c78
-rw-r--r--keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.h32
-rw-r--r--keyboards/crkbd/rev1/matrix.c50
11 files changed, 684 insertions, 7 deletions
diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_left/config.h b/keyboards/crkbd/keymaps/vlukash_trackpad_left/config.h
new file mode 100644
index 000000000..bdd1a099a
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_left/config.h
@@ -0,0 +1,21 @@
1#pragma once
2
3/* Select hand configuration */
4
5#define MASTER_RIGHT
6// #define EE_HANDS
7
8#define SSD1306OLED
9
10#define USE_SERIAL_PD2
11
12#define TAPPING_FORCE_HOLD
13#define TAPPING_TERM 100
14
15#undef RGBLED_NUM
16#define RGBLIGHT_ANIMATIONS
17#define RGBLED_NUM 27
18#define RGBLIGHT_LIMIT_VAL 120
19#define RGBLIGHT_HUE_STEP 10
20#define RGBLIGHT_SAT_STEP 17
21#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
index 000000000..48f60419f
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_left/keymap.c
@@ -0,0 +1,227 @@
1#include QMK_KEYBOARD_H
2#include "bootloader.h"
3#ifdef PROTOCOL_LUFA
4 #include "lufa.h"
5 #include "split_util.h"
6#endif
7#ifdef SSD1306OLED
8 #include "ssd1306.h"
9#endif
10
11#ifdef RGBLIGHT_ENABLE
12//Following line allows macro to read current RGB settings
13extern rgblight_config_t rgblight_config;
14#endif
15
16extern uint8_t is_master;
17
18enum layer_names {
19 _QWERTY,
20 _LOWER,
21 _RAISE,
22 _ADJUST
23};
24
25enum custom_keycodes {
26 QWERTY = SAFE_RANGE,
27 LOWER,
28 RAISE,
29 RGBRST,
30 MBTN1,
31 SCRL
32};
33
34#define KC______ KC_TRNS
35#define KC_XXXXX KC_NO
36#define KC_LOWER LOWER
37#define KC_RAISE RAISE
38#define KC_RST RESET
39#define KC_LRST RGBRST
40#define KC_LTOG RGB_TOG
41#define KC_LHUI RGB_HUI
42#define KC_LHUD RGB_HUD
43#define KC_LSAI RGB_SAI
44#define KC_LSAD RGB_SAD
45#define KC_LVAI RGB_VAI
46#define KC_LVAD RGB_VAD
47#define KC_LMOD RGB_MOD
48
49#define KC_CTLA CTL_T(KC_A)
50#define KC_CTLSC CTL_T(KC_SCLN)
51#define KC_SFTZ SFT_T(KC_Z)
52#define KC_SFTSL SFT_T(KC_SLSH)
53#define KC_WINX LWIN_T(KC_X)
54#define KC_WINDO RWIN_T(KC_DOT)
55
56#define KC_MBTN1 MBTN1
57#define KC_SCRL SCRL
58
59const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
60 [_QWERTY] = LAYOUT_kc(
61 //,-----------------------------------------. ,-----------------------------------------.
62 ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
63 //|------+------+------+------+------+------| |------+------+------+------+------+------|
64 TAB, CTLA, S, D, F, G, H, J, K, L, CTLSC, QUOT,
65 //|------+------+------+------+------+------| |------+------+------+------+------+------|
66 GRAVE, SFTZ, WINX, C, V, B, N, M, COMM, WINDO, SFTSL,BSLASH,
67 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
68 LOWER, SPC, SCRL, MBTN1, ENT, RAISE
69 //`--------------------' `--------------------'
70 ),
71
72 [_LOWER] = LAYOUT_kc(
73 //,-----------------------------------------. ,-----------------------------------------.
74 ESC, XXXXX, PGDN, PSCR, PGUP, LBRC, RBRC, 7, 8, 9, XXXXX, XXXXX,
75 //|------+------+------+------+------+------| |------+------+------+------+------+------|
76 XXXXX, LCTRL, PLUS, MINS, EQL, LPRN, RPRN, 4, 5, 6, RCTRL, XXXXX,
77 //|------+------+------+------+------+------| |------+------+------+------+------+------|
78 XXXXX, LSFT, HOME, XXXXX, END, LCBR, RCBR, 1, 2, 3, RSFT, XXXXX,
79 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
80 LOWER, SPC, SCRL, MBTN1, ENT, 0
81 //`--------------------' `--------------------'
82 ),
83
84 [_RAISE] = LAYOUT_kc(
85 //,-----------------------------------------. ,-----------------------------------------.
86 ESC, XXXXX, F7, F8, F9, F10, BTN2, BTN2, MNXT, MPRV, MPLY, MSTP,
87 //|------+------+------+------+------+------| |------+------+------+------+------+------|
88 XXXXX, LCTRL, F4, F5, F6, F11, LEFT, DOWN, UP, RIGHT, RCTRL, XXXXX,
89 //|------+------+------+------+------+------| |------+------+------+------+------+------|
90 XXXXX, LSFT, F1, F2, F3, F12, XXXXX, XXXXX, VOLU, VOLD, MUTE, RSFT,
91 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
92 LOWER, SPC, SCRL, MBTN1, ENT, RAISE
93 //`--------------------' `--------------------'
94 ),
95
96 [_ADJUST] = LAYOUT_kc(
97 //,-----------------------------------------. ,-----------------------------------------.
98 RST, LRST, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, RST,
99 //|------+------+------+------+------+------| |------+------+------+------+------+------|
100 LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,
101 //|------+------+------+------+------+------| |------+------+------+------+------+------|
102 LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,
103 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
104 LOWER, SPC, SCRL, MBTN1, ENT, RAISE
105 //`--------------------' `--------------------'
106 )
107};
108
109int RGB_current_mode;
110
111void persistent_default_layer_set(uint16_t default_layer) {
112 eeconfig_update_default_layer(default_layer);
113 default_layer_set(default_layer);
114}
115
116// Setting ADJUST layer RGB back to default
117void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
118 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
119 layer_on(layer3);
120 } else {
121 layer_off(layer3);
122 }
123}
124
125void matrix_init_user(void) {
126 #ifdef RGBLIGHT_ENABLE
127 RGB_current_mode = rgblight_config.mode;
128 #endif
129 //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
130 #ifdef SSD1306OLED
131 iota_gfx_init(!has_usb()); // turns on the display
132 #endif
133}
134
135//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
136#ifdef SSD1306OLED
137
138// When add source files to SRC in rules.mk, you can use functions.
139const char *read_layer_state(void);
140const char *read_logo(void);
141void set_keylog(uint16_t keycode, keyrecord_t *record);
142const char *read_keylog(void);
143const char *read_keylogs(void);
144
145void matrix_scan_user(void) {
146 iota_gfx_task();
147}
148
149void matrix_render_user(struct CharacterMatrix *matrix) {
150 if (is_master) {
151 // If you want to change the display of OLED, you need to change here
152 matrix_write_ln(matrix, read_layer_state());
153 matrix_write_ln(matrix, read_keylog());
154 matrix_write_ln(matrix, read_keylogs());
155 } else {
156 matrix_write(matrix, read_logo());
157 }
158}
159
160void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
161 if (memcmp(dest->display, source->display, sizeof(dest->display))) {
162 memcpy(dest->display, source->display, sizeof(dest->display));
163 dest->dirty = true;
164 }
165}
166
167void iota_gfx_task_user(void) {
168 struct CharacterMatrix matrix;
169 matrix_clear(&matrix);
170 matrix_render_user(&matrix);
171 matrix_update(&display, &matrix);
172}
173#endif//SSD1306OLED
174
175bool process_record_user(uint16_t keycode, keyrecord_t *record) {
176 if (record->event.pressed) {
177#ifdef SSD1306OLED
178 set_keylog(keycode, record);
179#endif
180 }
181
182 switch (keycode) {
183 case QWERTY:
184 if (record->event.pressed) {
185 persistent_default_layer_set(1UL<<_QWERTY);
186 }
187 return false;
188 case LOWER:
189 if (record->event.pressed) {
190 layer_on(_LOWER);
191 update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
192 } else {
193 layer_off(_LOWER);
194 update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
195 }
196 return false;
197 case RAISE:
198 if (record->event.pressed) {
199 layer_on(_RAISE);
200 update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
201 } else {
202 layer_off(_RAISE);
203 update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
204 }
205 return false;
206 case RGB_MOD:
207 #ifdef RGBLIGHT_ENABLE
208 if (record->event.pressed) {
209 rgblight_mode(RGB_current_mode);
210 rgblight_step();
211 RGB_current_mode = rgblight_config.mode;
212 }
213 #endif
214 return false;
215 case RGBRST:
216 #ifdef RGBLIGHT_ENABLE
217 if (record->event.pressed) {
218 eeconfig_update_rgblight_default();
219 rgblight_enable();
220 RGB_current_mode = rgblight_config.mode;
221 }
222 #endif
223 break;
224 }
225 return true;
226}
227
diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_left/readme.md b/keyboards/crkbd/keymaps/vlukash_trackpad_left/readme.md
new file mode 100644
index 000000000..91b884749
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_left/readme.md
@@ -0,0 +1,14 @@
1# CrKbd with the Trackpad support
2
3CrKbd version that supports BlackBerry 8520 trackpad via additional PCB.
4See this repository for more details:
5 - https://github.com/vlukash/corne-trackpad
6 - https://vlukash.com/2019/01/15/trackpad-in-keycap-corne-crkbd-keyboard
7
8This firmware is for the Left keyboard.
9
10# Build
11
12```
13make crkbd:vlukash_trackpad_left:dfu
14```
diff --git a/keyboards/crkbd/keymaps/vlukash_trackpad_left/rules.mk b/keyboards/crkbd/keymaps/vlukash_trackpad_left/rules.mk
new file mode 100644
index 000000000..46be73c47
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_left/rules.mk
@@ -0,0 +1,11 @@
1# Build Options
2RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
3
4BOOTLOADER = atmel-dfu
5
6# If you want to change the display of OLED, you need to change here
7SRC += ./lib/glcdfont.c \
8 ./lib/rgb_state_reader.c \
9 ./lib/layer_state_reader.c \
10 ./lib/logo_reader.c \
11 ./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
index 000000000..8cbd8e907
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/config.h
@@ -0,0 +1,35 @@
1#pragma once
2
3#define NO_DEBUG_LEDS
4
5// Connector PCB version
6// 1 - PCB that supports flex caple and the trackpad sensor is mounted on an 'H' keycap
7// - https://github.com/vlukash/corne-trackpad/tree/master/connector
8// 2 - PCB woth no flex option, track sensor mounted directly on the PCB
9// - https://github.com/vlukash/corne-trackpad/tree/master/connector-no-flex
10#define TRACKPAD_CONNECTOR_VER 1
11
12/* Select hand configuration */
13#define MASTER_RIGHT
14
15#define USE_SERIAL_PD2
16
17#define TAPPING_FORCE_HOLD
18#define TAPPING_TERM 300
19
20#undef RGBLED_NUM
21#define RGBLIGHT_ANIMATIONS
22#define RGBLED_NUM 27
23#define RGBLIGHT_LIMIT_VAL 120
24#define RGBLIGHT_HUE_STEP 10
25#define RGBLIGHT_SAT_STEP 17
26#define RGBLIGHT_VAL_STEP 17
27
28/* key matrix size */
29// Rows are doubled-up
30#undef MATRIX_COL_PINS
31#define MATRIX_COL_PINS { F4, F5, F6, F7, B7, D5 }
32
33/* ws2812 RGB LED */
34#undef RGB_DI_PIN
35#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 000000000..8749f7a68
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/keymap.c
@@ -0,0 +1,199 @@
1#include QMK_KEYBOARD_H
2#include "bootloader.h"
3#include "mousekey.h"
4#include "pointing_device.h"
5#include "report.h"
6
7#ifdef PROTOCOL_LUFA
8 #include "lufa.h"
9 #include "split_util.h"
10#endif
11
12extern bool isScrollMode;
13
14#ifdef RGBLIGHT_ENABLE
15//Following line allows macro to read current RGB settings
16extern rgblight_config_t rgblight_config;
17#endif
18
19extern uint8_t is_master;
20
21enum layer_names {
22 _QWERTY,
23 _LOWER,
24 _RAISE,
25 _ADJUST
26};
27
28enum custom_keycodes {
29 QWERTY = SAFE_RANGE,
30 LOWER,
31 RAISE,
32 RGBRST,
33 MBTN1,
34 SCRL
35};
36
37#define KC______ KC_TRNS
38#define KC_XXXXX KC_NO
39#define KC_LOWER LOWER
40#define KC_RAISE RAISE
41#define KC_RST RESET
42#define KC_LRST RGBRST
43#define KC_LTOG RGB_TOG
44#define KC_LHUI RGB_HUI
45#define KC_LHUD RGB_HUD
46#define KC_LSAI RGB_SAI
47#define KC_LSAD RGB_SAD
48#define KC_LVAI RGB_VAI
49#define KC_LVAD RGB_VAD
50#define KC_LMOD RGB_MOD
51
52#define KC_CTLA CTL_T(KC_A)
53#define KC_CTLSC CTL_T(KC_SCLN)
54#define KC_SFTZ SFT_T(KC_Z)
55#define KC_SFTSL SFT_T(KC_SLSH)
56#define KC_WINX LWIN_T(KC_X)
57#define KC_WINDO RWIN_T(KC_DOT)
58
59#define KC_MBTN1 MBTN1
60#define KC_SCRL SCRL
61
62const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
63 [_QWERTY] = LAYOUT_kc(
64 //,-----------------------------------------. ,-----------------------------------------.
65 ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
66 //|------+------+------+------+------+------| |------+------+------+------+------+------|
67 TAB, CTLA, S, D, F, G, H, J, K, L, CTLSC, QUOT,
68 //|------+------+------+------+------+------| |------+------+------+------+------+------|
69 GRAVE, SFTZ, WINX, C, V, B, N, M, COMM, WINDO, SFTSL,BSLASH,
70 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
71 LOWER, SPC, SCRL, MBTN1, ENT, RAISE
72 //`--------------------' `--------------------'
73 ),
74
75 [_LOWER] = LAYOUT_kc(
76 //,-----------------------------------------. ,-----------------------------------------.
77 ESC, XXXXX, PGDN, PSCR, PGUP, LBRC, RBRC, 7, 8, 9, XXXXX, XXXXX,
78 //|------+------+------+------+------+------| |------+------+------+------+------+------|
79 XXXXX, LCTRL, PLUS, MINS, EQL, LPRN, RPRN, 4, 5, 6, RCTRL, XXXXX,
80 //|------+------+------+------+------+------| |------+------+------+------+------+------|
81 XXXXX, LSFT, HOME, XXXXX, END, LCBR, RCBR, 1, 2, 3, RSFT, XXXXX,
82 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
83 LOWER, SPC, SCRL, MBTN1, ENT, 0
84 //`--------------------' `--------------------'
85 ),
86
87 [_RAISE] = LAYOUT_kc(
88 //,-----------------------------------------. ,-----------------------------------------.
89 ESC, XXXXX, F7, F8, F9, F10, BTN2, BTN2, MNXT, MPRV, MPLY, MSTP,
90 //|------+------+------+------+------+------| |------+------+------+------+------+------|
91 XXXXX, LCTRL, F4, F5, F6, F11, LEFT, DOWN, UP, RIGHT, RCTRL, XXXXX,
92 //|------+------+------+------+------+------| |------+------+------+------+------+------|
93 XXXXX, LSFT, F1, F2, F3, F12, XXXXX, XXXXX, VOLU, VOLD, MUTE, RSFT,
94 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
95 LOWER, SPC, SCRL, MBTN1, ENT, RAISE
96 //`--------------------' `--------------------'
97 ),
98
99 [_ADJUST] = LAYOUT_kc(
100 //,-----------------------------------------. ,-----------------------------------------.
101 RST, LRST, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, RST,
102 //|------+------+------+------+------+------| |------+------+------+------+------+------|
103 LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,
104 //|------+------+------+------+------+------| |------+------+------+------+------+------|
105 LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,
106 //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
107 LOWER, SPC, SCRL, MBTN1, ENT, RAISE
108 //`--------------------' `--------------------'
109 )
110};
111
112int RGB_current_mode;
113
114void persistent_default_layer_set(uint16_t default_layer) {
115 eeconfig_update_default_layer(default_layer);
116 default_layer_set(default_layer);
117}
118
119// Setting ADJUST layer RGB back to default
120void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
121 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
122 layer_on(layer3);
123 } else {
124 layer_off(layer3);
125 }
126}
127
128void matrix_init_user(void) {
129 #ifdef RGBLIGHT_ENABLE
130 RGB_current_mode = rgblight_config.mode;
131 #endif
132}
133
134bool process_record_user(uint16_t keycode, keyrecord_t *record) {
135 report_mouse_t currentReport = {};
136 switch (keycode) {
137 case QWERTY:
138 if (record->event.pressed) {
139 persistent_default_layer_set(1UL<<_QWERTY);
140 }
141 return false;
142 case LOWER:
143 if (record->event.pressed) {
144 layer_on(_LOWER);
145 update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
146 } else {
147 layer_off(_LOWER);
148 update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
149 }
150 return false;
151 case RAISE:
152 if (record->event.pressed) {
153 layer_on(_RAISE);
154 update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
155 } else {
156 layer_off(_RAISE);
157 update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
158 }
159 return false;
160 case RGB_MOD:
161 #ifdef RGBLIGHT_ENABLE
162 if (record->event.pressed) {
163 rgblight_mode(RGB_current_mode);
164 rgblight_step();
165 RGB_current_mode = rgblight_config.mode;
166 }
167 #endif
168 return false;
169 case RGBRST:
170 #ifdef RGBLIGHT_ENABLE
171 if (record->event.pressed) {
172 eeconfig_update_rgblight_default();
173 rgblight_enable();
174 RGB_current_mode = rgblight_config.mode;
175 }
176 #endif
177 break;
178 case MBTN1:
179 currentReport = pointing_device_get_report();
180 if (record->event.pressed) {
181 currentReport.buttons |= MOUSE_BTN1;
182 }
183 else {
184 currentReport.buttons &= ~MOUSE_BTN1;
185 }
186 pointing_device_set_report(currentReport);
187 pointing_device_send();
188 return false;
189 case SCRL:
190 if (record->event.pressed) {
191 isScrollMode = true;
192 }
193 else {
194 isScrollMode = false;
195 }
196 return false;
197 }
198 return true;
199}
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 000000000..cd511018c
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/readme.md
@@ -0,0 +1,14 @@
1# CrKbd with the Trackpad support
2
3CrKbd version that supports BlackBerry 8520 trackpad via additional PCB.
4See this repository for more details:
5 - https://github.com/vlukash/corne-trackpad
6 - https://vlukash.com/2019/01/15/trackpad-in-keycap-corne-crkbd-keyboard
7
8This firmware is for the Right keyboard.
9
10# Build
11
12```
13make crkbd:vlukash_trackpad_right:dfu
14```
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 000000000..bd53c1921
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/rules.mk
@@ -0,0 +1,10 @@
1# Build Options
2POINTING_DEVICE_ENABLE = yes # Generic Pointer, not as big as mouse keys hopefully.
3MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
4EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
5RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
6
7BOOTLOADER = atmel-dfu
8
9# Add support for the BB 8520 trackpad
10SRC += 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 000000000..afccb8c7e
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.c
@@ -0,0 +1,78 @@
1#include "trackpad.h"
2
3// bool isScrollingMode = false;
4bool isScrollMode = false;
5
6void pointing_device_init(void){
7
8 SPI_Init(SPI_SPEED_FCPU_DIV_8 | SPI_MODE_MASTER);
9
10 // Set as output
11 TP_RESET_INIT;
12 TP_SHUTDOWN_INIT;
13 TP_CS_INIT;
14 LVL_SHIFT_EN_INIT;
15
16 // Reset level shifter
17 LVL_SHIFT_EN_LO;
18 wait_ms(100);
19 LVL_SHIFT_EN_HI;
20
21 // Force a BB-8520 reset
22 TP_RESET_HI;
23 wait_ms(100);
24 TP_RESET_LO;
25
26 // Turn on BB-8520 trackpad
27 TP_SHUTDOWN_LO;
28
29 TP_CS_HI;
30}
31
32uint8_t readRegister(uint8_t address) {
33 uint8_t data;
34
35 TP_CS_LO;
36
37 // Read the data
38 SPI_TransferByte(address);
39 data = SPI_TransferByte(0x00);
40
41 TP_CS_HI;
42
43 return data;
44}
45
46void pointing_device_task(void){
47 uint8_t motion = readRegister(0x02);
48
49 // Motion has occurred on the trackpad
50 if (motion > 127) {
51
52 int8_t dx, dy;
53
54 if(TRACKPAD_CONNECTOR_VER == 1) {
55 dx = readRegister(0x03);
56 dy = -readRegister(0x04);
57 }
58 else {
59 dy = -readRegister(0x03);
60 dx = -readRegister(0x04);
61 }
62
63 report_mouse_t currentReport = pointing_device_get_report();
64 if (isScrollMode)
65 {
66 currentReport.h = dx/SCROLL_SPEED_DIVIDER;
67 currentReport.v = dy/SCROLL_SPEED_DIVIDER;
68 }
69 else
70 {
71 currentReport.x = dx * POINTER_SPEED_MULTIPLIER;
72 currentReport.y = dy * POINTER_SPEED_MULTIPLIER;
73 }
74
75 pointing_device_set_report(currentReport);
76 pointing_device_send();
77 }
78}
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 000000000..755abc7de
--- /dev/null
+++ b/keyboards/crkbd/keymaps/vlukash_trackpad_right/trackpad.h
@@ -0,0 +1,32 @@
1#pragma once
2
3#include "pointing_device.h"
4#include "quantum.h"
5#include "report.h"
6#include <util/delay.h>
7#include "../../lib/lufa/LUFA/Drivers/Peripheral/SPI.h"
8
9// Trackpad speed adjustments
10#define POINTER_SPEED_MULTIPLIER 2
11#define SCROLL_SPEED_DIVIDER 6
12
13// Pins on corresponding ports
14#define TP_RESET 1
15#define TP_SHUTDOWN 0
16#define TP_CS 0
17#define LVL_SHIFT_EN 7
18
19// Configure as output
20#define TP_RESET_INIT DDRF |= (1 << TP_RESET);
21#define TP_SHUTDOWN_INIT DDRF |= (1 << TP_SHUTDOWN);
22#define TP_CS_INIT DDRB |= (1 << TP_CS);
23#define LVL_SHIFT_EN_INIT DDRC |= (1 << LVL_SHIFT_EN);
24
25#define TP_RESET_HI PORTF |= (1 << TP_RESET);
26#define TP_RESET_LO PORTF &= ~ (1 << TP_RESET);
27#define TP_SHUTDOWN_HI PORTF |= (1 << TP_SHUTDOWN);
28#define TP_SHUTDOWN_LO PORTF &= ~ (1 << TP_SHUTDOWN);
29#define TP_CS_HI PORTB |= (1 << TP_CS);
30#define TP_CS_LO PORTB &= ~ (1 << TP_CS);
31#define LVL_SHIFT_EN_HI PORTC |= (1 << LVL_SHIFT_EN);
32#define LVL_SHIFT_EN_LO PORTC &= ~ (1 << LVL_SHIFT_EN);
diff --git a/keyboards/crkbd/rev1/matrix.c b/keyboards/crkbd/rev1/matrix.c
index 718cc5744..dd93506db 100644
--- a/keyboards/crkbd/rev1/matrix.c
+++ b/keyboards/crkbd/rev1/matrix.c
@@ -93,6 +93,44 @@ uint8_t matrix_cols(void)
93 return MATRIX_COLS; 93 return MATRIX_COLS;
94} 94}
95 95
96void tx_rx_leds_init(void)
97{
98#ifndef NO_DEBUG_LEDS
99 TX_RX_LED_INIT;
100 TXLED0;
101 RXLED0;
102#endif
103}
104
105void tx_led_on(void)
106{
107#ifndef NO_DEBUG_LEDS
108 TXLED1;
109#endif
110}
111
112void tx_led_off(void)
113{
114#ifndef NO_DEBUG_LEDS
115 TXLED0;
116#endif
117}
118
119void rx_led_on(void)
120{
121#ifndef NO_DEBUG_LEDS
122 RXLED1;
123#endif
124}
125
126void rx_led_off(void)
127{
128#ifndef NO_DEBUG_LEDS
129 RXLED0;
130#endif
131}
132
133
96void matrix_init(void) 134void matrix_init(void)
97{ 135{
98 debug_enable = true; 136 debug_enable = true;
@@ -102,9 +140,7 @@ void matrix_init(void)
102 unselect_rows(); 140 unselect_rows();
103 init_cols(); 141 init_cols();
104 142
105 TX_RX_LED_INIT; 143 tx_rx_leds_init();
106 TXLED0;
107 RXLED0;
108 144
109 // initialize matrix state: all keys off 145 // initialize matrix state: all keys off
110 for (uint8_t i=0; i < MATRIX_ROWS; i++) { 146 for (uint8_t i=0; i < MATRIX_ROWS; i++) {
@@ -189,10 +225,10 @@ int serial_transaction(int master_changed) {
189 int ret=serial_update_buffers(); 225 int ret=serial_update_buffers();
190#endif 226#endif
191 if (ret ) { 227 if (ret ) {
192 if(ret==2) RXLED1; 228 if(ret==2) rx_led_on();
193 return 1; 229 return 1;
194 } 230 }
195 RXLED0; 231 rx_led_off();
196 memcpy(&matrix[slaveOffset], 232 memcpy(&matrix[slaveOffset],
197 (void *)serial_slave_buffer, SERIAL_SLAVE_BUFFER_LENGTH); 233 (void *)serial_slave_buffer, SERIAL_SLAVE_BUFFER_LENGTH);
198 return 0; 234 return 0;
@@ -241,7 +277,7 @@ uint8_t matrix_master_scan(void) {
241 if( serial_transaction(mchanged) ) { 277 if( serial_transaction(mchanged) ) {
242#endif 278#endif
243 // turn on the indicator led when halves are disconnected 279 // turn on the indicator led when halves are disconnected
244 TXLED1; 280 tx_led_on();
245 281
246 error_count++; 282 error_count++;
247 283
@@ -254,7 +290,7 @@ uint8_t matrix_master_scan(void) {
254 } 290 }
255 } else { 291 } else {
256 // turn off the indicator led on no error 292 // turn off the indicator led on no error
257 TXLED0; 293 tx_led_off();
258 error_count = 0; 294 error_count = 0;
259 } 295 }
260 matrix_scan_quantum(); 296 matrix_scan_quantum();