| 1 | |
| 2 | |
| 3 | * Atari mouse driver for Linux/m68k
|
| 4 | *
|
| 5 | * Copyright (c) 2005 Michael Schmitz
|
| 6 | *
|
| 7 | * Based on:
|
| 8 | * Amiga mouse driver for Linux/m68k
|
| 9 | *
|
| 10 | * Copyright (c) 2000-2002 Vojtech Pavlik
|
| 11 |
|
| 12 | |
| 13 | * The low level init and interrupt stuff is handled in arch/mm68k/atari/atakeyb.c
|
| 14 | * (the keyboard ACIA also handles the mouse and joystick data, and the keyboard
|
| 15 | * interrupt is shared with the MIDI ACIA so MIDI data also get handled there).
|
| 16 | * This driver only deals with handing key events off to the input layer.
|
| 17 | *
|
| 18 | * Largely based on the old:
|
| 19 | *
|
| 20 | * Atari Mouse Driver for Linux
|
| 21 | * by Robert de Vries ([email protected]) 19Jul93
|
| 22 | *
|
| 23 | * 16 Nov 1994 Andreas Schwab
|
| 24 | * Compatibility with busmouse
|
| 25 | * Support for three button mouse (shamelessly stolen from MiNT)
|
| 26 | * third button wired to one of the joystick directions on joystick 1
|
| 27 | *
|
| 28 | * 1996/02/11 Andreas Schwab
|
| 29 | * Module support
|
| 30 | * Allow multiple open's
|
| 31 | *
|
| 32 | * Converted to use new generic busmouse code. 5 Apr 1998
|
| 33 | * Russell King <[email protected]>
|
| 34 |
|
| 35 |
|
| 36 |
|
| 37 |
|
| 38 | #include <linux/module.h>
|
| 39 | #include <linux/init.h>
|
| 40 | #include <linux/input.h>
|
| 41 | #include <linux/interrupt.h>
|
| 42 |
|
| 43 | #include <asm/irq.h>
|
| 44 | #include <asm/setup.h>
|
| 45 | #include <linux/uaccess.h>
|
| 46 | #include <asm/atarihw.h>
|
| 47 | #include <asm/atarikb.h>
|
| 48 | #include <asm/atariints.h>
|
| 49 |
|
| 50 | MODULE_AUTHOR("Michael Schmitz <[email protected]>");
|
| 51 | MODULE_DESCRIPTION("Atari mouse driver");
|
| 52 | MODULE_LICENSE("GPL");
|
| 53 |
|
| 54 | static int mouse_threshold[2] = {2, 2};
|
| 55 | module_param_array(mouse_threshold, int, NULL, 0);
|
| 56 |
|
| 57 | #ifdef FIXED_ATARI_JOYSTICK
|
| 58 | extern int atari_mouse_buttons;
|
| 59 | #endif
|
| 60 |
|
| 61 | static struct input_dev *atamouse_dev;
|
| 62 |
|
| 63 | static void atamouse_interrupt(char *buf)
|
| 64 | {
|
| 65 | int buttons, dx, dy;
|
| 66 |
|
| 67 | buttons = (buf[0] & 1) | ((buf[0] & 2) << 1);
|
| 68 | #ifdef FIXED_ATARI_JOYSTICK
|
| 69 | buttons |= atari_mouse_buttons & 2;
|
| 70 | atari_mouse_buttons = buttons;
|
| 71 | #endif
|
| 72 |
|
| 73 |
|
| 74 | dx = buf[1];
|
| 75 | dy = buf[2];
|
| 76 |
|
| 77 | input_report_rel(atamouse_dev, REL_X, dx);
|
| 78 | input_report_rel(atamouse_dev, REL_Y, dy);
|
| 79 |
|
| 80 | input_report_key(atamouse_dev, BTN_LEFT, buttons & 0x4);
|
| 81 | input_report_key(atamouse_dev, BTN_MIDDLE, buttons & 0x2);
|
| 82 | input_report_key(atamouse_dev, BTN_RIGHT, buttons & 0x1);
|
| 83 |
|
| 84 | input_sync(atamouse_dev);
|
| 85 |
|
| 86 | return;
|
| 87 | }
|
| 88 |
|
| 89 | static int atamouse_open(struct input_dev *dev)
|
| 90 | {
|
| 91 | #ifdef FIXED_ATARI_JOYSTICK
|
| 92 | atari_mouse_buttons = 0;
|
| 93 | #endif
|
| 94 | ikbd_mouse_y0_top();
|
| 95 | ikbd_mouse_thresh(mouse_threshold[0], mouse_threshold[1]);
|
| 96 | ikbd_mouse_rel_pos();
|
| 97 | atari_input_mouse_interrupt_hook = atamouse_interrupt;
|
| 98 |
|
| 99 | return 0;
|
| 100 | }
|
| 101 |
|
| 102 | static void atamouse_close(struct input_dev *dev)
|
| 103 | {
|
| 104 | ikbd_mouse_disable();
|
| 105 | atari_input_mouse_interrupt_hook = NULL;
|
| 106 | }
|
| 107 |
|
| 108 | static int __init atamouse_init(void)
|
| 109 | {
|
| 110 | int error;
|
| 111 |
|
| 112 | if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP))
|
| 113 | return -ENODEV;
|
| 114 |
|
| 115 | error = atari_keyb_init();
|
| 116 | if (error)
|
| 117 | return error;
|
| 118 |
|
| 119 | atamouse_dev = input_allocate_device();
|
| 120 | if (!atamouse_dev)
|
| 121 | return -ENOMEM;
|
| 122 |
|
| 123 | atamouse_dev->name = "Atari mouse";
|
| 124 | atamouse_dev->phys = "atamouse/input0";
|
| 125 | atamouse_dev->id.bustype = BUS_HOST;
|
| 126 | atamouse_dev->id.vendor = 0x0001;
|
| 127 | atamouse_dev->id.product = 0x0002;
|
| 128 | atamouse_dev->id.version = 0x0100;
|
| 129 |
|
| 130 | atamouse_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
|
| 131 | atamouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
|
| 132 | atamouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) |
|
| 133 | BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT);
|
| 134 |
|
| 135 | atamouse_dev->open = atamouse_open;
|
| 136 | atamouse_dev->close = atamouse_close;
|
| 137 |
|
| 138 | error = input_register_device(atamouse_dev);
|
| 139 | if (error) {
|
| 140 | input_free_device(atamouse_dev);
|
| 141 | return error;
|
| 142 | }
|
| 143 |
|
| 144 | return 0;
|
| 145 | }
|
| 146 |
|
| 147 | static void __exit atamouse_exit(void)
|
| 148 | {
|
| 149 | input_unregister_device(atamouse_dev);
|
| 150 | }
|
| 151 |
|
| 152 | module_init(atamouse_init);
|
| 153 | module_exit(atamouse_exit);
|