From 1591764cfbc39e73c6f32e9b805d596379866ff0 Mon Sep 17 00:00:00 2001
From: tmk
Date: Sat, 2 Nov 2013 03:06:51 +0900
Subject: Tweak time values of busywait PS/2
---
protocol/ps2.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'protocol')
diff --git a/protocol/ps2.c b/protocol/ps2.c
index ed45609104..4c6c2fcb27 100644
--- a/protocol/ps2.c
+++ b/protocol/ps2.c
@@ -109,12 +109,12 @@ uint8_t ps2_host_send(uint8_t data)
#endif
/* terminate a transmission if we have */
inhibit();
- _delay_us(100);
+ _delay_us(200); // at least 100us
/* start bit [1] */
data_lo();
clock_hi();
- WAIT(clock_lo, 15000, 1);
+ WAIT(clock_lo, 20000, 10); // may take 15ms at most until device starts clocking
/* data [2-9] */
for (uint8_t i = 0; i < 8; i++) {
_delay_us(15);
@@ -167,7 +167,7 @@ uint8_t ps2_host_recv_response(void)
idle();
/* wait start bit */
- wait_clock_lo(2000);
+ wait_clock_lo(25000); // command response may take 20 ms at most
data = recv_data();
inhibit();
--
cgit v1.2.3
From 676d94d13791a99751cebf724fd5a56b150f344d Mon Sep 17 00:00:00 2001
From: tmk
Date: Sat, 2 Nov 2013 03:10:49 +0900
Subject: Fix PS/2 mouse support
---
common.mk | 11 +----
common/keyboard.c | 15 ++++++-
protocol.mk | 25 +++++++++++
protocol/pjrc.mk | 6 ++-
protocol/ps2_mouse.c | 122 +++++++++++++++++++++------------------------------
5 files changed, 95 insertions(+), 84 deletions(-)
(limited to 'protocol')
diff --git a/common.mk b/common.mk
index 5b70db9499..2ca06daae3 100644
--- a/common.mk
+++ b/common.mk
@@ -25,6 +25,7 @@ endif
ifdef MOUSEKEY_ENABLE
SRC += $(COMMON_DIR)/mousekey.c
OPT_DEFS += -DMOUSEKEY_ENABLE
+ OPT_DEFS += -DMOUSE_ENABLE
endif
ifdef EXTRAKEY_ENABLE
@@ -47,16 +48,6 @@ ifdef NKRO_ENABLE
OPT_DEFS += -DNKRO_ENABLE
endif
-ifdef PS2_MOUSE_ENABLE
- SRC += $(COMMON_DIR)/ps2.c \
- $(COMMON_DIR)/ps2_mouse.c
- OPT_DEFS += -DPS2_MOUSE_ENABLE
-endif
-
-ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
- OPT_DEFS += -DMOUSE_ENABLE
-endif
-
ifdef SLEEP_LED_ENABLE
SRC += $(COMMON_DIR)/sleep_led.c
OPT_DEFS += -DSLEEP_LED_ENABLE
diff --git a/common/keyboard.c b/common/keyboard.c
index 601e3abe17..63a58b2187 100644
--- a/common/keyboard.c
+++ b/common/keyboard.c
@@ -30,8 +30,13 @@ along with this program. If not, see .
#include "sendchar.h"
#include "bootmagic.h"
#include "eeconfig.h"
-#include "mousekey.h"
#include "backlight.h"
+#ifdef MOUSEKEY_ENABLE
+# include "mousekey.h"
+#endif
+#ifdef PS2_MOUSE_ENABLE
+# include "ps2_mouse.h"
+#endif
#ifdef MATRIX_HAS_GHOST
@@ -111,10 +116,18 @@ void keyboard_task(void)
action_exec(TICK);
MATRIX_LOOP_END:
+
#ifdef MOUSEKEY_ENABLE
// mousekey repeat & acceleration
mousekey_task();
#endif
+
+#ifdef PS2_MOUSE_ENABLE
+ if (ps2_mouse_read() == 0) {
+ ps2_mouse_usb_send();
+ }
+#endif
+
// update LED
if (led_status != host_keyboard_leds()) {
led_status = host_keyboard_leds();
diff --git a/protocol.mk b/protocol.mk
index 1442c5206b..0d5f06c7ec 100644
--- a/protocol.mk
+++ b/protocol.mk
@@ -1,2 +1,27 @@
+PROTOCOL_DIR = protocol
+
+
+ifdef PS2_MOUSE_ENABLE
+ SRC += $(PROTOCOL_DIR)/ps2_mouse.c
+ OPT_DEFS += -DPS2_MOUSE_ENABLE
+ OPT_DEFS += -DMOUSE_ENABLE
+endif
+
+ifdef PS2_USE_BUSYWAIT
+ SRC += protocol/ps2.c
+ OPT_DEFS += -DPS2_USE_BUSYWAIT
+endif
+
+ifdef PS2_USE_INT
+ SRC += protocol/ps2.c
+ OPT_DEFS += -DPS2_USE_INT
+endif
+
+ifdef PS2_USE_USART
+ SRC += protocol/ps2_usart.c
+ OPT_DEFS += -DPS2_USE_USART
+endif
+
+
# Search Path
VPATH += $(TOP_DIR)/protocol
diff --git a/protocol/pjrc.mk b/protocol/pjrc.mk
index 27f908b1c2..5a44613820 100644
--- a/protocol/pjrc.mk
+++ b/protocol/pjrc.mk
@@ -7,7 +7,11 @@ SRC += $(PJRC_DIR)/main.c \
$(PJRC_DIR)/usb.c
# Option modules
-ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
+ifdef MOUSEKEY_ENABLE
+ SRC += $(PJRC_DIR)/usb_mouse.c
+endif
+
+ifdef PS2_MOUSE_ENABLE
SRC += $(PJRC_DIR)/usb_mouse.c
endif
diff --git a/protocol/ps2_mouse.c b/protocol/ps2_mouse.c
index f796b2b4de..701d97213c 100644
--- a/protocol/ps2_mouse.c
+++ b/protocol/ps2_mouse.c
@@ -1,5 +1,5 @@
/*
-Copyright 2011 Jun Wako
+Copyright 2011,2013 Jun Wako
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -32,27 +32,7 @@ along with this program. If not, see .
# define phex16(h)
#endif
-// disable when errors occur 255 times.
-#define ERROR_RETURN() do { \
- if (ps2_error) { \
- if (ps2_mouse_error_count < 255) { \
- ps2_mouse_error_count++; \
- } else { \
- ps2_mouse_error_count = 0; \
- ps2_mouse_enable = false; \
- } \
- return ps2_error; \
- } \
-} while (0)
-
-/*
-TODO
-----
-- Stream mode
-- Tracpoint command support: needed
-- Middle button + move = Wheel traslation
-*/
bool ps2_mouse_enable = true;
uint8_t ps2_mouse_x = 0;
uint8_t ps2_mouse_y = 0;
@@ -69,85 +49,50 @@ uint8_t ps2_mouse_init(void) {
ps2_host_init();
- // Reset
- rcv = ps2_host_send(0xFF);
- print("ps2_mouse_init: send 0xFF: ");
- phex(ps2_error); print("\n");
- ERROR_RETURN();
+ // Not reliable: sometime fail to initialize mouse
- // ACK
- rcv = ps2_host_recv();
- print("ps2_mouse_init: read ACK: ");
+ // send Reset
+ _delay_ms(1000); // wait for powering up
+ rcv = ps2_host_send(0xFF);
+ print("ps2_mouse_init: send Reset: ");
phex(rcv); phex(ps2_error); print("\n");
- ERROR_RETURN();
- // BAT takes some time
- _delay_ms(100);
+ // read completion code of BAT
+ //_delay_ms(1000); // wait for Basic Assurance Test
rcv = ps2_host_recv();
print("ps2_mouse_init: read BAT: ");
phex(rcv); phex(ps2_error); print("\n");
- ERROR_RETURN();
- // Device ID
+ // read Device ID
rcv = ps2_host_recv();
print("ps2_mouse_init: read DevID: ");
phex(rcv); phex(ps2_error); print("\n");
- ERROR_RETURN();
- // Enable data reporting
- ps2_host_send(0xF4);
+ // send Enable Data Reporting
+ rcv = ps2_host_send(0xF4);
print("ps2_mouse_init: send 0xF4: ");
- phex(ps2_error); print("\n");
- ERROR_RETURN();
-
- // ACK
- rcv = ps2_host_recv();
- print("ps2_mouse_init: read ACK: ");
phex(rcv); phex(ps2_error); print("\n");
- ERROR_RETURN();
- // Set Remote mode
- ps2_host_send(0xF0);
+ // send Set Remote mode
+ rcv = ps2_host_send(0xF0);
print("ps2_mouse_init: send 0xF0: ");
- phex(ps2_error); print("\n");
- ERROR_RETURN();
-
- // ACK
- rcv = ps2_host_recv();
- print("ps2_mouse_init: read ACK: ");
phex(rcv); phex(ps2_error); print("\n");
- ERROR_RETURN();
return 0;
}
-/*
-Data format:
- bit: 7 6 5 4 3 2 1 0
------------------------------------------------------------------------
-0 btn: Yovflw Xovflw Ysign Xsign 1 Middle Right Left
-1 x: X movement(0-255)
-2 y: Y movement(0-255)
-*/
uint8_t ps2_mouse_read(void)
{
uint8_t rcv;
if (!ps2_mouse_enable) return 1;
- ps2_host_send(0xEB);
- ERROR_RETURN();
-
- rcv=ps2_host_recv();
- ERROR_RETURN();
+ rcv = ps2_host_send(0xEB);
if(rcv==0xFA) {
- ps2_mouse_btn = ps2_host_recv();
- ERROR_RETURN();
- ps2_mouse_x = ps2_host_recv();
- ERROR_RETURN();
- ps2_mouse_y = ps2_host_recv();
- ERROR_RETURN();
+ ps2_mouse_btn = ps2_host_recv_response();
+ ps2_mouse_x = ps2_host_recv_response();
+ ps2_mouse_y = ps2_host_recv_response();
}
return 0;
}
@@ -216,3 +161,36 @@ void ps2_mouse_print(void)
phex(ps2_mouse_x); print(" ");
phex(ps2_mouse_y); print("\n");
}
+
+
+/* PS/2 Mouse Synopsis
+ * http://www.computer-engineering.org/ps2mouse/
+ *
+ * Command:
+ * 0xFF: Reset
+ * 0xF6: Set Defaults Sampling; rate=100, resolution=4cnt/mm, scaling=1:1, reporting=disabled
+ * 0xF5: Disable Data Reporting
+ * 0xF4: Enable Data Reporting
+ * 0xF3: Set Sample Rate
+ * 0xF2: Get Device ID
+ * 0xF0: Set Remote Mode
+ * 0xEB: Read Data
+ * 0xEA: Set Stream Mode
+ * 0xE9: Status Request
+ * 0xE8: Set Resolution
+ * 0xE7: Set Scaling 2:1
+ * 0xE6: Set Scaling 1:1
+ *
+ * Mode:
+ * Stream Mode: devices sends the data when it changs its state
+ * Remote Mode: host polls the data periodically
+ *
+ * This code uses Remote Mode and polls the data with Read Data(0xEB).
+ *
+ * Data format:
+ * byte|7 6 5 4 3 2 1 0
+ * ----+--------------------------------------------------------------
+ * 0|Yovflw Xovflw Ysign Xsign 1 Middle Right Left
+ * 1| X movement(0-255)
+ * 2| Y movement(0-255)
+ */
--
cgit v1.2.3
From 9d40be19908394e44cdda5d3c73d21e8d3795e72 Mon Sep 17 00:00:00 2001
From: tmk
Date: Tue, 19 Nov 2013 03:20:25 +0900
Subject: Wait for USB starting up to make debug print available
---
common/action_util.h | 1 +
protocol/lufa/lufa.c | 9 ++++++++-
2 files changed, 9 insertions(+), 1 deletion(-)
(limited to 'protocol')
diff --git a/common/action_util.h b/common/action_util.h
index 939bc2b662..f9d3161a80 100644
--- a/common/action_util.h
+++ b/common/action_util.h
@@ -18,6 +18,7 @@ along with this program. If not, see .
#define ACTION_UTIL_H
#include
+#include "report.h"
extern report_keyboard_t *keyboard_report;
diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c
index a230d5ba20..04e8e78f38 100644
--- a/protocol/lufa/lufa.c
+++ b/protocol/lufa/lufa.c
@@ -539,11 +539,18 @@ int main(void)
{
SetupHardware();
sei();
+
+ /* wait for USB startup & debug output */
+ while (USB_DeviceState != DEVICE_STATE_Configured) {
#if defined(INTERRUPT_CONTROL_ENDPOINT)
- while (USB_DeviceState != DEVICE_STATE_Configured) ;
+ ;
+#else
+ USB_USBTask();
#endif
+ }
print("USB configured.\n");
+ /* init modules */
keyboard_init();
host_set_driver(&lufa_driver);
#ifdef SLEEP_LED_ENABLE
--
cgit v1.2.3
From 44d2d5f5fda3fbdf73e311067807026bb53798c0 Mon Sep 17 00:00:00 2001
From: tmk
Date: Tue, 19 Nov 2013 03:25:31 +0900
Subject: Fix delay of PS/2 mouse init
---
protocol/ps2_mouse.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
(limited to 'protocol')
diff --git a/protocol/ps2_mouse.c b/protocol/ps2_mouse.c
index 701d97213c..5e0b3657ca 100644
--- a/protocol/ps2_mouse.c
+++ b/protocol/ps2_mouse.c
@@ -49,16 +49,14 @@ uint8_t ps2_mouse_init(void) {
ps2_host_init();
- // Not reliable: sometime fail to initialize mouse
+ _delay_ms(1000); // wait for powering up
// send Reset
- _delay_ms(1000); // wait for powering up
rcv = ps2_host_send(0xFF);
print("ps2_mouse_init: send Reset: ");
phex(rcv); phex(ps2_error); print("\n");
// read completion code of BAT
- //_delay_ms(1000); // wait for Basic Assurance Test
rcv = ps2_host_recv();
print("ps2_mouse_init: read BAT: ");
phex(rcv); phex(ps2_error); print("\n");
--
cgit v1.2.3
From d7f663a1ea4487a6dc5be76085eff7b00bec9704 Mon Sep 17 00:00:00 2001
From: tmk
Date: Wed, 20 Nov 2013 11:19:59 +0900
Subject: Fix to build ps2_mouse with both LUFA and PJRC
- change API of ps2_mouse; ps2_mouse_task()
- remove mouse_report from host.c
---
common/action.c | 6 --
common/action.h | 1 -
common/host.c | 8 ---
common/host.h | 6 --
common/keyboard.c | 4 +-
common/mousekey.c | 1 +
protocol/ps2_mouse.c | 180 ++++++++++++++++++++++++++++++---------------------
protocol/ps2_mouse.h | 21 +++---
8 files changed, 119 insertions(+), 108 deletions(-)
(limited to 'protocol')
diff --git a/common/action.c b/common/action.c
index f7ae85b941..485abf81e3 100644
--- a/common/action.c
+++ b/common/action.c
@@ -485,12 +485,6 @@ void clear_keyboard_but_mods(void)
#endif
}
-bool sending_anykey(void)
-{
- return (has_anykey() || host_mouse_in_use() ||
- host_last_sysytem_report() || host_last_consumer_report());
-}
-
bool is_tap_key(key_t key)
{
action_t action = layer_switch_get_action(key);
diff --git a/common/action.h b/common/action.h
index d57f4a86ff..077711c231 100644
--- a/common/action.h
+++ b/common/action.h
@@ -64,7 +64,6 @@ void unregister_mods(uint8_t mods);
//void set_mods(uint8_t mods);
void clear_keyboard(void);
void clear_keyboard_but_mods(void);
-bool sending_anykey(void);
void layer_switch(uint8_t new_layer);
bool is_tap_key(key_t key);
diff --git a/common/host.c b/common/host.c
index 0703dba013..1eafef75cc 100644
--- a/common/host.c
+++ b/common/host.c
@@ -27,9 +27,6 @@ along with this program. If not, see .
bool keyboard_nkro = false;
#endif
-report_mouse_t mouse_report = {};
-
-
static host_driver_t *driver;
static uint16_t last_system_report = 0;
static uint16_t last_consumer_report = 0;
@@ -89,11 +86,6 @@ void host_consumer_send(uint16_t report)
(*driver->send_consumer)(report);
}
-uint8_t host_mouse_in_use(void)
-{
- return (mouse_report.buttons | mouse_report.x | mouse_report.y | mouse_report.v | mouse_report.h);
-}
-
uint16_t host_last_sysytem_report(void)
{
return last_system_report;
diff --git a/common/host.h b/common/host.h
index c1a0fbac40..8ff2629852 100644
--- a/common/host.h
+++ b/common/host.h
@@ -32,9 +32,6 @@ extern "C" {
extern bool keyboard_nkro;
#endif
-/* report */
-extern report_mouse_t mouse_report;
-
/* host driver */
void host_set_driver(host_driver_t *driver);
@@ -47,9 +44,6 @@ void host_mouse_send(report_mouse_t *report);
void host_system_send(uint16_t data);
void host_consumer_send(uint16_t data);
-/* mouse report utils */
-uint8_t host_mouse_in_use(void);
-
uint16_t host_last_sysytem_report(void);
uint16_t host_last_consumer_report(void);
diff --git a/common/keyboard.c b/common/keyboard.c
index 63a58b2187..2b66f20a01 100644
--- a/common/keyboard.c
+++ b/common/keyboard.c
@@ -123,9 +123,7 @@ MATRIX_LOOP_END:
#endif
#ifdef PS2_MOUSE_ENABLE
- if (ps2_mouse_read() == 0) {
- ps2_mouse_usb_send();
- }
+ ps2_mouse_task();
#endif
// update LED
diff --git a/common/mousekey.c b/common/mousekey.c
index 3068fc5e37..017be94116 100644
--- a/common/mousekey.c
+++ b/common/mousekey.c
@@ -26,6 +26,7 @@ along with this program. If not, see .
+static report_mouse_t mouse_report = {};
static uint8_t mousekey_repeat = 0;
static uint8_t mousekey_accel = 0;
diff --git a/protocol/ps2_mouse.c b/protocol/ps2_mouse.c
index 5e0b3657ca..ff730196c6 100644
--- a/protocol/ps2_mouse.c
+++ b/protocol/ps2_mouse.c
@@ -20,7 +20,8 @@ along with this program. If not, see .
#include
#include "ps2.h"
#include "ps2_mouse.h"
-#include "usb_mouse.h"
+#include "report.h"
+#include "host.h"
#define PS2_MOUSE_DEBUG
#ifdef PS2_MOUSE_DEBUG
@@ -33,20 +34,17 @@ along with this program. If not, see .
#endif
-bool ps2_mouse_enable = true;
-uint8_t ps2_mouse_x = 0;
-uint8_t ps2_mouse_y = 0;
-uint8_t ps2_mouse_btn = 0;
-uint8_t ps2_mouse_error_count = 0;
+static report_mouse_t mouse_report = {};
-static uint8_t ps2_mouse_btn_prev = 0;
+static void ps2_mouse_print_raw_data(void);
+static void ps2_mouse_print_usb_data(void);
+
+/* supports only 3 button mouse at this time */
uint8_t ps2_mouse_init(void) {
uint8_t rcv;
- if (!ps2_mouse_enable) return 1;
-
ps2_host_init();
_delay_ms(1000); // wait for powering up
@@ -79,85 +77,119 @@ uint8_t ps2_mouse_init(void) {
return 0;
}
-uint8_t ps2_mouse_read(void)
+/* scroll support
+ * TODO: should be build option
+ */
+#define PS2_MOUSE_SCROLL_BUTTON 0x04
+#define X_IS_NEG (mouse_report.buttons & (1< USB(-127/127)
- if (ps2_mouse_btn & (1< 128 ? (int8_t)ps2_mouse_x : -127;
- else
- x = ps2_mouse_x < 128 ? (int8_t)ps2_mouse_x : 127;
-
- if (ps2_mouse_btn & (1< 128 ? (int8_t)ps2_mouse_y : -127;
- else
- y = ps2_mouse_y < 128 ? (int8_t)ps2_mouse_y : 127;
-
- // Y is needed to reverse
- y = -y;
-
- if (ps2_mouse_btn & PS2_MOUSE_SCROLL_BUTTON) {
- // scroll
- if (x > 0 || x < 0) h = (x > 64 ? 64 : (x < -64 ? -64 :x));
- if (y > 0 || y < 0) v = (y > 64 ? 64 : (y < -64 ? -64 :y));
- if (h || v) {
- scrolled = true;
- usb_mouse_send(0,0, -v/16, h/16, 0);
- _delay_ms(100);
+ // remove sign and overflow flags
+ mouse_report.buttons &= PS2_MOUSE_BTN_MASK;
+
+ // invert coordinate of y to conform to USB HID mouse
+ mouse_report.y = -mouse_report.y;
+
+
+ if ((mouse_report.buttons & PS2_MOUSE_SCROLL_BUTTON) == PS2_MOUSE_SCROLL_BUTTON) {
+ if (scroll_state == SCROLL_NONE) scroll_state = SCROLL_BTN;
+
+ // doesn't send Scroll Button
+ mouse_report.buttons &= ~PS2_MOUSE_SCROLL_BUTTON;
+
+ if (mouse_report.x || mouse_report.y) {
+ scroll_state = SCROLL_SENT;
+
+ mouse_report.v = -mouse_report.y/2;
+ mouse_report.h = mouse_report.x/2;
+ mouse_report.x = 0;
+ mouse_report.y = 0;
+ host_mouse_send(&mouse_report);
}
- } else if (!scrolled && (ps2_mouse_btn_prev & PS2_MOUSE_SCROLL_BUTTON)) {
- usb_mouse_send(0,0,0,0, PS2_MOUSE_SCROLL_BUTTON);
+ } else if (scroll_state == SCROLL_BTN &&
+ (mouse_report.buttons & PS2_MOUSE_SCROLL_BUTTON) == 0) {
+ scroll_state = SCROLL_NONE;
+
+ // send Scroll Button(down and up at once) when not scrolled
+ mouse_report.buttons |= PS2_MOUSE_SCROLL_BUTTON;
+ host_mouse_send(&mouse_report);
_delay_ms(100);
- usb_mouse_send(0,0,0,0, 0);
+ mouse_report.buttons &= ~PS2_MOUSE_SCROLL_BUTTON;
+ host_mouse_send(&mouse_report);
} else {
- scrolled = false;
- usb_mouse_send(x, y, 0, 0, ps2_mouse_btn & PS2_MOUSE_BTN_MASK);
- }
+ scroll_state = SCROLL_NONE;
- ps2_mouse_btn_prev = (ps2_mouse_btn & PS2_MOUSE_BTN_MASK);
- ps2_mouse_print();
+ host_mouse_send(&mouse_report);
+ }
+ ps2_mouse_print_usb_data();
}
- ps2_mouse_x = 0;
- ps2_mouse_y = 0;
- ps2_mouse_btn = 0;
+ // clear report
+ mouse_report.x = 0;
+ mouse_report.y = 0;
+ mouse_report.v = 0;
+ mouse_report.h = 0;
+ mouse_report.buttons = 0;
+}
+
+static void ps2_mouse_print_raw_data(void)
+{
+ if (!debug_mouse) return;
+ print("ps2_mouse raw [btn|x y]: [");
+ phex(mouse_report.buttons); print("|");
+ print_hex8((uint8_t)mouse_report.x); print(" ");
+ print_hex8((uint8_t)mouse_report.y); print("]\n");
}
-void ps2_mouse_print(void)
+static void ps2_mouse_print_usb_data(void)
{
if (!debug_mouse) return;
- print("ps2_mouse[btn|x y]: ");
- phex(ps2_mouse_btn); print("|");
- phex(ps2_mouse_x); print(" ");
- phex(ps2_mouse_y); print("\n");
+ print("ps2_mouse usb [btn|x y v h]: [");
+ phex(mouse_report.buttons); print("|");
+ print_hex8((uint8_t)mouse_report.x); print(" ");
+ print_hex8((uint8_t)mouse_report.y); print(" ");
+ print_hex8((uint8_t)mouse_report.v); print(" ");
+ print_hex8((uint8_t)mouse_report.h); print("]\n");
}
@@ -189,6 +221,6 @@ void ps2_mouse_print(void)
* byte|7 6 5 4 3 2 1 0
* ----+--------------------------------------------------------------
* 0|Yovflw Xovflw Ysign Xsign 1 Middle Right Left
- * 1| X movement(0-255)
- * 2| Y movement(0-255)
+ * 1| X movement
+ * 2| Y movement
*/
diff --git a/protocol/ps2_mouse.h b/protocol/ps2_mouse.h
index 4529ce1132..305a9bdbaa 100644
--- a/protocol/ps2_mouse.h
+++ b/protocol/ps2_mouse.h
@@ -20,6 +20,16 @@ along with this program. If not, see .
#include
+#define PS2_MOUSE_READ_DATA 0xEB
+
+/*
+ * Data format:
+ * byte|7 6 5 4 3 2 1 0
+ * ----+--------------------------------------------------------------
+ * 0|Yovflw Xovflw Ysign Xsign 1 Middle Right Left
+ * 1| X movement(0-255)
+ * 2| Y movement(0-255)
+ */
#define PS2_MOUSE_BTN_MASK 0x07
#define PS2_MOUSE_BTN_LEFT 0
#define PS2_MOUSE_BTN_RIGHT 1
@@ -29,16 +39,7 @@ along with this program. If not, see .
#define PS2_MOUSE_X_OVFLW 6
#define PS2_MOUSE_Y_OVFLW 7
-bool ps2_mouse_enable;
-extern uint8_t ps2_mouse_x;
-extern uint8_t ps2_mouse_y;
-extern uint8_t ps2_mouse_btn;
-extern uint8_t ps2_mouse_error_count;
-
uint8_t ps2_mouse_init(void);
-uint8_t ps2_mouse_read(void);
-bool ps2_mouse_changed(void);
-void ps2_mouse_usb_send(void);
-void ps2_mouse_print(void);
+void ps2_mouse_task(void);
#endif
--
cgit v1.2.3
From c6abcb6d893f6ef843ed98be3d45bd804cfe295a Mon Sep 17 00:00:00 2001
From: tmk
Date: Wed, 20 Nov 2013 15:28:58 +0900
Subject: Add build options of ps2_mouse
---
keyboard/onekey/config.h | 1 -
protocol/ps2_mouse.c | 86 ++++++++++++++++++++++--------------------------
protocol/ps2_mouse.h | 21 ++++++++++++
3 files changed, 61 insertions(+), 47 deletions(-)
(limited to 'protocol')
diff --git a/keyboard/onekey/config.h b/keyboard/onekey/config.h
index 8403c9b65b..e99a64850c 100644
--- a/keyboard/onekey/config.h
+++ b/keyboard/onekey/config.h
@@ -69,7 +69,6 @@ along with this program. If not, see .
/* PS/2 mouse */
-#define PS2_MOUSE_DEBUG
#ifdef PS2_USE_BUSYWAIT
# define PS2_CLOCK_PORT PORTD
# define PS2_CLOCK_PIN PIND
diff --git a/protocol/ps2_mouse.c b/protocol/ps2_mouse.c
index ff730196c6..ea629655f7 100644
--- a/protocol/ps2_mouse.c
+++ b/protocol/ps2_mouse.c
@@ -22,23 +22,15 @@ along with this program. If not, see .
#include "ps2_mouse.h"
#include "report.h"
#include "host.h"
-
-#define PS2_MOUSE_DEBUG
-#ifdef PS2_MOUSE_DEBUG
-# include "print.h"
-# include "debug.h"
-#else
-# define print(s)
-# define phex(h)
-# define phex16(h)
-#endif
+#include "timer.h"
+#include "print.h"
+#include "debug.h"
static report_mouse_t mouse_report = {};
-static void ps2_mouse_print_raw_data(void);
-static void ps2_mouse_print_usb_data(void);
+static void print_usb_data(void);
/* supports only 3 button mouse at this time */
@@ -77,10 +69,6 @@ uint8_t ps2_mouse_init(void) {
return 0;
}
-/* scroll support
- * TODO: should be build option
- */
-#define PS2_MOUSE_SCROLL_BUTTON 0x04
#define X_IS_NEG (mouse_report.buttons & (1<.
#define PS2_MOUSE_X_OVFLW 6
#define PS2_MOUSE_Y_OVFLW 7
+
+/*
+ * Scroll by mouse move with pressing button
+ */
+/* mouse button to start scrolling; set 0 to disable scroll */
+#ifndef PS2_MOUSE_SCROLL_BTN_MASK
+#define PS2_MOUSE_SCROLL_BTN_MASK (1<
+Copyright 2010,2011,2012,2013 Jun WAKO
This software is licensed with a Modified BSD License.
All of this is supposed to be Free Software, Open Source, DFSG-free,
@@ -43,7 +43,9 @@ POSSIBILITY OF SUCH DAMAGE.
#include "debug.h"
+#ifndef PS2_USE_INT
static uint8_t recv_data(void);
+#endif
static inline void clock_lo(void);
static inline void clock_hi(void);
static inline bool clock_in(void);
@@ -143,6 +145,9 @@ uint8_t ps2_host_send(uint8_t data)
WAIT(clock_hi, 50, 8);
WAIT(data_hi, 50, 9);
+#ifdef PS2_USE_INT
+ PS2_INT_ON();
+#endif
res = ps2_host_recv_response();
ERROR:
#ifdef PS2_USE_INT
@@ -154,11 +159,15 @@ ERROR:
return res;
}
+#ifndef PS2_USE_INT
/* receive data when host want else inhibit communication */
uint8_t ps2_host_recv_response(void)
{
uint8_t data = 0;
+#ifdef PS2_USE_INT
+ PS2_INT_OFF();
+#endif
/* terminate a transmission if we have */
inhibit();
_delay_us(100);
@@ -173,6 +182,7 @@ uint8_t ps2_host_recv_response(void)
inhibit();
return data;
}
+#endif
#ifndef PS2_USE_INT
uint8_t ps2_host_recv(void)
@@ -187,9 +197,6 @@ static uint8_t pbuf_head = 0;
static uint8_t pbuf_tail = 0;
static inline void pbuf_enqueue(uint8_t data)
{
- if (!data)
- return;
-
uint8_t sreg = SREG;
cli();
uint8_t next = (pbuf_head + 1) % PBUF_SIZE;
@@ -215,6 +222,21 @@ static inline uint8_t pbuf_dequeue(void)
return val;
}
+static inline bool pbuf_has_data(void)
+{
+ uint8_t sreg = SREG;
+ cli();
+ bool has_data = (pbuf_head != pbuf_tail);
+ SREG = sreg;
+ return has_data;
+}
+static inline void pbuf_clear(void)
+{
+ uint8_t sreg = SREG;
+ cli();
+ pbuf_head = pbuf_tail = 0;
+ SREG = sreg;
+}
/* get data received by interrupt */
uint8_t ps2_host_recv(void)
@@ -229,13 +251,12 @@ uint8_t ps2_host_recv(void)
return pbuf_dequeue();
}
-#if 0
-#define DEBUGP_INIT() do { DDRC = 0xFF; } while (0)
-#define DEBUGP(x) do { PORTC = x; } while (0)
-#else
-#define DEBUGP_INIT()
-#define DEBUGP(x)
-#endif
+uint8_t ps2_host_recv_response(void)
+{
+ while (!pbuf_has_data()) ;
+ return pbuf_dequeue();
+}
+
ISR(PS2_INT_VECT)
{
static enum {
@@ -256,7 +277,6 @@ ISR(PS2_INT_VECT)
}
state++;
- DEBUGP(state);
switch (state) {
case START:
if (data_in())
@@ -289,6 +309,7 @@ ISR(PS2_INT_VECT)
if (!data_in())
goto ERROR;
pbuf_enqueue(data);
+//phex(data);
goto DONE;
break;
default:
@@ -296,7 +317,6 @@ ISR(PS2_INT_VECT)
}
goto RETURN;
ERROR:
- DEBUGP(0x0F);
inhibit();
ps2_error = state;
DONE:
@@ -309,11 +329,6 @@ RETURN:
#endif
-static void ps2_reset(void)
-{
- ps2_host_send(0xFF);
-}
-
/* send LED state to keyboard */
void ps2_host_set_led(uint8_t led)
{
@@ -322,6 +337,7 @@ void ps2_host_set_led(uint8_t led)
}
+#ifndef PS2_USE_INT
/* called after start bit comes */
static uint8_t recv_data(void)
{
@@ -361,6 +377,7 @@ static uint8_t recv_data(void)
ERROR:
return 0;
}
+#endif
static inline void clock_lo()
{
diff --git a/protocol/ps2_mouse.c b/protocol/ps2_mouse.c
index ea629655f7..4702f12c40 100644
--- a/protocol/ps2_mouse.c
+++ b/protocol/ps2_mouse.c
@@ -47,20 +47,15 @@ uint8_t ps2_mouse_init(void) {
phex(rcv); phex(ps2_error); print("\n");
// read completion code of BAT
- rcv = ps2_host_recv();
+ rcv = ps2_host_recv_response();
print("ps2_mouse_init: read BAT: ");
phex(rcv); phex(ps2_error); print("\n");
// read Device ID
- rcv = ps2_host_recv();
+ rcv = ps2_host_recv_response();
print("ps2_mouse_init: read DevID: ");
phex(rcv); phex(ps2_error); print("\n");
- // send Enable Data Reporting
- rcv = ps2_host_send(0xF4);
- print("ps2_mouse_init: send 0xF4: ");
- phex(rcv); phex(ps2_error); print("\n");
-
// send Set Remote mode
rcv = ps2_host_send(0xF0);
print("ps2_mouse_init: send 0xF0: ");
--
cgit v1.2.3
From ccbc1dd8e74e89624b6ac4ce6cf474ce6e9fc7ed Mon Sep 17 00:00:00 2001
From: tmk
Date: Thu, 21 Nov 2013 12:15:33 +0900
Subject: Fix PS/2 USART version
---
protocol/ps2_usart.c | 54 ++++++++++++++++++++++++----------------------------
1 file changed, 25 insertions(+), 29 deletions(-)
(limited to 'protocol')
diff --git a/protocol/ps2_usart.c b/protocol/ps2_usart.c
index 9ea6b77868..40c46c497c 100644
--- a/protocol/ps2_usart.c
+++ b/protocol/ps2_usart.c
@@ -1,5 +1,5 @@
/*
-Copyright 2010,2011 Jun WAKO
+Copyright 2010,2011,2012,2013 Jun WAKO
This software is licensed with a Modified BSD License.
All of this is supposed to be Free Software, Open Source, DFSG-free,
@@ -64,14 +64,6 @@ http://www.mcamafia.de/pdf/ibm_hitrc07.pdf
#include "debug.h"
-#if 0
-#define DEBUGP_INIT() do { DDRC = 0xFF; } while (0)
-#define DEBUGP(x) do { PORTC = x; } while (0)
-#else
-#define DEBUGP_INIT()
-#define DEBUGP(x)
-#endif
-
#define WAIT(stat, us, err) do { \
if (!wait_##stat(us)) { \
ps2_error = err; \
@@ -97,12 +89,12 @@ static inline void idle(void);
static inline void inhibit(void);
static inline uint8_t pbuf_dequeue(void);
static inline void pbuf_enqueue(uint8_t data);
+static inline bool pbuf_has_data(void);
+static inline void pbuf_clear(void);
void ps2_host_init(void)
{
- DEBUGP_INIT();
- DEBUGP(0x1);
idle();
PS2_USART_INIT();
PS2_USART_RX_INT_ON();
@@ -114,7 +106,6 @@ uint8_t ps2_host_send(uint8_t data)
bool parity = true;
ps2_error = PS2_ERR_NONE;
- DEBUGP(0x6);
PS2_USART_OFF();
/* terminate a transmission if we have */
@@ -153,6 +144,8 @@ uint8_t ps2_host_send(uint8_t data)
WAIT(clock_hi, 50, 8);
WAIT(data_hi, 50, 9);
+ PS2_USART_INIT();
+ PS2_USART_RX_INT_ON();
res = ps2_host_recv_response();
ERROR:
idle();
@@ -164,15 +157,10 @@ ERROR:
// Do polling data from keyboard to get response to last command.
uint8_t ps2_host_recv_response(void)
{
- uint8_t data = 0;
- PS2_USART_INIT();
- PS2_USART_RX_POLL_ON();
- while (!PS2_USART_RX_READY)
- ;
- data = PS2_USART_RX_DATA;
- PS2_USART_OFF();
- DEBUGP(0x9);
- return data;
+ while (!pbuf_has_data()) {
+ _delay_ms(1); // without this delay it seems to fall into deadlock
+ }
+ return pbuf_dequeue();
}
uint8_t ps2_host_recv(void)
@@ -182,15 +170,11 @@ uint8_t ps2_host_recv(void)
ISR(PS2_USART_RX_VECT)
{
- DEBUGP(0x7);
uint8_t error = PS2_USART_ERROR;
uint8_t data = PS2_USART_RX_DATA;
- if (error) {
- DEBUGP(error>>2);
- } else {
+ if (!error) {
pbuf_enqueue(data);
}
- DEBUGP(0x8);
}
/* send LED state to keyboard */
@@ -293,9 +277,6 @@ static uint8_t pbuf_head = 0;
static uint8_t pbuf_tail = 0;
static inline void pbuf_enqueue(uint8_t data)
{
- if (!data)
- return;
-
uint8_t sreg = SREG;
cli();
uint8_t next = (pbuf_head + 1) % PBUF_SIZE;
@@ -322,3 +303,18 @@ static inline uint8_t pbuf_dequeue(void)
return val;
}
+static inline bool pbuf_has_data(void)
+{
+ uint8_t sreg = SREG;
+ cli();
+ bool has_data = (pbuf_head != pbuf_tail);
+ SREG = sreg;
+ return has_data;
+}
+static inline void pbuf_clear(void)
+{
+ uint8_t sreg = SREG;
+ cli();
+ pbuf_head = pbuf_tail = 0;
+ SREG = sreg;
+}
--
cgit v1.2.3