input.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: input.c,v 1.20 2001/05/17 15:50:27 vojtech Exp $
  3.  *
  4.  *  Copyright (c) 1999-2001 Vojtech Pavlik
  5.  *
  6.  *  The input layer module itself
  7.  *
  8.  *  Sponsored by SuSE
  9.  */
  10. /*
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or 
  14.  * (at your option) any later version.
  15.  * 
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  * 
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  24.  * 
  25.  * Should you need to contact me, the author, you can do so either by
  26.  * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail:
  27.  * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
  28.  */
  29. #include <linux/init.h>
  30. #include <linux/sched.h>
  31. #include <linux/smp_lock.h>
  32. #include <linux/input.h>
  33. #include <linux/module.h>
  34. #include <linux/random.h>
  35. MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
  36. MODULE_DESCRIPTION("Input layer module");
  37. MODULE_LICENSE("GPL");
  38. EXPORT_SYMBOL(input_register_device);
  39. EXPORT_SYMBOL(input_unregister_device);
  40. EXPORT_SYMBOL(input_register_handler);
  41. EXPORT_SYMBOL(input_unregister_handler);
  42. EXPORT_SYMBOL(input_register_minor);
  43. EXPORT_SYMBOL(input_unregister_minor);
  44. EXPORT_SYMBOL(input_open_device);
  45. EXPORT_SYMBOL(input_close_device);
  46. EXPORT_SYMBOL(input_event);
  47. #define INPUT_MAJOR 13
  48. #define INPUT_DEVICES 256
  49. static struct input_dev *input_dev;
  50. static struct input_handler *input_handler;
  51. static struct input_handler *input_table[8];
  52. static devfs_handle_t input_devfs_handle;
  53. static int input_number;
  54. static long input_devices[NBITS(INPUT_DEVICES)];
  55. void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
  56. {
  57. struct input_handle *handle = dev->handle;
  58. /*
  59.  * Filter non-events, and bad input values out.
  60.  */
  61. if (type > EV_MAX || !test_bit(type, dev->evbit))
  62. return;
  63. switch (type) {
  64. case EV_KEY:
  65. if (code > KEY_MAX || !test_bit(code, dev->keybit) || !!test_bit(code, dev->key) == value)
  66. return;
  67. if (value == 2) break;
  68. change_bit(code, dev->key);
  69. if (test_bit(EV_REP, dev->evbit) && dev->timer.function) {
  70. if (value) {
  71. mod_timer(&dev->timer, jiffies + dev->rep[REP_DELAY]);
  72. dev->repeat_key = code;
  73. break;
  74. }
  75. if (dev->repeat_key == code)
  76. del_timer(&dev->timer);
  77. }
  78. break;
  79. case EV_ABS:
  80. if (code > ABS_MAX || !test_bit(code, dev->absbit))
  81. return;
  82. if (dev->absfuzz[code]) {
  83. if ((value > dev->abs[code] - (dev->absfuzz[code] >> 1)) &&
  84.     (value < dev->abs[code] + (dev->absfuzz[code] >> 1)))
  85. return;
  86. if ((value > dev->abs[code] - dev->absfuzz[code]) &&
  87.     (value < dev->abs[code] + dev->absfuzz[code]))
  88. value = (dev->abs[code] * 3 + value) >> 2;
  89. if ((value > dev->abs[code] - (dev->absfuzz[code] << 1)) &&
  90.     (value < dev->abs[code] + (dev->absfuzz[code] << 1)))
  91. value = (dev->abs[code] + value) >> 1;
  92. }
  93. if (dev->abs[code] == value)
  94. return;
  95. dev->abs[code] = value;
  96. break;
  97. case EV_REL:
  98. if (code > REL_MAX || !test_bit(code, dev->relbit) || (value == 0))
  99. return;
  100. break;
  101. case EV_MSC:
  102. if (code > MSC_MAX || !test_bit(code, dev->mscbit))
  103. return;
  104. break;
  105. case EV_LED:
  106. if (code > LED_MAX || !test_bit(code, dev->ledbit) || !!test_bit(code, dev->led) == value)
  107. return;
  108. change_bit(code, dev->led);
  109. if (dev->event) dev->event(dev, type, code, value);
  110. break;
  111. case EV_SND:
  112. if (code > SND_MAX || !test_bit(code, dev->sndbit) || !!test_bit(code, dev->snd) == value)
  113. return;
  114. change_bit(code, dev->snd);
  115. if (dev->event) dev->event(dev, type, code, value);
  116. break;
  117. case EV_REP:
  118. if (code > REP_MAX || dev->rep[code] == value) return;
  119. dev->rep[code] = value;
  120. if (dev->event) dev->event(dev, type, code, value);
  121. break;
  122. case EV_FF:
  123. if (dev->event) dev->event(dev, type, code, value);
  124. break;
  125. }
  126. /*
  127.  * Distribute the event to handler modules.
  128.  */
  129. while (handle) {
  130. if (handle->open)
  131. handle->handler->event(handle, type, code, value);
  132. handle = handle->dnext;
  133. }
  134. }
  135. static void input_repeat_key(unsigned long data)
  136. {
  137. struct input_dev *dev = (void *) data;
  138. input_event(dev, EV_KEY, dev->repeat_key, 2);
  139. mod_timer(&dev->timer, jiffies + dev->rep[REP_PERIOD]);
  140. }
  141. int input_open_device(struct input_handle *handle)
  142. {
  143. handle->open++;
  144. if (handle->dev->open)
  145. return handle->dev->open(handle->dev);
  146. return 0;
  147. }
  148. void input_close_device(struct input_handle *handle)
  149. {
  150. if (handle->dev->close)
  151. handle->dev->close(handle->dev);
  152. handle->open--;
  153. }
  154. static void input_link_handle(struct input_handle *handle)
  155. {
  156. handle->dnext = handle->dev->handle;
  157. handle->hnext = handle->handler->handle;
  158. handle->dev->handle = handle;
  159. handle->handler->handle = handle;
  160. }
  161. static void input_unlink_handle(struct input_handle *handle)
  162. {
  163. struct input_handle **handleptr;
  164. handleptr = &handle->dev->handle;
  165. while (*handleptr && (*handleptr != handle))
  166. handleptr = &((*handleptr)->dnext);
  167. *handleptr = (*handleptr)->dnext;
  168. handleptr = &handle->handler->handle;
  169. while (*handleptr && (*handleptr != handle))
  170. handleptr = &((*handleptr)->hnext);
  171. *handleptr = (*handleptr)->hnext;
  172. }
  173. void input_register_device(struct input_dev *dev)
  174. {
  175. struct input_handler *handler = input_handler;
  176. struct input_handle *handle;
  177. /*
  178.  * Initialize repeat timer to default values.
  179.  */
  180. init_timer(&dev->timer);
  181. dev->timer.data = (long) dev;
  182. dev->timer.function = input_repeat_key;
  183. dev->rep[REP_DELAY] = HZ/4;
  184. dev->rep[REP_PERIOD] = HZ/33;
  185. /*
  186.  * Add the device.
  187.  */
  188. if (input_number >= INPUT_DEVICES) {
  189. printk(KERN_WARNING "input: ran out of input device numbers!n");
  190. dev->number = input_number;
  191. } else {
  192. dev->number = find_first_zero_bit(input_devices, INPUT_DEVICES);
  193. set_bit(dev->number, input_devices);
  194. }
  195. dev->next = input_dev;
  196. input_dev = dev;
  197. input_number++;
  198. /*
  199.  * Notify handlers.
  200.  */
  201. while (handler) {
  202. if ((handle = handler->connect(handler, dev)))
  203. input_link_handle(handle);
  204. handler = handler->next;
  205. }
  206. }
  207. void input_unregister_device(struct input_dev *dev)
  208. {
  209. struct input_handle *handle = dev->handle;
  210. struct input_dev **devptr = &input_dev;
  211. struct input_handle *dnext;
  212. /*
  213.  * Kill any pending repeat timers.
  214.  */
  215. del_timer(&dev->timer);
  216. /*
  217.  * Notify handlers.
  218.  */
  219. while (handle) {
  220. dnext = handle->dnext;
  221. input_unlink_handle(handle);
  222. handle->handler->disconnect(handle);
  223. handle = dnext;
  224. }
  225. /*
  226.  * Remove the device.
  227.  */
  228. while (*devptr && (*devptr != dev))
  229. devptr = &((*devptr)->next);
  230. *devptr = (*devptr)->next;
  231. input_number--;
  232. if (dev->number < INPUT_DEVICES)
  233. clear_bit(dev->number, input_devices);
  234. }
  235. void input_register_handler(struct input_handler *handler)
  236. {
  237. struct input_dev *dev = input_dev;
  238. struct input_handle *handle;
  239. /*
  240.  * Add minors if needed.
  241.  */
  242. if (handler->fops != NULL)
  243. input_table[handler->minor >> 5] = handler;
  244. /*
  245.  * Add the handler.
  246.  */
  247. handler->next = input_handler;
  248. input_handler = handler;
  249. /*
  250.  * Notify it about all existing devices.
  251.  */
  252. while (dev) {
  253. if ((handle = handler->connect(handler, dev)))
  254. input_link_handle(handle);
  255. dev = dev->next;
  256. }
  257. }
  258. void input_unregister_handler(struct input_handler *handler)
  259. {
  260. struct input_handler **handlerptr = &input_handler;
  261. struct input_handle *handle = handler->handle;
  262. struct input_handle *hnext;
  263. /*
  264.  * Tell the handler to disconnect from all devices it keeps open.
  265.  */
  266. while (handle) {
  267. hnext = handle->hnext;
  268. input_unlink_handle(handle);
  269. handler->disconnect(handle);
  270. handle = hnext;
  271. }
  272. /*
  273.  * Remove it.
  274.  */
  275. while (*handlerptr && (*handlerptr != handler))
  276. handlerptr = &((*handlerptr)->next);
  277. *handlerptr = (*handlerptr)->next;
  278. /*
  279.  * Remove minors.
  280.  */
  281. if (handler->fops != NULL)
  282. input_table[handler->minor >> 5] = NULL;
  283. }
  284. static int input_open_file(struct inode *inode, struct file *file)
  285. {
  286. struct input_handler *handler = input_table[MINOR(inode->i_rdev) >> 5];
  287. struct file_operations *old_fops, *new_fops = NULL;
  288. int err;
  289. /* No load-on-demand here? */
  290. if (!handler || !(new_fops = fops_get(handler->fops)))
  291. return -ENODEV;
  292. /*
  293.  * That's _really_ odd. Usually NULL ->open means "nothing special",
  294.  * not "no device". Oh, well...
  295.  */
  296. if (!new_fops->open) {
  297. fops_put(new_fops);
  298. return -ENODEV;
  299. }
  300. old_fops = file->f_op;
  301. file->f_op = new_fops;
  302. lock_kernel();
  303. err = new_fops->open(inode, file);
  304. unlock_kernel();
  305. if (err) {
  306. fops_put(file->f_op);
  307. file->f_op = fops_get(old_fops);
  308. }
  309. fops_put(old_fops);
  310. return err;
  311. }
  312. static struct file_operations input_fops = {
  313. owner: THIS_MODULE,
  314. open: input_open_file,
  315. };
  316. devfs_handle_t input_register_minor(char *name, int minor, int minor_base)
  317. {
  318. char devfs_name[16];
  319. sprintf(devfs_name, name, minor);
  320. return devfs_register(input_devfs_handle, devfs_name, DEVFS_FL_DEFAULT, INPUT_MAJOR, minor + minor_base,
  321. S_IFCHR | S_IRUGO | S_IWUSR, &input_fops, NULL);
  322. }
  323. void input_unregister_minor(devfs_handle_t handle)
  324. {
  325. devfs_unregister(handle);
  326. }
  327. static int __init input_init(void)
  328. {
  329. if (devfs_register_chrdev(INPUT_MAJOR, "input", &input_fops)) {
  330. printk(KERN_ERR "input: unable to register char major %d", INPUT_MAJOR);
  331. return -EBUSY;
  332. }
  333. input_devfs_handle = devfs_mk_dir(NULL, "input", NULL);
  334. return 0;
  335. }
  336. static void __exit input_exit(void)
  337. {
  338. devfs_unregister(input_devfs_handle);
  339.         if (devfs_unregister_chrdev(INPUT_MAJOR, "input"))
  340.                 printk(KERN_ERR "input: can't unregister char major %d", INPUT_MAJOR);
  341. }
  342. module_init(input_init);
  343. module_exit(input_exit);