summaryrefslogtreecommitdiffstats
path: root/drivers/char/atarimouse.c
blob: b831bd49c5334413f154a2f22b61243ffd05024d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * Atari Mouse Driver for Linux
 * by Robert de Vries (robert@and.nl) 19Jul93
 *
 * 16 Nov 1994 Andreas Schwab
 * Compatibility with busmouse
 * Support for three button mouse (shamelessly stolen from MiNT)
 * third button wired to one of the joystick directions on joystick 1
 *
 * 1996/02/11 Andreas Schwab
 * Module support
 * Allow multiple open's
 *
 * Converted to use new generic busmouse code.  5 Apr 1998
 *   Russell King <rmk@arm.uk.linux.org>
 */

#include <linux/module.h>

#include <linux/sched.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/mm.h>
#include <linux/random.h>
#include <linux/poll.h>
#include <linux/init.h>
#include <linux/logibusmouse.h>

#include <asm/setup.h>
#include <asm/atarikb.h>
#include <asm/uaccess.h>

#include "busmouse.h"

static int msedev;
static int mouse_threshold[2] = {2,2};
MODULE_PARM(mouse_threshold, "2i");
extern int atari_mouse_buttons;

static void atari_mouse_interrupt(char *buf)
{
    int buttons;

/*    ikbd_mouse_disable(); */

    buttons = ((buf[0] & 1)
	       | ((buf[0] & 2) << 1)
	       | (atari_mouse_buttons & 2));
    atari_mouse_buttons = buttons;

    busmouse_add_movementbuttons(msedev, buf[1], -buf[2], buttons ^ 7);
/*    ikbd_mouse_rel_pos(); */
}

static int release_mouse(struct inode *inode, struct file *file)
{
    ikbd_mouse_disable();

    atari_mouse_interrupt_hook = NULL;
    MOD_DEC_USE_COUNT;
    return 0;
}

static int open_mouse(struct inode *inode, struct file *file)
{
    atari_mouse_buttons = 0;
    ikbd_mouse_y0_top ();
    ikbd_mouse_thresh (mouse_threshold[0], mouse_threshold[1]);
    ikbd_mouse_rel_pos();
    MOD_INC_USE_COUNT;
    atari_mouse_interrupt_hook = atari_mouse_interrupt;
    return 0;
}

static struct busmouse atarimouse = {
	ATARIMOUSE_MINOR, "atarimouse", open_mouse, release_mouse, 0
};

int __init atari_mouse_init(void)
{
    if (!MACH_IS_ATARI)
	return -ENODEV;
    msedev = register_busmouse(&atarimouse);
    if (msedev < 0)
    	printk(KERN_WARNING "Unable to register Atari mouse driver.\n");
    else
    	printk(KERN_INFO "Atari mouse installed.\n");
    return msedev < 0 ? msedev : 0;
}


#define	MIN_THRESHOLD 1
#define	MAX_THRESHOLD 20	/* more seems not reasonable... */

void __init atari_mouse_setup( char *str, int *ints )
{
    if (ints[0] < 1) {
	printk( "atari_mouse_setup: no arguments!\n" );
	return;
    }
    else if (ints[0] > 2) {
	printk( "atari_mouse_setup: too many arguments\n" );
    }

    if (ints[1] < MIN_THRESHOLD || ints[1] > MAX_THRESHOLD)
	printk( "atari_mouse_setup: bad threshold value (ignored)\n" );
    else {
	mouse_threshold[0] = ints[1];
	mouse_threshold[1] = ints[1];
	if (ints[0] > 1) {
	    if (ints[2] < MIN_THRESHOLD || ints[2] > MAX_THRESHOLD)
		printk("atari_mouse_setup: bad threshold value (ignored)\n" );
	    else
		mouse_threshold[1] = ints[2];
	}
    }
	
}

#ifdef MODULE
int init_module(void)
{
	return atari_mouse_init();
}

void cleanup_module(void)
{
	unregister_busmouse(msedev);
}
#endif