- Added integration of IBM Trackpoint
This commit is contained in:
		
							
								
								
									
										3
									
								
								keyboards/handwired/trackpoint/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								keyboards/handwired/trackpoint/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| ifndef MAKEFILE_INCLUDED | ||||
| 	include ../../../Makefile | ||||
| endif | ||||
							
								
								
									
										7
									
								
								keyboards/handwired/trackpoint/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								keyboards/handwired/trackpoint/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| # IBM Trackpoint demonstration | ||||
|  | ||||
| This is just a simple demo to show how to integrate IBM Trackpoint in QMK. | ||||
|  | ||||
| Some documentation: | ||||
| * [How to wire IBM Trackpoint](https://github.com/alonswartz/trackpoint) | ||||
| * [QMK documentation](https://docs.qmk.fm/) | ||||
							
								
								
									
										75
									
								
								keyboards/handwired/trackpoint/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								keyboards/handwired/trackpoint/config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| #ifndef CONFIG_H | ||||
|     #define CONFIG_H | ||||
|  | ||||
|     #include "config_common.h" | ||||
|  | ||||
|     #define VENDOR_ID       0x1234 | ||||
|     #define PRODUCT_ID      0x5678 | ||||
|     #define DEVICE_VER      0x0001 | ||||
|     #define MANUFACTURER    QMK | ||||
|     #define PRODUCT         TRACKPOINT-DEMO | ||||
|     #define DESCRIPTION     Simple demonstration for IBM Trackpoint integration | ||||
|  | ||||
|     #define MATRIX_ROWS 1 | ||||
|     #define MATRIX_COLS 3 | ||||
|  | ||||
|     #ifdef PS2_USE_USART | ||||
|         #define PS2_CLOCK_PORT  PORTD | ||||
|         #define PS2_CLOCK_PIN   PIND | ||||
|         #define PS2_CLOCK_DDR   DDRD | ||||
|         #define PS2_CLOCK_BIT   5 | ||||
|         #define PS2_DATA_PORT   PORTD | ||||
|         #define PS2_DATA_PIN    PIND | ||||
|         #define PS2_DATA_DDR    DDRD | ||||
|         #define PS2_DATA_BIT    2 | ||||
|  | ||||
|         /* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ | ||||
|         /* set DDR of CLOCK as input to be slave */ | ||||
|         #define PS2_USART_INIT() do {   \ | ||||
|             PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT);   \ | ||||
|             PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT);     \ | ||||
|             UCSR1C = ((1 << UMSEL10) |  \ | ||||
|                       (3 << UPM10)   |  \ | ||||
|                       (0 << USBS1)   |  \ | ||||
|                       (3 << UCSZ10)  |  \ | ||||
|                       (0 << UCPOL1));   \ | ||||
|             UCSR1A = 0;                 \ | ||||
|             UBRR1H = 0;                 \ | ||||
|             UBRR1L = 0;                 \ | ||||
|         } while (0) | ||||
|         #define PS2_USART_RX_INT_ON() do {  \ | ||||
|             UCSR1B = ((1 << RXCIE1) |       \ | ||||
|                       (1 << RXEN1));        \ | ||||
|         } while (0) | ||||
|         #define PS2_USART_RX_POLL_ON() do { \ | ||||
|             UCSR1B = (1 << RXEN1);          \ | ||||
|         } while (0) | ||||
|         #define PS2_USART_OFF() do {    \ | ||||
|             UCSR1C = 0;                 \ | ||||
|             UCSR1B &= ~((1 << RXEN1) |  \ | ||||
|                         (1 << TXEN1));  \ | ||||
|         } while (0) | ||||
|         #define PS2_USART_RX_READY      (UCSR1A & (1<<RXC1)) | ||||
|         #define PS2_USART_RX_DATA       UDR1 | ||||
|         #define PS2_USART_ERROR         (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1))) | ||||
|         #define PS2_USART_RX_VECT       USART1_RX_vect | ||||
|     #endif | ||||
|  | ||||
|     #define MATRIX_COL_PINS { F1, F4, F5 } | ||||
|     #define MATRIX_ROW_PINS { F0 } | ||||
|     #define UNUSED_PINS | ||||
|  | ||||
|     /* COL2ROW or ROW2COL */ | ||||
|     #define DIODE_DIRECTION COL2ROW | ||||
|  | ||||
|     #define DEBOUNCING_DELAY 5 | ||||
|  | ||||
|     #define LOCKING_SUPPORT_ENABLE | ||||
|     #define LOCKING_RESYNC_ENABLE | ||||
|  | ||||
|     /* key combination for command */ | ||||
|     #define IS_COMMAND() ( \ | ||||
|         keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | ||||
|     ) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										7
									
								
								keyboards/handwired/trackpoint/keymaps/default/keymap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								keyboards/handwired/trackpoint/keymaps/default/keymap.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| #include "trackpoint.h" | ||||
|  | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|     [0] = KEYMAP( | ||||
|         KC_BTN1,    KC_BTN3,    KC_BTN2 \ | ||||
|     ) | ||||
| }; | ||||
							
								
								
									
										25
									
								
								keyboards/handwired/trackpoint/rules.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								keyboards/handwired/trackpoint/rules.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| MCU = atmega32u4 | ||||
| F_CPU = 16000000 | ||||
| ARCH = AVR8 | ||||
| F_USB = $(F_CPU) | ||||
| OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT | ||||
| OPT_DEFS += -DBOOTLOADER_SIZE=512 | ||||
| BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000) | ||||
| MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700) | ||||
| EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450) | ||||
| CONSOLE_ENABLE ?= yes        # Console for debug(+400) | ||||
| COMMAND_ENABLE ?= yes        # Commands for debug and configuration | ||||
| SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend | ||||
| NKRO_ENABLE ?= no            # USB Nkey Rollover | ||||
| BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default | ||||
| MIDI_ENABLE ?= no            # MIDI controls | ||||
| UNICODE_ENABLE ?= no         # Unicode | ||||
| BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID | ||||
| AUDIO_ENABLE ?= no           # Audio output on port C6 | ||||
|  | ||||
| PS2_MOUSE_ENABLE ?= yes | ||||
| PS2_USE_USART ?= yes | ||||
|  | ||||
| ifndef QUANTUM_DIR | ||||
| 	include ../../Makefile | ||||
| endif | ||||
							
								
								
									
										5
									
								
								keyboards/handwired/trackpoint/trackpoint.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								keyboards/handwired/trackpoint/trackpoint.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| #include "trackpoint.h" | ||||
|  | ||||
| void matrix_init_kb(void) { | ||||
|  | ||||
| } | ||||
							
								
								
									
										13
									
								
								keyboards/handwired/trackpoint/trackpoint.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								keyboards/handwired/trackpoint/trackpoint.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| #ifndef TRACKPOINT_H | ||||
| #define TRACKPOINT_H | ||||
|  | ||||
| #include "quantum.h" | ||||
|  | ||||
| #define KEYMAP( \ | ||||
| 	k00, k01, k02  \ | ||||
| ) \ | ||||
| { \ | ||||
| 	{ k00, k01, k02} \ | ||||
| } | ||||
|  | ||||
| #endif | ||||
| @@ -34,6 +34,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| #include "nodebug.h" | ||||
| #endif | ||||
|  | ||||
| int tp_buttons; | ||||
|  | ||||
| #ifdef FAUXCLICKY_ENABLE | ||||
| #include <fauxclicky.h> | ||||
| #endif | ||||
| @@ -311,11 +313,35 @@ void process_action(keyrecord_t *record, action_t action) | ||||
|         /* Mouse key */ | ||||
|         case ACT_MOUSEKEY: | ||||
|             if (event.pressed) { | ||||
|                 mousekey_on(action.key.code); | ||||
|                 mousekey_send(); | ||||
|                 switch (action.key.code) { | ||||
|                     case KC_MS_BTN1: | ||||
|                         tp_buttons |= (1<<0); | ||||
|                         break; | ||||
|                     case KC_MS_BTN2: | ||||
|                         tp_buttons |= (1<<1); | ||||
|                         break; | ||||
|                     case KC_MS_BTN3: | ||||
|                         tp_buttons |= (1<<2); | ||||
|                         break; | ||||
|                     default: | ||||
|                         mousekey_on(action.key.code); | ||||
|                         mousekey_send(); | ||||
|                 } | ||||
|             } else { | ||||
|                 mousekey_off(action.key.code); | ||||
|                 mousekey_send(); | ||||
|                 switch (action.key.code) { | ||||
|                     case KC_MS_BTN1: | ||||
|                         tp_buttons &= ~(1<<0); | ||||
|                         break; | ||||
|                     case KC_MS_BTN2: | ||||
|                         tp_buttons &= ~(1<<1); | ||||
|                         break; | ||||
|                     case KC_MS_BTN3: | ||||
|                         tp_buttons &= ~(1<<2); | ||||
|                         break; | ||||
|                     default: | ||||
|                         mousekey_off(action.key.code); | ||||
|                         mousekey_send(); | ||||
|                 } | ||||
|             } | ||||
|             break; | ||||
| #endif | ||||
|   | ||||
| @@ -72,12 +72,13 @@ void ps2_mouse_init_user(void) { | ||||
|  | ||||
| void ps2_mouse_task(void) { | ||||
|     static uint8_t buttons_prev = 0; | ||||
|     extern int tp_buttons; | ||||
|  | ||||
|     /* receives packet from mouse */ | ||||
|     uint8_t rcv; | ||||
|     rcv = ps2_host_send(PS2_MOUSE_READ_DATA); | ||||
|     if (rcv == PS2_ACK) { | ||||
|         mouse_report.buttons = ps2_host_recv_response(); | ||||
|         mouse_report.buttons = ps2_host_recv_response() | tp_buttons; | ||||
|         mouse_report.x = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER; | ||||
|         mouse_report.y = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER; | ||||
| #ifdef PS2_MOUSE_ENABLE_SCROLLING | ||||
| @@ -106,34 +107,34 @@ void ps2_mouse_task(void) { | ||||
| #endif | ||||
|         host_mouse_send(&mouse_report); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     ps2_mouse_clear_report(&mouse_report); | ||||
| } | ||||
|  | ||||
| void ps2_mouse_disable_data_reporting(void) { | ||||
|     PS2_MOUSE_SEND(PS2_MOUSE_DISABLE_DATA_REPORTING, "ps2 mouse disable data reporting");  | ||||
|     PS2_MOUSE_SEND(PS2_MOUSE_DISABLE_DATA_REPORTING, "ps2 mouse disable data reporting"); | ||||
| } | ||||
|  | ||||
| void ps2_mouse_enable_data_reporting(void) { | ||||
|     PS2_MOUSE_SEND(PS2_MOUSE_ENABLE_DATA_REPORTING, "ps2 mouse enable data reporting"); | ||||
| } | ||||
|  | ||||
| void ps2_mouse_set_remote_mode(void) {  | ||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_REMOTE_MODE, "ps2 mouse set remote mode");  | ||||
| void ps2_mouse_set_remote_mode(void) { | ||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_REMOTE_MODE, "ps2 mouse set remote mode"); | ||||
|     ps2_mouse_mode = PS2_MOUSE_REMOTE_MODE; | ||||
| } | ||||
|  | ||||
| void ps2_mouse_set_stream_mode(void) {  | ||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_STREAM_MODE, "ps2 mouse set stream mode");  | ||||
| void ps2_mouse_set_stream_mode(void) { | ||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_STREAM_MODE, "ps2 mouse set stream mode"); | ||||
|     ps2_mouse_mode = PS2_MOUSE_STREAM_MODE; | ||||
| } | ||||
|  | ||||
| void ps2_mouse_set_scaling_2_1(void) { | ||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_2_1, "ps2 mouse set scaling 2:1");  | ||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_2_1, "ps2 mouse set scaling 2:1"); | ||||
| } | ||||
|  | ||||
| void ps2_mouse_set_scaling_1_1(void) { | ||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_1_1, "ps2 mouse set scaling 1:1");  | ||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_1_1, "ps2 mouse set scaling 1:1"); | ||||
| } | ||||
|  | ||||
| void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution) { | ||||
| @@ -204,9 +205,9 @@ static inline void ps2_mouse_enable_scrolling(void) { | ||||
| #define PRESS_SCROLL_BUTTONS    mouse_report->buttons |= (PS2_MOUSE_SCROLL_BTN_MASK) | ||||
| #define RELEASE_SCROLL_BUTTONS  mouse_report->buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK) | ||||
| static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) { | ||||
|     static enum {  | ||||
|         SCROLL_NONE,  | ||||
|         SCROLL_BTN,  | ||||
|     static enum { | ||||
|         SCROLL_NONE, | ||||
|         SCROLL_BTN, | ||||
|         SCROLL_SENT, | ||||
|     } scroll_state = SCROLL_NONE; | ||||
|     static uint16_t scroll_button_time = 0; | ||||
| @@ -228,10 +229,10 @@ static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) { | ||||
|             mouse_report->y = 0; | ||||
|         } | ||||
|     } else if (0 == (PS2_MOUSE_SCROLL_BTN_MASK & mouse_report->buttons)) { | ||||
|         // None of the scroll buttons are pressed  | ||||
|         // None of the scroll buttons are pressed | ||||
|  | ||||
| #if PS2_MOUSE_SCROLL_BTN_SEND | ||||
|         if (scroll_state == SCROLL_BTN  | ||||
|         if (scroll_state == SCROLL_BTN | ||||
|                 && timer_elapsed(scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) { | ||||
|             PRESS_SCROLL_BUTTONS; | ||||
|             host_mouse_send(mouse_report); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user