Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/input/mouse/atarimouse.c
15111 views
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 ([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
* 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 <[email protected]>");
57
MODULE_DESCRIPTION("Atari mouse driver");
58
MODULE_LICENSE("GPL");
59
60
static int mouse_threshold[2] = {2, 2};
61
module_param_array(mouse_threshold, int, NULL, 0);
62
63
#ifdef FIXED_ATARI_JOYSTICK
64
extern int atari_mouse_buttons;
65
#endif
66
67
static struct input_dev *atamouse_dev;
68
69
static void atamouse_interrupt(char *buf)
70
{
71
int buttons, dx, dy;
72
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
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 & 0x4);
87
input_report_key(atamouse_dev, BTN_MIDDLE, buttons & 0x2);
88
input_report_key(atamouse_dev, BTN_RIGHT, buttons & 0x1);
89
90
input_sync(atamouse_dev);
91
92
return;
93
}
94
95
static int atamouse_open(struct input_dev *dev)
96
{
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;
104
105
return 0;
106
}
107
108
static void atamouse_close(struct input_dev *dev)
109
{
110
ikbd_mouse_disable();
111
atari_input_mouse_interrupt_hook = NULL;
112
}
113
114
static int __init atamouse_init(void)
115
{
116
int error;
117
118
if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP))
119
return -ENODEV;
120
121
error = atari_keyb_init();
122
if (error)
123
return error;
124
125
atamouse_dev = input_allocate_device();
126
if (!atamouse_dev)
127
return -ENOMEM;
128
129
atamouse_dev->name = "Atari mouse";
130
atamouse_dev->phys = "atamouse/input0";
131
atamouse_dev->id.bustype = BUS_HOST;
132
atamouse_dev->id.vendor = 0x0001;
133
atamouse_dev->id.product = 0x0002;
134
atamouse_dev->id.version = 0x0100;
135
136
atamouse_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
137
atamouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
138
atamouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) |
139
BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT);
140
141
atamouse_dev->open = atamouse_open;
142
atamouse_dev->close = atamouse_close;
143
144
error = input_register_device(atamouse_dev);
145
if (error) {
146
input_free_device(atamouse_dev);
147
return error;
148
}
149
150
return 0;
151
}
152
153
static void __exit atamouse_exit(void)
154
{
155
input_unregister_device(atamouse_dev);
156
}
157
158
module_init(atamouse_init);
159
module_exit(atamouse_exit);
160
161