summary refs log tree commit diff
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2017-05-26 18:32:43 -0400
committerGitHub <noreply@github.com>2017-05-26 18:32:43 -0400
commit453877422bddd7c83ae8b893e79203cb5d868cf7 (patch)
tree4a8e66adc77bb754261217ca95df5f21ae9ae96f
parent9851e6f3b156e3d77a2c9af01872e8bb550ca226 (diff)
parent6b994ecd82f660feb44bac376ae7d0147d40d818 (diff)
Merge pull request #1327 from Dbroqua/master
Added Integration of IBM Trackpoint
-rw-r--r--keyboards/handwired/trackpoint/Makefile3
-rw-r--r--keyboards/handwired/trackpoint/README.md10
-rw-r--r--keyboards/handwired/trackpoint/config.h75
-rw-r--r--keyboards/handwired/trackpoint/keymaps/default/keymap.c7
-rw-r--r--keyboards/handwired/trackpoint/rules.mk25
-rw-r--r--keyboards/handwired/trackpoint/trackpoint.c5
-rw-r--r--keyboards/handwired/trackpoint/trackpoint.h13
-rw-r--r--keyboards/handwired/trackpoint/wiring.pngbin0 -> 7217 bytes
-rw-r--r--tmk_core/common/action.c34
-rw-r--r--tmk_core/protocol/ps2_mouse.c29
10 files changed, 183 insertions, 18 deletions
diff --git a/keyboards/handwired/trackpoint/Makefile b/keyboards/handwired/trackpoint/Makefile
new file mode 100644
index 0000000000..191c6bb664
--- /dev/null
+++ b/keyboards/handwired/trackpoint/Makefile
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+	include ../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/handwired/trackpoint/README.md b/keyboards/handwired/trackpoint/README.md
new file mode 100644
index 0000000000..a22fca295e
--- /dev/null
+++ b/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/)
diff --git a/keyboards/handwired/trackpoint/config.h b/keyboards/handwired/trackpoint/config.h
new file mode 100644
index 0000000000..7558c03bf4
--- /dev/null
+++ b/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
diff --git a/keyboards/handwired/trackpoint/keymaps/default/keymap.c b/keyboards/handwired/trackpoint/keymaps/default/keymap.c
new file mode 100644
index 0000000000..22e46d98a7
--- /dev/null
+++ b/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 \
+    )
+};
diff --git a/keyboards/handwired/trackpoint/rules.mk b/keyboards/handwired/trackpoint/rules.mk
new file mode 100644
index 0000000000..0609dd3043
--- /dev/null
+++ b/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
diff --git a/keyboards/handwired/trackpoint/trackpoint.c b/keyboards/handwired/trackpoint/trackpoint.c
new file mode 100644
index 0000000000..124995a642
--- /dev/null
+++ b/keyboards/handwired/trackpoint/trackpoint.c
@@ -0,0 +1,5 @@
+#include "trackpoint.h"
+
+void matrix_init_kb(void) {
+
+}
diff --git a/keyboards/handwired/trackpoint/trackpoint.h b/keyboards/handwired/trackpoint/trackpoint.h
new file mode 100644
index 0000000000..b5d73d7db5
--- /dev/null
+++ b/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
diff --git a/keyboards/handwired/trackpoint/wiring.png b/keyboards/handwired/trackpoint/wiring.png
new file mode 100644
index 0000000000..45806e007b
--- /dev/null
+++ b/keyboards/handwired/trackpoint/wiring.png
Binary files differdiff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index a534f818ec..f73b0fe807 100644
--- a/tmk_core/common/action.c
+++ b/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
diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index d9ccbecb43..4ed3cae1fd 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/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);