Browse Source

Merge pull request #1327 from Dbroqua/master

Added Integration of IBM Trackpoint
Jack Humbert 8 years ago
parent
commit
453877422b

+ 3 - 0
keyboards/handwired/trackpoint/Makefile

@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../../Makefile
+endif

+ 10 - 0
keyboards/handwired/trackpoint/README.md

@@ -0,0 +1,10 @@
+# IBM Trackpoint demonstration
+
+This is just a simple demo to show how to integrate IBM Trackpoint in QMK.
+
+Wiring used in the demonstration:
+![Wiring example](./wiring.png)
+
+Some documentation:
+* [How to wire IBM Trackpoint](https://github.com/alonswartz/trackpoint)
+* [QMK documentation](https://docs.qmk.fm/)

+ 75 - 0
keyboards/handwired/trackpoint/config.h

@@ -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 - 0
keyboards/handwired/trackpoint/keymaps/default/keymap.c

@@ -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 - 0
keyboards/handwired/trackpoint/rules.mk

@@ -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 - 0
keyboards/handwired/trackpoint/trackpoint.c

@@ -0,0 +1,5 @@
+#include "trackpoint.h"
+
+void matrix_init_kb(void) {
+
+}

+ 13 - 0
keyboards/handwired/trackpoint/trackpoint.h

@@ -0,0 +1,13 @@
+#ifndef TRACKPOINT_H
+#define TRACKPOINT_H
+
+#include "quantum.h"
+
+#define KEYMAP( \
+	k00, k01, k02  \
+) \
+{ \
+	{ k00, k01, k02} \
+}
+
+#endif

BIN
keyboards/handwired/trackpoint/wiring.png


+ 30 - 4
tmk_core/common/action.c

@@ -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

+ 15 - 14
tmk_core/protocol/ps2_mouse.c

@@ -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);