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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/drivers/acorn/char/keyb_ps2.c
  3.  *
  4.  *  Copyright (C) 2000 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Keyboard driver for RiscPC ARM Linux.
  11.  *
  12.  *  Note!!! This driver talks directly to the keyboard.
  13.  */
  14. #include <linux/config.h>
  15. #include <linux/sched.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/tty.h>
  18. #include <linux/tty_flip.h>
  19. #include <linux/mm.h>
  20. #include <linux/slab.h>
  21. #include <linux/ptrace.h>
  22. #include <linux/signal.h>
  23. #include <linux/timer.h>
  24. #include <linux/random.h>
  25. #include <linux/ctype.h>
  26. #include <linux/kbd_ll.h>
  27. #include <linux/delay.h>
  28. #include <linux/init.h>
  29. #include <asm/bitops.h>
  30. #include <asm/irq.h>
  31. #include <asm/hardware.h>
  32. #include <asm/keyboard.h>
  33. #include <asm/io.h>
  34. #include <asm/hardware/iomd.h>
  35. #include <asm/system.h>
  36. extern struct tasklet_struct keyboard_tasklet;
  37. extern void kbd_reset_kdown(void);
  38. int kbd_read_mask;
  39. #define TX_DONE 0
  40. #define TX_SENT 1
  41. #define TX_SEND 2
  42. static volatile int tx_state;
  43. #define VERSION 100
  44. #define KBD_REPORT_ERR
  45. #define KBD_REPORT_UNKN
  46. #define KBD_ESCAPEE0 0xe0 /* in */
  47. #define KBD_ESCAPEE1 0xe1 /* in */
  48. #define ESCE0(x) (0xe000|(x))
  49. #define ESCE1(x) (0xe100|(x))
  50. #define KBD_BAT 0xaa /* in */
  51. #define KBD_SETLEDS 0xed /* out */
  52. #define KBD_ECHO 0xee /* in/out */
  53. #define KBD_BREAK 0xf0 /* in */
  54. #define KBD_TYPRATEDLY 0xf3 /* out */
  55. #define KBD_SCANENABLE 0xf4 /* out */
  56. #define KBD_DEFDISABLE 0xf5 /* out */
  57. #define KBD_DEFAULT 0xf6 /* out */
  58. #define KBD_ACK 0xfa /* in */
  59. #define KBD_DIAGFAIL 0xfd /* in */
  60. #define KBD_RESEND 0xfe /* in/out */
  61. #define KBD_RESET 0xff /* out */
  62. #define CODE_BREAK 1
  63. #define CODE_ESCAPEE0 2
  64. #define CODE_ESCAPEE1 4
  65. #define CODE_ESCAPE12 8
  66. #define K_NONE 0x7f
  67. #define K_ESC 0x00
  68. #define K_F1 0x01
  69. #define K_F2 0x02
  70. #define K_F3 0x03
  71. #define K_F4 0x04
  72. #define K_F5 0x05
  73. #define K_F6 0x06
  74. #define K_F7 0x07
  75. #define K_F8 0x08
  76. #define K_F9 0x09
  77. #define K_F10 0x0a
  78. #define K_F11 0x0b
  79. #define K_F12 0x0c
  80. #define K_PRNT 0x0d
  81. #define K_SCRL 0x0e
  82. #define K_BRK 0x0f
  83. #define K_AGR 0x10
  84. #define K_1 0x11
  85. #define K_2 0x12
  86. #define K_3 0x13
  87. #define K_4 0x14
  88. #define K_5 0x15
  89. #define K_6 0x16
  90. #define K_7 0x17
  91. #define K_8 0x18
  92. #define K_9 0x19
  93. #define K_0 0x1a
  94. #define K_MINS 0x1b
  95. #define K_EQLS 0x1c
  96. #define K_BKSP 0x1e
  97. #define K_INS 0x1f
  98. #define K_HOME 0x20
  99. #define K_PGUP 0x21
  100. #define K_NUML 0x22
  101. #define KP_SLH 0x23
  102. #define KP_STR 0x24
  103. #define KP_MNS 0x3a
  104. #define K_TAB 0x26
  105. #define K_Q 0x27
  106. #define K_W 0x28
  107. #define K_E 0x29
  108. #define K_R 0x2a
  109. #define K_T 0x2b
  110. #define K_Y 0x2c
  111. #define K_U 0x2d
  112. #define K_I 0x2e
  113. #define K_O 0x2f
  114. #define K_P 0x30
  115. #define K_LSBK 0x31
  116. #define K_RSBK 0x32
  117. #define K_ENTR 0x47
  118. #define K_DEL 0x34
  119. #define K_END 0x35
  120. #define K_PGDN 0x36
  121. #define KP_7 0x37
  122. #define KP_8 0x38
  123. #define KP_9 0x39
  124. #define KP_PLS 0x4b
  125. #define K_CAPS 0x5d
  126. #define K_A 0x3c
  127. #define K_S 0x3d
  128. #define K_D 0x3e
  129. #define K_F 0x3f
  130. #define K_G 0x40
  131. #define K_H 0x41
  132. #define K_J 0x42
  133. #define K_K 0x43
  134. #define K_L 0x44
  135. #define K_SEMI 0x45
  136. #define K_SQOT 0x46
  137. #define K_HASH 0x1d
  138. #define KP_4 0x48
  139. #define KP_5 0x49
  140. #define KP_6 0x4a
  141. #define K_LSFT 0x4c
  142. #define K_BSLH 0x33
  143. #define K_Z 0x4e
  144. #define K_X 0x4f
  145. #define K_C 0x50
  146. #define K_V 0x51
  147. #define K_B 0x52
  148. #define K_N 0x53
  149. #define K_M 0x54
  150. #define K_COMA 0x55
  151. #define K_DOT 0x56
  152. #define K_FSLH 0x57
  153. #define K_RSFT 0x58
  154. #define K_UP 0x59
  155. #define KP_1 0x5a
  156. #define KP_2 0x5b
  157. #define KP_3 0x5c
  158. #define KP_ENT 0x67
  159. #define K_LCTL 0x3b
  160. #define K_LALT 0x5e
  161. #define K_SPCE 0x5f
  162. #define K_RALT 0x60
  163. #define K_RCTL 0x61
  164. #define K_LEFT 0x62
  165. #define K_DOWN 0x63
  166. #define K_RGHT 0x64
  167. #define KP_0 0x65
  168. #define KP_DOT 0x66
  169. static unsigned char keycode_translate[256] =
  170. {
  171. /* 00 */  K_NONE, K_F9  , K_NONE, K_F5  , K_F3  , K_F1  , K_F2  , K_F12 ,
  172. /* 08 */  K_NONE, K_F10 , K_F8  , K_F6  , K_F4  , K_TAB , K_AGR , K_NONE,
  173. /* 10 */  K_NONE, K_LALT, K_LSFT, K_NONE, K_LCTL, K_Q   , K_1   , K_NONE,
  174. /* 18 */  K_NONE, K_NONE, K_Z   , K_S   , K_A   , K_W   , K_2   , K_NONE,
  175. /* 20 */  K_NONE, K_C   , K_X   , K_D   , K_E   , K_4   , K_3   , K_NONE,
  176. /* 28 */  K_NONE, K_SPCE, K_V   , K_F   , K_T   , K_R   , K_5   , K_NONE,
  177. /* 30 */  K_NONE, K_N   , K_B   , K_H   , K_G   , K_Y   , K_6   , K_NONE,
  178. /* 38 */  K_NONE, K_NONE, K_M   , K_J   , K_U   , K_7   , K_8   , K_NONE,
  179. /* 40 */  K_NONE, K_COMA, K_K   , K_I   , K_O   , K_0   , K_9   , K_NONE,
  180. /* 48 */  K_NONE, K_DOT , K_FSLH, K_L   , K_SEMI, K_P   , K_MINS, K_NONE,
  181. /* 50 */  K_NONE, K_NONE, K_SQOT, K_NONE, K_LSBK, K_EQLS, K_NONE, K_NONE,
  182. /* 58 */  K_CAPS, K_RSFT, K_ENTR, K_RSBK, K_NONE, K_HASH, K_NONE, K_NONE,
  183. /* 60 */  K_NONE, K_BSLH, K_NONE, K_NONE, K_NONE, K_NONE, K_BKSP, K_NONE,
  184. /* 68 */  K_NONE, KP_1  , K_NONE, KP_4  , KP_7  , K_NONE, K_NONE, K_NONE,
  185. /* 70 */  KP_0  , KP_DOT, KP_2  , KP_5  , KP_6  , KP_8  , K_ESC , K_NUML,
  186. /* 78 */  K_F11 , KP_PLS, KP_3  , KP_MNS, KP_STR, KP_9  , K_SCRL, K_NONE,
  187.   K_NONE, K_NONE, K_NONE, K_F7  , K_NONE, K_NONE, K_NONE, K_NONE,
  188.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  189.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  190.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  191.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  192.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  193.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  194.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  195.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  196.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  197.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  198.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  199.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE,
  200.   K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE, K_NONE
  201. };
  202. #ifdef CONFIG_MAGIC_SYSRQ
  203. static unsigned char ps2kbd_sysrq_xlate[] = 
  204. {
  205.     27,    0,    0,    0,    0,    0,    0,    0,
  206.      0,    0,    0,    0,    0,    0,    0,    0,
  207.    '`',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
  208.    '8',  '9',  '0',  '-',  '=',  '