Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 1 | /* |
| 2 | * Atari mouse driver for Linux/m68k |
| 3 | * |
| 4 | * Copyright (c) 2005 Michael Schmitz |
| 5 | * |
| 6 | * Based on: |
| 7 | * Amiga mouse driver for Linux/m68k |
| 8 | * |
| 9 | * Copyright (c) 2000-2002 Vojtech Pavlik |
| 10 | * |
| 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 (robert@and.nl) 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 <rmk@arm.uk.linux.org> |
| 34 | */ |
| 35 | |
| 36 | |
| 37 | /* |
| 38 | * This program is free software; you can redistribute it and/or modify it |
| 39 | * under the terms of the GNU General Public License version 2 as published by |
| 40 | * the Free Software Foundation |
| 41 | */ |
| 42 | |
| 43 | #include <linux/module.h> |
| 44 | #include <linux/init.h> |
| 45 | #include <linux/input.h> |
| 46 | #include <linux/interrupt.h> |
| 47 | |
| 48 | #include <asm/irq.h> |
| 49 | #include <asm/setup.h> |
| 50 | #include <asm/system.h> |
| 51 | #include <asm/uaccess.h> |
| 52 | #include <asm/atarihw.h> |
| 53 | #include <asm/atarikb.h> |
| 54 | #include <asm/atariints.h> |
| 55 | |
| 56 | MODULE_AUTHOR("Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>"); |
| 57 | MODULE_DESCRIPTION("Atari mouse driver"); |
| 58 | MODULE_LICENSE("GPL"); |
| 59 | |
Dmitry Torokhov | 82547e9 | 2008-06-02 01:03:24 -0400 | [diff] [blame] | 60 | static int mouse_threshold[2] = {2, 2}; |
| 61 | module_param_array(mouse_threshold, int, NULL, 0); |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 62 | |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 63 | #ifdef FIXED_ATARI_JOYSTICK |
| 64 | extern int atari_mouse_buttons; |
| 65 | #endif |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 66 | |
| 67 | static struct input_dev *atamouse_dev; |
| 68 | |
| 69 | static void atamouse_interrupt(char *buf) |
| 70 | { |
| 71 | int buttons, dx, dy; |
| 72 | |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 73 | buttons = (buf[0] & 1) | ((buf[0] & 2) << 1); |
| 74 | #ifdef FIXED_ATARI_JOYSTICK |
| 75 | buttons |= atari_mouse_buttons & 2; |
| 76 | atari_mouse_buttons = buttons; |
| 77 | #endif |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 78 | |
| 79 | /* only relative events get here */ |
| 80 | dx = buf[1]; |
| 81 | dy = -buf[2]; |
| 82 | |
| 83 | input_report_rel(atamouse_dev, REL_X, dx); |
| 84 | input_report_rel(atamouse_dev, REL_Y, dy); |
| 85 | |
| 86 | input_report_key(atamouse_dev, BTN_LEFT, buttons & 0x1); |
| 87 | input_report_key(atamouse_dev, BTN_MIDDLE, buttons & 0x2); |
| 88 | input_report_key(atamouse_dev, BTN_RIGHT, buttons & 0x4); |
| 89 | |
| 90 | input_sync(atamouse_dev); |
| 91 | |
| 92 | return; |
| 93 | } |
| 94 | |
| 95 | static int atamouse_open(struct input_dev *dev) |
| 96 | { |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 97 | #ifdef FIXED_ATARI_JOYSTICK |
| 98 | atari_mouse_buttons = 0; |
| 99 | #endif |
| 100 | ikbd_mouse_y0_top(); |
| 101 | ikbd_mouse_thresh(mouse_threshold[0], mouse_threshold[1]); |
| 102 | ikbd_mouse_rel_pos(); |
| 103 | atari_input_mouse_interrupt_hook = atamouse_interrupt; |
Dmitry Torokhov | 82547e9 | 2008-06-02 01:03:24 -0400 | [diff] [blame] | 104 | |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 105 | return 0; |
| 106 | } |
| 107 | |
| 108 | static void atamouse_close(struct input_dev *dev) |
| 109 | { |
Dmitry Torokhov | 82547e9 | 2008-06-02 01:03:24 -0400 | [diff] [blame] | 110 | ikbd_mouse_disable(); |
| 111 | atari_mouse_interrupt_hook = NULL; |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 112 | } |
| 113 | |
| 114 | static int __init atamouse_init(void) |
| 115 | { |
Dmitry Torokhov | 82547e9 | 2008-06-02 01:03:24 -0400 | [diff] [blame] | 116 | int error; |
| 117 | |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 118 | if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP)) |
| 119 | return -ENODEV; |
| 120 | |
Dmitry Torokhov | 82547e9 | 2008-06-02 01:03:24 -0400 | [diff] [blame] | 121 | if (!atari_keyb_init()) |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 122 | return -ENODEV; |
| 123 | |
Geert Uytterhoeven | 6615c5b | 2007-10-13 14:31:24 +0200 | [diff] [blame] | 124 | atamouse_dev = input_allocate_device(); |
| 125 | if (!atamouse_dev) |
| 126 | return -ENOMEM; |
| 127 | |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 128 | atamouse_dev->name = "Atari mouse"; |
| 129 | atamouse_dev->phys = "atamouse/input0"; |
Geert Uytterhoeven | 6615c5b | 2007-10-13 14:31:24 +0200 | [diff] [blame] | 130 | atamouse_dev->id.bustype = BUS_HOST; |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 131 | atamouse_dev->id.vendor = 0x0001; |
| 132 | atamouse_dev->id.product = 0x0002; |
| 133 | atamouse_dev->id.version = 0x0100; |
| 134 | |
Jiri Slaby | 7b19ada | 2007-10-18 23:40:32 -0700 | [diff] [blame] | 135 | atamouse_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); |
| 136 | atamouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); |
| 137 | atamouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | |
| 138 | BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); |
Dmitry Torokhov | 82547e9 | 2008-06-02 01:03:24 -0400 | [diff] [blame] | 139 | |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 140 | atamouse_dev->open = atamouse_open; |
| 141 | atamouse_dev->close = atamouse_close; |
| 142 | |
Dmitry Torokhov | 82547e9 | 2008-06-02 01:03:24 -0400 | [diff] [blame] | 143 | error = input_register_device(atamouse_dev); |
| 144 | if (error) { |
Geert Uytterhoeven | 6615c5b | 2007-10-13 14:31:24 +0200 | [diff] [blame] | 145 | input_free_device(atamouse_dev); |
Dmitry Torokhov | 82547e9 | 2008-06-02 01:03:24 -0400 | [diff] [blame] | 146 | return error; |
Geert Uytterhoeven | 6615c5b | 2007-10-13 14:31:24 +0200 | [diff] [blame] | 147 | } |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 148 | |
Michael Schmitz | c04cb85 | 2007-05-01 22:32:38 +0200 | [diff] [blame] | 149 | return 0; |
| 150 | } |
| 151 | |
| 152 | static void __exit atamouse_exit(void) |
| 153 | { |
| 154 | input_unregister_device(atamouse_dev); |
| 155 | } |
| 156 | |
| 157 | module_init(atamouse_init); |
| 158 | module_exit(atamouse_exit); |