[PATCH] m68k: Add Eiffel PS/2 support for Atari mouse driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Petr, Geert,

The only reason for reviving the joystick hack would have been to have a 
'standard' way of passing a third mouse button. If the PS/2 adapter is that 
standard way now, that's fine. I'll just need to know what interrupt/device this 
is hooked up to, and what the data format is. 

It just adds new scancodes - I have provided a link to the scan codes
table in one of my previous mails.

The middle mouse button is mapped to scancode 0x37 (IIRC) while the
mouse wheels are provided in IKBD status packet.

I've written the first part of the Eiffel PS/2 mouse support, adding middle 
mouse button support based on the scancode you specified. Implementing the 
middle mouse button as a toggle is a bit awkward :-( It's basically what the 
joystick middle mouse button code did, so it should hopefully work. Comments 
welcome.

I've not tested the code beyond making sure the two regular buttons still work - 
I do not quite see how to activate Eiffel mouse support in ARAnyM. Maybe I'll 
hijack another scancode for the tests.

Adding the wheel events looks quite straightforward; I'll get to that later. 

Signed-off-by: Michael Schmitz <schmitz@xxxxxxxxxx>

---
 arch/m68k/atari/atakeyb.c        |   27 ++++++++++++++++++++++-
 drivers/input/mouse/atarimouse.c |   44 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/arch/m68k/atari/atakeyb.c b/arch/m68k/atari/atakeyb.c
index 2c16dcb..83209fa 100644
--- a/arch/m68k/atari/atakeyb.c
+++ b/arch/m68k/atari/atakeyb.c
@@ -55,6 +55,8 @@ static unsigned long broken_keys[128/(sizeof(unsigned long)*8)] = { 0, };
 
 #define BREAK_MASK	(0x80)
 
+#define SUPPORT_EIFFEL	1
+
 /*
  * ++roman: The following changes were applied manually:
  *
@@ -189,6 +191,22 @@ repeat:
 				kb_state.len = 1;
 				kb_state.buf[0] = scancode;
 				break;
+#if defined (SUPPORT_EIFFEL)
+			case 0x37:	/* middle button clicked */
+				kb_state.state = RMOUSE;
+				kb_state.len = 3;
+				kb_state.buf[0] = 0xFC;
+				kb_state.buf[1] = 0;
+				kb_state.buf[2] = 0;
+				break;
+			case 0xB7:	/* middle button released */
+				kb_state.state = RMOUSE;
+				kb_state.len = 3;
+				kb_state.buf[0] = 0xF4;
+				kb_state.buf[1] = 0;
+				kb_state.buf[2] = 0;
+				break;
+#endif
 
 			case 0xFC:
 				kb_state.state = CLOCK;
@@ -252,6 +270,9 @@ repeat:
 			kb_state.buf[kb_state.len++] = scancode;
 			if (kb_state.len == 5) {
 				kb_state.state = KEYBOARD;
+#if defined (DEBUG)
+				printk(KERN_INFO "atakeyb: AMOUSE %d %d %d %d %d\n", kb_state.buf[0], kb_state.buf[1], kb_state.buf[2], kb_state.buf[4], kb_state.buf[4]);
+#endif
 				/* not yet used */
 				/* wake up someone waiting for this */
 			}
@@ -261,8 +282,12 @@ repeat:
 			kb_state.buf[kb_state.len++] = scancode;
 			if (kb_state.len == 3) {
 				kb_state.state = KEYBOARD;
-				if (atari_input_mouse_interrupt_hook)
+				if (atari_input_mouse_interrupt_hook) {
+#if defined (DEBUG)
+					printk(KERN_INFO "atakeyb: RMOUSE packet\n");
+#endif
 					atari_input_mouse_interrupt_hook(kb_state.buf);
+				}
 			}
 			break;
 
diff --git a/drivers/input/mouse/atarimouse.c b/drivers/input/mouse/atarimouse.c
index 1b5f4dd..e5274cf 100644
--- a/drivers/input/mouse/atarimouse.c
+++ b/drivers/input/mouse/atarimouse.c
@@ -60,25 +60,62 @@ MODULE_LICENSE("GPL");
 static int mouse_threshold[2] = {2, 2};
 module_param_array(mouse_threshold, int, NULL, 0);
 
+#define SUPPORT_EIFFEL 1
+
 #ifdef FIXED_ATARI_JOYSTICK
 extern int atari_mouse_buttons;
 #endif
+#if defined (SUPPORT_EIFFEL)
+static int eiffel_mouse_buttons;
+#endif
 
 static struct input_dev *atamouse_dev;
 
 static void atamouse_interrupt(char *buf)
 {
 	int buttons, dx, dy;
+#if defined (DEBUG)
+	printk(KERN_INFO "atarimouse: %x %x %x\n", buf[0], buf[1], buf[2]);
+#endif
+#if defined (SUPPORT_EIFFEL)
+	if ((buf[0] & 0xc) == 0x8)	/* real mouse packet */
+#endif
+	buttons = ((buf[0] & 1) << 2) | ((buf[0] & 2) >> 1);
 
-	buttons = (buf[0] & 1) | ((buf[0] & 2) << 1);
 #ifdef FIXED_ATARI_JOYSTICK
 	buttons |= atari_mouse_buttons & 2;
 	atari_mouse_buttons = buttons;
 #endif
 
+#if defined (SUPPORT_EIFFEL)
+	if (buf[1] == 0 && buf[2] == 0 && (buf[0] & 4)) { 
+		/* middle mouse button toggle */
+		switch (buf[0]) {
+		case 0xFC:
+			eiffel_mouse_buttons |= 0x2; 
+			break;
+		case 0xF4:
+			eiffel_mouse_buttons &= ~0x2; 
+			break;
+		default:
+			break;		
+		}
+	}
+	buttons |= eiffel_mouse_buttons & 2;
+	eiffel_mouse_buttons = buttons;
+#endif
+
 	/* only relative events get here */
 	dx =  buf[1];
+#if defined (CONFIG_ARANYM)
+	dy =  buf[2];
+#else
 	dy = -buf[2];
+#endif
+
+#if defined (DEBUG)
+	printk(KERN_INFO "atarimouse: dx %d dy %d buttons %x\n", dx, dy, buttons);
+#endif
 
 	input_report_rel(atamouse_dev, REL_X, dx);
 	input_report_rel(atamouse_dev, REL_Y, dy);
@@ -97,7 +134,12 @@ static int atamouse_open(struct input_dev *dev)
 #ifdef FIXED_ATARI_JOYSTICK
 	atari_mouse_buttons = 0;
 #endif
+#if defined (CONFIG_ARANYM)
+	printk(KERN_INFO "atarimouse: set reference origin=bottom (ARAnyM mode)!\n");
+	ikbd_mouse_y0_bot();
+#else
 	ikbd_mouse_y0_top();
+#endif
 	ikbd_mouse_thresh(mouse_threshold[0], mouse_threshold[1]);
 	ikbd_mouse_rel_pos();
 	atari_input_mouse_interrupt_hook = atamouse_interrupt;
--
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Video for Linux]     [Yosemite News]     [Linux S/390]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux