⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atarimouse.c

📁 powerpc内核mpc8241linux系统下char驱动程序
💻 C
字号:
/* * 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 */#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/busmouse.h>#include <asm/setup.h>#include <asm/atarikb.h>#include <asm/uaccess.h>static struct mouse_status mouse;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 ? 1 : 0)	       | (buf[0] & 2 ? 4 : 0)	       | (atari_mouse_buttons & 2));    atari_mouse_buttons = buttons;    add_mouse_randomness((buttons << 16) + (buf[2] << 8) + buf[1]);    mouse.buttons = ~buttons & 7;    mouse.dx += buf[1];    mouse.dy -= buf[2];    mouse.ready = 1;    wake_up_interruptible(&mouse.wait);    if (mouse.fasyncptr)	kill_fasync(mouse.fasyncptr, SIGIO);/*    ikbd_mouse_rel_pos(); */}static int fasync_mouse(int fd, struct file *filp, int on){	int retval;	retval = fasync_helper(fd, filp, on, &mouse.fasyncptr);	if (retval < 0)		return retval;	return 0;}static int release_mouse(struct inode *inode, struct file *file){    fasync_mouse(-1, file, 0);    if (--mouse.active)      return 0;    ikbd_mouse_disable();    atari_mouse_interrupt_hook = NULL;    MOD_DEC_USE_COUNT;    return 0;}static int open_mouse(struct inode *inode, struct file *file){    if (mouse.active++)	return 0;    mouse.ready = 0;    mouse.dx = mouse.dy = 0;    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 ssize_t write_mouse(struct file *file, const char *buffer,			  size_t count, loff_t *ppos){    return -EINVAL;}static ssize_t read_mouse(struct file * file, char * buffer,			  size_t count, loff_t *ppos){    int dx, dy, buttons;    if (count < 3)	return -EINVAL;    if (!mouse.ready)	return -EAGAIN;    /* ikbd_mouse_disable */    dx = mouse.dx;    dy = mouse.dy;    buttons = mouse.buttons;    if (dx > 127)      dx = 127;    else if (dx < -128)      dx = -128;    if (dy > 127)      dy = 127;    else if (dy < -128)      dy = -128;    mouse.dx -= dx;    mouse.dy -= dy;    if (mouse.dx == 0 && mouse.dy == 0)      mouse.ready = 0;    /* ikbd_mouse_rel_pos(); */    if (put_user(buttons | 0x80, buffer++) ||	put_user((char) dx, buffer++) ||	put_user((char) dy, buffer++))	return -EFAULT;    if (count > 3)	if (clear_user(buffer, count - 3))	    return -EFAULT;    return count;}static unsigned int mouse_poll(struct file *file, poll_table *wait){	poll_wait(file, &mouse.wait, wait);	if (mouse.ready)		return POLLIN | POLLRDNORM;	return 0;}struct file_operations atari_mouse_fops = {    NULL,		/* mouse_seek */    read_mouse,    write_mouse,    NULL,		/* mouse_readdir */    mouse_poll,    NULL,		/* mouse_ioctl */    NULL,		/* mouse_mmap */    open_mouse,    NULL,		/* flush */    release_mouse,    NULL,    fasync_mouse,};static struct miscdevice atari_mouse = {    ATARIMOUSE_MINOR, "atarimouse", &atari_mouse_fops};__initfunc(int atari_mouse_init(void)){	int r;	if (!MACH_IS_ATARI)		return -ENODEV;	mouse.active = 0;	mouse.ready = 0;	mouse.wait = NULL;	r = misc_register(&atari_mouse);	if (r)		return r;	printk(KERN_INFO "Atari mouse installed.\n");	return 0;}#define	MIN_THRESHOLD 1#define	MAX_THRESHOLD 20	/* more seems not reasonable... */__initfunc(void 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 MODULEint init_module(void){	return atari_mouse_init();}void cleanup_module(void){  misc_deregister(&atari_mouse);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -