forked from mfulz_github/qmk_firmware
		
	- Added integration of IBM Trackpoint
This commit is contained in:
		
							parent
							
								
									0a4a966c66
								
							
						
					
					
						commit
						81e85a1a4e
					
				
							
								
								
									
										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" | #include "nodebug.h" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | int tp_buttons; | ||||||
|  | 
 | ||||||
| #ifdef FAUXCLICKY_ENABLE | #ifdef FAUXCLICKY_ENABLE | ||||||
| #include <fauxclicky.h> | #include <fauxclicky.h> | ||||||
| #endif | #endif | ||||||
| @ -311,11 +313,35 @@ void process_action(keyrecord_t *record, action_t action) | |||||||
|         /* Mouse key */ |         /* Mouse key */ | ||||||
|         case ACT_MOUSEKEY: |         case ACT_MOUSEKEY: | ||||||
|             if (event.pressed) { |             if (event.pressed) { | ||||||
|                 mousekey_on(action.key.code); |                 switch (action.key.code) { | ||||||
|                 mousekey_send(); |                     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 { |             } else { | ||||||
|                 mousekey_off(action.key.code); |                 switch (action.key.code) { | ||||||
|                 mousekey_send(); |                     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; |             break; | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -72,12 +72,13 @@ void ps2_mouse_init_user(void) { | |||||||
| 
 | 
 | ||||||
| void ps2_mouse_task(void) { | void ps2_mouse_task(void) { | ||||||
|     static uint8_t buttons_prev = 0; |     static uint8_t buttons_prev = 0; | ||||||
|  |     extern int tp_buttons; | ||||||
| 
 | 
 | ||||||
|     /* receives packet from mouse */ |     /* receives packet from mouse */ | ||||||
|     uint8_t rcv; |     uint8_t rcv; | ||||||
|     rcv = ps2_host_send(PS2_MOUSE_READ_DATA); |     rcv = ps2_host_send(PS2_MOUSE_READ_DATA); | ||||||
|     if (rcv == PS2_ACK) { |     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.x = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER; | ||||||
|         mouse_report.y = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER; |         mouse_report.y = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER; | ||||||
| #ifdef PS2_MOUSE_ENABLE_SCROLLING | #ifdef PS2_MOUSE_ENABLE_SCROLLING | ||||||
| @ -106,34 +107,34 @@ void ps2_mouse_task(void) { | |||||||
| #endif | #endif | ||||||
|         host_mouse_send(&mouse_report); |         host_mouse_send(&mouse_report); | ||||||
|     } |     } | ||||||
|      | 
 | ||||||
|     ps2_mouse_clear_report(&mouse_report); |     ps2_mouse_clear_report(&mouse_report); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ps2_mouse_disable_data_reporting(void) { | 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) { | void ps2_mouse_enable_data_reporting(void) { | ||||||
|     PS2_MOUSE_SEND(PS2_MOUSE_ENABLE_DATA_REPORTING, "ps2 mouse enable data reporting"); |     PS2_MOUSE_SEND(PS2_MOUSE_ENABLE_DATA_REPORTING, "ps2 mouse enable data reporting"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ps2_mouse_set_remote_mode(void) {  | void ps2_mouse_set_remote_mode(void) { | ||||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_REMOTE_MODE, "ps2 mouse set remote mode");  |     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_REMOTE_MODE, "ps2 mouse set remote mode"); | ||||||
|     ps2_mouse_mode = PS2_MOUSE_REMOTE_MODE; |     ps2_mouse_mode = PS2_MOUSE_REMOTE_MODE; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ps2_mouse_set_stream_mode(void) {  | void ps2_mouse_set_stream_mode(void) { | ||||||
|     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_STREAM_MODE, "ps2 mouse set stream mode");  |     PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_STREAM_MODE, "ps2 mouse set stream mode"); | ||||||
|     ps2_mouse_mode = PS2_MOUSE_STREAM_MODE; |     ps2_mouse_mode = PS2_MOUSE_STREAM_MODE; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ps2_mouse_set_scaling_2_1(void) { | 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) { | 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) { | 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 PRESS_SCROLL_BUTTONS    mouse_report->buttons |= (PS2_MOUSE_SCROLL_BTN_MASK) | ||||||
| #define RELEASE_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 inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) { | ||||||
|     static enum {  |     static enum { | ||||||
|         SCROLL_NONE,  |         SCROLL_NONE, | ||||||
|         SCROLL_BTN,  |         SCROLL_BTN, | ||||||
|         SCROLL_SENT, |         SCROLL_SENT, | ||||||
|     } scroll_state = SCROLL_NONE; |     } scroll_state = SCROLL_NONE; | ||||||
|     static uint16_t scroll_button_time = 0; |     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; |             mouse_report->y = 0; | ||||||
|         } |         } | ||||||
|     } else if (0 == (PS2_MOUSE_SCROLL_BTN_MASK & mouse_report->buttons)) { |     } 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 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) { |                 && timer_elapsed(scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) { | ||||||
|             PRESS_SCROLL_BUTTONS; |             PRESS_SCROLL_BUTTONS; | ||||||
|             host_mouse_send(mouse_report); |             host_mouse_send(mouse_report); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 dbroqua
						dbroqua