amigamouse.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Amiga Mouse Driver for Linux 68k by Michael Rausch
  3.  * based upon:
  4.  *
  5.  * Logitech Bus Mouse Driver for Linux
  6.  * by James Banks
  7.  *
  8.  * Mods by Matthew Dillon
  9.  *   calls verify_area()
  10.  *   tracks better when X is busy or paging
  11.  *
  12.  * Heavily modified by David Giller
  13.  *   changed from queue- to counter- driven
  14.  *   hacked out a (probably incorrect) mouse_poll
  15.  *
  16.  * Modified again by Nathan Laredo to interface with
  17.  *   0.96c-pl1 IRQ handling changes (13JUL92)
  18.  *   didn't bother touching poll code.
  19.  *
  20.  * Modified the poll() code blindly to conform to the VFS
  21.  *   requirements. 92.07.14 - Linus. Somebody should test it out.
  22.  *
  23.  * Modified by Johan Myreen to make room for other mice (9AUG92)
  24.  *   removed assignment chr_fops[10] = &mouse_fops; see mouse.c
  25.  *   renamed mouse_fops => bus_mouse_fops, made bus_mouse_fops public.
  26.  *   renamed this file mouse.c => busmouse.c
  27.  *
  28.  * Modified for use in the 1.3 kernels by Jes Sorensen.
  29.  *
  30.  * Moved the isr-allocation to the mouse_{open,close} calls, as there
  31.  *   is no reason to service the mouse in the vertical blank isr if
  32.  *   the mouse is not in use.             Jes Sorensen
  33.  *
  34.  * Converted to use new generic busmouse code.  5 Apr 1998
  35.  *   Russell King <rmk@arm.uk.linux.org>
  36.  */
  37. #include <linux/module.h>
  38. #include <linux/types.h>
  39. #include <linux/kernel.h>
  40. #include <linux/sched.h>
  41. #include <linux/mm.h>
  42. #include <linux/signal.h>
  43. #include <linux/errno.h>
  44. #include <linux/miscdevice.h>
  45. #include <linux/random.h>
  46. #include <linux/poll.h>
  47. #include <linux/init.h>
  48. #include <linux/ioport.h>
  49. #include <linux/logibusmouse.h>
  50. #include <asm/setup.h>
  51. #include <asm/system.h>
  52. #include <asm/uaccess.h>
  53. #include <asm/irq.h>
  54. #include <asm/amigahw.h>
  55. #include <asm/amigaints.h>
  56. #include "busmouse.h"
  57. #if AMIGA_OLD_INT
  58. #define AMI_MSE_INT_ON() mouseint_allowed = 1
  59. #define AMI_MSE_INT_OFF() mouseint_allowed = 0
  60. static int mouseint_allowed;
  61. #endif
  62. static int msedev;
  63. static void mouse_interrupt(int irq, void *dummy, struct pt_regs *fp)
  64. {
  65. static int lastx=0, lasty=0;
  66. int dx, dy;
  67. int nx, ny;
  68. unsigned char buttons;
  69. unsigned short joy0dat, potgor;
  70. #if AMIGA_OLD_INT
  71. if(!mouseint_allowed)
  72. return;
  73. AMI_MSE_INT_OFF();
  74. #endif
  75. /*
  76.  *  This routine assumes, just like Kickstart, that the mouse
  77.  *  has not moved more than 127 ticks since last VBL.
  78.  */
  79. joy0dat = custom.joy0dat;
  80. nx = joy0dat & 0xff;
  81. ny = joy0dat >> 8;
  82. dx = nx - lastx;
  83. if (dx < - 127)
  84. dx = (256 + nx) - lastx;
  85. if (dx > 127)
  86. dx = (nx - 256) - lastx;
  87. dy = ny - lasty;
  88. if (dy < - 127)
  89. dy = (256 + ny) - lasty;
  90. if (dy > 127)
  91. dy = (ny - 256) - lasty;
  92. lastx = nx;
  93. lasty = ny;
  94. #if 0
  95. dx = -lastdx;
  96. dx += (lastdx = joy0dat & 0xff);
  97. if (dx < -127)
  98.     dx = -255-dx; /* underrun */
  99. else
  100. if (dx > 127)
  101.     dx = 255-dx; /* overflow */
  102. dy = -lastdy;
  103. dy += (lastdy = joy0dat >> 8);
  104. if (dy < -127)
  105.     dy = -255-dy;
  106. else
  107. if (dy > 127)
  108.     dy = 255-dy;
  109. #endif
  110. potgor = custom.potgor;
  111. buttons = (ciaa.pra & 0x40 ? 4 : 0) | /* left button; note that the bits are low-active, as are the expected results -> double negation */
  112. #if 1
  113.   (potgor & 0x0100 ? 2 : 0) | /* middle button; emulation goes here */
  114. #endif
  115.   (potgor & 0x0400 ? 1 : 0); /* right button */
  116. busmouse_add_movementbuttons(msedev, dx, -dy, buttons);
  117. #if AMIGA_OLD_INT
  118. AMI_MSE_INT_ON();
  119. #endif
  120. }
  121. /*
  122.  * close access to the mouse
  123.  */
  124. static int release_mouse(struct inode * inode, struct file * file)
  125. {
  126. free_irq(IRQ_AMIGA_VERTB, mouse_interrupt);
  127. #if AMIGA_OLD_INT
  128. AMI_MSE_INT_OFF();
  129. #endif
  130. return 0;
  131. }
  132. /*
  133.  * open access to the mouse, currently only one open is
  134.  * allowed.
  135.  */
  136. static int open_mouse(struct inode * inode, struct file * file)
  137. {
  138. /*
  139.  *  use VBL to poll mouse deltas
  140.  */
  141. if(request_irq(IRQ_AMIGA_VERTB, mouse_interrupt, 0,
  142.                "Amiga mouse", mouse_interrupt)) {
  143. printk(KERN_INFO "Installing Amiga mouse failed.n");
  144. return -EIO;
  145. }
  146. #if AMIGA_OLD_INT
  147. AMI_MSE_INT_ON();
  148. #endif
  149. return 0;
  150. }
  151. static struct busmouse amigamouse = {
  152. AMIGAMOUSE_MINOR, "amigamouse", THIS_MODULE, open_mouse, release_mouse, 7
  153. };
  154. static int __init amiga_mouse_init(void)
  155. {
  156. if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_MOUSE))
  157. return -ENODEV;
  158. if (!request_mem_region(CUSTOM_PHYSADDR+10, 2, "amigamouse [Denise]"))
  159. return -EBUSY;
  160. custom.joytest = 0; /* reset counters */
  161. #if AMIGA_OLD_INT
  162. AMI_MSE_INT_OFF();
  163. #endif
  164. msedev = register_busmouse(&amigamouse);
  165. if (msedev < 0)
  166. printk(KERN_WARNING "Unable to install Amiga mouse driver.n");
  167. else
  168. printk(KERN_INFO "Amiga mouse installed.n");
  169. return msedev < 0 ? msedev : 0;
  170. }
  171. static void __exit amiga_mouse_exit(void)
  172. {
  173. unregister_busmouse(msedev);
  174. release_mem_region(CUSTOM_PHYSADDR+10, 2);
  175. }
  176. module_init(amiga_mouse_init);
  177. module_exit(amiga_mouse_exit);
  178. MODULE_LICENSE("GPL");