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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* keyboard.c: Sun keyboard driver.
  2.  *
  3.  * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
  4.  *
  5.  * Added vuid event generation and /dev/kbd device for SunOS
  6.  * compatibility - Miguel (miguel@nuclecu.unam.mx)
  7.  *
  8.  * Added PCI 8042 controller support -DaveM
  9.  * Added Magic SysRq support -MJ
  10.  */
  11. #include <linux/config.h>
  12. #include <linux/kernel.h>
  13. #include <linux/sched.h>
  14. #include <linux/tty.h>
  15. #include <linux/tty_flip.h>
  16. #include <linux/mm.h>
  17. #include <linux/ptrace.h>
  18. #include <linux/signal.h>
  19. #include <linux/string.h>
  20. #include <linux/fcntl.h>
  21. #include <linux/poll.h>
  22. #include <linux/random.h>
  23. #include <linux/delay.h>
  24. #include <linux/init.h>
  25. #include <linux/sysrq.h>
  26. #include <linux/spinlock.h>
  27. #include <linux/smp_lock.h>
  28. #include <linux/devfs_fs_kernel.h>
  29. #include <asm/kbio.h>
  30. #include <asm/vuid_event.h>
  31. #include <asm/bitops.h>
  32. #include <asm/oplib.h>
  33. #include <asm/uaccess.h>
  34. #include <linux/kbd_kern.h>
  35. #include <linux/kbd_diacr.h>
  36. #include <linux/vt_kern.h>
  37. #ifdef CONFIG_PCI
  38. #include <linux/pci.h>
  39. #include <asm/pbm.h>
  40. #include <asm/ebus.h>
  41. #endif
  42. #include "sunkbd.h"
  43. #define SIZE(x) (sizeof(x)/sizeof((x)[0]))
  44. /* Define this one if you are making a new frame buffer driver */
  45. /* it will not block the keyboard */
  46. /* #define CODING_NEW_DRIVER */
  47. /* KBD device number, temporal */
  48. #define KBD_MAJOR 11
  49. #define KBD_REPORT_ERR
  50. #define KBD_REPORT_UNKN
  51. #ifndef KBD_DEFMODE
  52. #define KBD_DEFMODE ((1 << VC_REPEAT) | (1 << VC_META))
  53. #endif
  54. #ifndef KBD_DEFLEDS
  55. /*
  56.  * Some laptops take the 789uiojklm,. keys as number pad when NumLock
  57.  * is on. This seems a good reason to start with NumLock off.
  58.  */
  59. #define KBD_DEFLEDS 0
  60. #endif
  61. #ifndef KBD_DEFLOCK
  62. #define KBD_DEFLOCK 0
  63. #endif
  64. extern void poke_blanked_console(void);
  65. extern void ctrl_alt_del(void);
  66. extern void reset_vc(unsigned int new_console);
  67. extern void scrollback(int);
  68. extern void scrollfront(int);
  69. struct l1a_kbd_state l1a_state;
  70. #ifndef CONFIG_PCI
  71. DECLARE_WAIT_QUEUE_HEAD(keypress_wait);
  72. #endif
  73. int keyboard_wait_for_keypress(struct console *co)
  74. {
  75. sleep_on(&keypress_wait);
  76. return 0;
  77. }
  78. static spinlock_t sunkbd_lock = SPIN_LOCK_UNLOCKED;
  79. /*
  80.  * global state includes the following, and various static variables
  81.  * in this module: prev_scancode, shift_state, diacr, npadch, dead_key_next.
  82.  * (last_console is now a global variable)
  83.  */
  84. /* shift state counters.. */
  85. static unsigned char k_down[NR_SHIFT];
  86. /* keyboard key bitmap */
  87. static unsigned long key_down[256/BITS_PER_LONG];
  88. void push_kbd (int scan);
  89. int kbd_redirected;
  90. static int dead_key_next;
  91. /* 
  92.  * In order to retrieve the shift_state (for the mouse server), either
  93.  * the variable must be global, or a new procedure must be created to 
  94.  * return the value. I chose the former way.
  95.  */
  96. #ifndef CONFIG_PCI
  97. int shift_state;
  98. struct kbd_struct kbd_table[MAX_NR_CONSOLES];
  99. #endif
  100. static int npadch = -1; /* -1 or number assembled on pad */
  101. static unsigned char diacr;
  102. static char rep; /* flag telling character repeat */
  103. static struct tty_struct **ttytab;
  104. static struct kbd_struct * kbd = kbd_table;
  105. static struct tty_struct * tty;
  106. static int compose_led_on;
  107. static int kbd_delay_ticks = HZ / 5;
  108. static int kbd_rate_ticks = HZ / 20;
  109. void sun_compute_shiftstate(void);
  110. typedef void (*k_hand)(unsigned char value, char up_flag);
  111. typedef void (k_handfn)(unsigned char value, char up_flag);
  112. static k_handfn
  113. do_self, do_fn, do_spec, do_pad, do_dead, do_cons, do_cur, do_shift,
  114. do_meta, do_ascii, do_lock, do_lowercase, do_ignore;
  115. static k_hand key_handler[16] = {
  116. do_self, do_fn, do_spec, do_pad, do_dead, do_cons, do_cur, do_shift,
  117. do_meta, do_ascii, do_lock, do_lowercase,
  118. do_ignore, do_ignore, do_ignore, do_ignore
  119. };
  120. typedef void (*void_fnp)(void);
  121. typedef void (void_fn)(void);
  122. static void_fn do_null, enter, show_ptregs, send_intr, lastcons, caps_toggle,
  123. num, hold, scroll_forw, scroll_back, boot_it, caps_on, compose,
  124. SAK, decr_console, incr_console, spawn_console, bare_num;
  125. static void_fnp spec_fn_table[] = {
  126. do_null, enter, show_ptregs, show_mem,
  127. show_state, send_intr, lastcons, caps_toggle,
  128. num, hold, scroll_forw, scroll_back,
  129. boot_it, caps_on, compose, SAK,
  130. decr_console, incr_console, spawn_console, bare_num
  131. };
  132. /* maximum values each key_handler can handle */
  133. #ifndef CONFIG_PCI
  134. const int max_vals[] = {
  135. 255, SIZE(func_table) - 1, SIZE(spec_fn_table) - 1, NR_PAD - 1,
  136. NR_DEAD - 1, 255, 3, NR_SHIFT - 1,
  137. 255, NR_ASCII - 1, NR_LOCK - 1, 255,
  138. NR_LOCK - 1
  139. };
  140. const int NR_TYPES = SIZE(max_vals);
  141. #endif
  142. static void put_queue(int);
  143. static unsigned char handle_diacr(unsigned char);
  144. /* pt_regs - set by keyboard_interrupt(), used by show_ptregs() */
  145. static struct pt_regs * pt_regs;
  146. #ifdef CONFIG_MAGIC_SYSRQ
  147. unsigned char sun_sysrq_xlate[128] =
  148. "201202212203213204214205206" /* 0x00 - 0x0f */
  149. "2072102113312" /* 0x10 - 0x1f */
  150. "34567890-=`177=/*" /* 0x20 - 0x2f */
  151. ".11qwertyuiop" /* 0x30 - 0x3f */
  152. "[]17700789-asd" /* 0x40 - 0x4f */
  153. "fghjkl;'\15154560" /* 0x50 - 0x5f */
  154. "zxcvbnm,./12" /* 0x60 - 0x6f */
  155. "123 "; /* 0x70 - 0x7f */
  156. #endif
  157. volatile unsigned char sunkbd_layout;
  158. volatile unsigned char sunkbd_type;
  159. #define SUNKBD_TYPE2        0x02
  160. #define SUNKBD_TYPE3        0x03
  161. #define SUNKBD_TYPE4        0x04
  162. #define SUNKBD_LOUT_TYP4     0x00
  163. #define SUNKBD_LOUT_TYP5_MASK   0x20
  164. volatile int kbd_reset_pending;
  165. volatile int kbd_layout_pending;
  166. /* commands */
  167. #define SKBDCMD_RESET       0x1
  168. #define SKBDCMD_GLAYOUT     0xf
  169. #define SKBDCMD_BELLON      0x2
  170. #define SKBDCMD_BELLOFF     0x3
  171. #define SKBDCMD_SETLED      0xe
  172. #define SKBDCMD_NOCLICK     0xb
  173. #define SKBDCMD_CLICK       0xa
  174. static unsigned char sunkbd_clickp;
  175. /* The led set commands require sending the SETLED byte then
  176.  * a byte encoding which led's to have set.  Here are the bit
  177.  * values, a bit set = led-on.
  178.  */
  179. #define LED_NLOCK           0x1   /* Num-lock */
  180. #define LED_CMPOSE          0x2   /* Compose */
  181. #define LED_SCRLCK          0x4   /* Scroll-lock */
  182. #define LED_CLOCK           0x8   /* Caps-lock */
  183. /* Special state characters */
  184. #define SKBD_RESET          0xff
  185. #define SKBD_ALLUP          0x7f
  186. #define SKBD_LYOUT          0xfe
  187. /* On the Sparc the keyboard could be one of two things.
  188.  * It could be a real keyboard speaking over one of the
  189.  * channels of the second zs8530 chip (other channel is
  190.  * used by the Sun mouse).  Else we have serial console
  191.  * going, and thus the other zs8530 chip is who we speak
  192.  * to.  Either way, we communicate through the zs8530
  193.  * driver for all our I/O.
  194.  */
  195. #define SUNKBD_UBIT     0x80      /* If set, key went up */
  196. #define SUNKBD_KMASK    0x7f      /* Other bits are the keycode */
  197. #define KEY_LSHIFT      0x81
  198. #define KEY_RSHIFT      0x82
  199. #define KEY_CONTROL     0x83
  200. #define KEY_NILL        0x84
  201. #define KEY_CAPSLOCK    0x85
  202. #define KEY_ALT         0x86
  203. #define KEY_L1          0x87
  204. /* Due to sun_kbd_init() being called before rs_init(), and sun_kbd_init() doing:
  205.  *
  206.  * tasklet_enable(&keyboard_tasklet);
  207.  * tasklet_schedule(&keyboard_tasklet);
  208.  *
  209.  * this might well be called before some driver has claimed interest in
  210.  * handling the keyboard input/output. So we need to assign an initial nop.
  211.  */
  212. static void nop_kbd_put_char(unsigned char c) { }
  213. static void (*kbd_put_char)(unsigned char) = nop_kbd_put_char;
  214. /* Must be invoked under sunkbd_lock. */
  215. static inline void send_cmd(unsigned char c)
  216. {
  217. kbd_put_char(c);
  218. }
  219. /* kbd_bh() calls this to send the SKBDCMD_SETLED to the sun keyboard
  220.  * with the proper bit pattern for the leds to be set.  It basically
  221.  * converts the kbd->ledflagstate values to corresponding sun kbd led
  222.  * bit value.
  223.  */
  224. static inline unsigned char vcleds_to_sunkbd(unsigned char vcleds)
  225. {
  226. unsigned char retval = 0;
  227. if(vcleds & (1<<VC_SCROLLOCK))
  228. retval |= LED_SCRLCK;
  229. if(vcleds & (1<<VC_NUMLOCK))
  230. retval |= LED_NLOCK;
  231. if(vcleds & (1<<VC_CAPSLOCK))
  232. retval |= LED_CLOCK;
  233. if(compose_led_on)
  234. retval |= LED_CMPOSE;
  235. return retval;
  236. }
  237. /*
  238.  * Translation of escaped scancodes to keycodes.
  239.  * This is now user-settable.
  240.  * The keycodes 1-88,96-111,119 are fairly standard, and
  241.  * should probably not be changed - changing might confuse X.
  242.  * X also interprets scancode 0x5d (KEY_Begin).
  243.  *
  244.  * For 1-88 keycode equals scancode.
  245.  */
  246. #define E0_KPENTER 96
  247. #define E0_RCTRL   97
  248. #define E0_KPSLASH 98
  249. #define E0_PRSCR   99
  250. #define E0_RALT    100
  251. #define E0_BREAK   101  /* (control-pause) */
  252. #define E0_HOME    102
  253. #define E0_UP      103
  254. #define E0_PGUP    104
  255. #define E0_LEFT    105
  256. #define E0_RIGHT   106
  257. #define E0_END     107
  258. #define E0_DOWN    108
  259. #define E0_PGDN    109
  260. #define E0_INS     110
  261. #define E0_DEL     111
  262. #define E1_PAUSE   119
  263. /*
  264.  * The keycodes below are randomly located in 89-95,112-118,120-127.
  265.  * They could be thrown away (and all occurrences below replaced by 0),
  266.  * but that would force many users to use the `setkeycodes' utility, where
  267.  * they needed not before. It does not matter that there are duplicates, as
  268.  * long as no duplication occurs for any single keyboard.
  269.  */
  270. #define SC_LIM 89
  271. #define FOCUS_PF1 85           /* actual code! */
  272. #define FOCUS_PF2 89
  273. #define FOCUS_PF3 90
  274. #define FOCUS_PF4 91
  275. #define FOCUS_PF5 92
  276. #define FOCUS_PF6 93
  277. #define FOCUS_PF7 94
  278. #define FOCUS_PF8 95
  279. #define FOCUS_PF9 120
  280. #define FOCUS_PF10 121
  281. #define FOCUS_PF11 122
  282. #define FOCUS_PF12 123
  283. #define JAP_86     124
  284. /* tfj@olivia.ping.dk:
  285.  * The four keys are located over the numeric keypad, and are
  286.  * labelled A1-A4. It's an rc930 keyboard, from
  287.  * Regnecentralen/RC International, Now ICL.
  288.  * Scancodes: 59, 5a, 5b, 5c.
  289.  */
  290. #define RGN1 124
  291. #define RGN2 125
  292. #define RGN3 126
  293. #define RGN4 127
  294. static unsigned char high_keys[128 - SC_LIM] = {
  295.   RGN1, RGN2, RGN3, RGN4, 0, 0, 0,                   /* 0x59-0x5f */
  296.   0, 0, 0, 0, 0, 0, 0, 0,                            /* 0x60-0x67 */
  297.   0, 0, 0, 0, 0, FOCUS_PF11, 0, FOCUS_PF12,          /* 0x68-0x6f */
  298.   0, 0, 0, FOCUS_PF2, FOCUS_PF9, 0, 0, FOCUS_PF3,    /* 0x70-0x77 */
  299.   FOCUS_PF4, FOCUS_PF5, FOCUS_PF6, FOCUS_PF7,        /* 0x78-0x7b */
  300.   FOCUS_PF8, JAP_86, FOCUS_PF10, 0                   /* 0x7c-0x7f */
  301. };
  302. /* BTC */
  303. #define E0_MACRO   112
  304. /* LK450 */
  305. #define E0_F13     113
  306. #define E0_F14     114
  307. #define E0_HELP    115
  308. #define E0_DO      116
  309. #define E0_F17     117
  310. #define E0_KPMINPLUS 118
  311. /*
  312.  * My OmniKey generates e0 4c for  the "OMNI" key and the
  313.  * right alt key does nada. [kkoller@nyx10.cs.du.edu]
  314.  */
  315. #define E0_OK 124
  316. /*
  317.  * New microsoft keyboard is rumoured to have
  318.  * e0 5b (left window button), e0 5c (right window button),
  319.  * e0 5d (menu button). [or: LBANNER, RBANNER, RMENU]
  320.  * [or: Windows_L, Windows_R, TaskMan]
  321.  */
  322. #define E0_MSLW 125
  323. #define E0_MSRW 126
  324. #define E0_MSTM 127
  325. static unsigned char e0_keys[128] = {
  326.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x00-0x07 */
  327.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x08-0x0f */
  328.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x10-0x17 */
  329.   0, 0, 0, 0, E0_KPENTER, E0_RCTRL, 0, 0,       /* 0x18-0x1f */
  330.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x20-0x27 */
  331.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x28-0x2f */
  332.   0, 0, 0, 0, 0, E0_KPSLASH, 0, E0_PRSCR,       /* 0x30-0x37 */
  333.   E0_RALT, 0, 0, 0, 0, E0_F13, E0_F14, E0_HELP,       /* 0x38-0x3f */
  334.   E0_DO, E0_F17, 0, 0, 0, 0, E0_BREAK, E0_HOME,       /* 0x40-0x47 */
  335.   E0_UP, E0_PGUP, 0, E0_LEFT, E0_OK, E0_RIGHT, E0_KPMINPLUS, E0_END,/* 0x48-0x4f */
  336.   E0_DOWN, E0_PGDN, E0_INS, E0_DEL, 0, 0, 0, 0,       /* 0x50-0x57 */
  337.   0, 0, 0, E0_MSLW, E0_MSRW, E0_MSTM, 0, 0,       /* 0x58-0x5f */
  338.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x60-0x67 */
  339.   0, 0, 0, 0, 0, 0, 0, E0_MACRO,       /* 0x68-0x6f */
  340.   0, 0, 0, 0, 0, 0, 0, 0,       /* 0x70-0x77 */
  341.   0, 0, 0, 0, 0, 0, 0, 0       /* 0x78-0x7f */
  342. };
  343. /* we use this map to determine if a particular key should not be
  344.    autorepeated. We don't autorepeat CONTROL, LSHIFT, CAPS,
  345.    ALT, LMETA, RSHIFT, RMETA, ALTG and COMPOSE */
  346. static unsigned char norepeat_keys[128] = {
  347. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,  /* 0x00-0x0f */
  348. 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /* 0x10-0x1f */
  349. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /* 0x20-0x2f */
  350. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /* 0x30-0x3f */
  351. 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,  /* 0x40-0x4f */
  352. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /* 0x50-0x5f */
  353. 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,  /* 0x60-0x6f */
  354. 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0,  /* 0x70-0x7f */
  355. };
  356. int sun_setkeycode(unsigned int scancode, unsigned int keycode)
  357. {
  358. if (scancode < SC_LIM || scancode > 255 || keycode > 127)
  359.   return -EINVAL;
  360. if (scancode < 128)
  361.   high_keys[scancode - SC_LIM] = keycode;
  362. else
  363.   e0_keys[scancode - 128] = keycode;
  364. return 0;
  365. }
  366. int sun_getkeycode(unsigned int scancode)
  367. {
  368. return
  369.   (scancode < SC_LIM || scancode > 255) ? -EINVAL :
  370.   (scancode < 128) ? high_keys[scancode - SC_LIM] :
  371.     e0_keys[scancode - 128];
  372. }
  373. static void __sunkbd_inchar(unsigned char ch, struct pt_regs *regs);
  374. void sunkbd_inchar(unsigned char ch, struct pt_regs *regs);
  375. static void keyboard_timer (unsigned long ignored);
  376. static struct timer_list
  377. auto_repeat_timer = { function: keyboard_timer };
  378. /* Keeps track of the last pressed key */
  379. static unsigned char last_keycode;
  380. static void
  381. keyboard_timer (unsigned long ignored)
  382. {
  383. unsigned long flags;
  384. spin_lock_irqsave(&sunkbd_lock, flags);
  385. /* Auto repeat: send regs = 0 to indicate autorepeat */
  386. __sunkbd_inchar (last_keycode, 0);
  387. del_timer (&auto_repeat_timer);
  388. if (kbd_rate_ticks) {
  389. auto_repeat_timer.expires = jiffies + kbd_rate_ticks;
  390. add_timer (&auto_repeat_timer);
  391. }
  392. spin_unlock_irqrestore(&sunkbd_lock, flags);
  393. }
  394. #ifndef CONFIG_PCI
  395. DECLARE_TASKLET_DISABLED(keyboard_tasklet, sun_kbd_bh, 0);
  396. #endif
  397. /* #define SKBD_DEBUG */
  398. /* This is our keyboard 'interrupt' routine.
  399.  * Must run under sunkbd_lock.
  400.  */
  401. static void __sunkbd_inchar(unsigned char ch, struct pt_regs *regs)
  402. {
  403. unsigned char keycode;
  404. char up_flag;                          /* 0 or SUNKBD_UBIT */
  405. char raw_mode;
  406. if(ch == SKBD_RESET) {
  407. kbd_reset_pending = 1;
  408. goto out;
  409. }
  410. if(ch == SKBD_LYOUT) {
  411. kbd_layout_pending = 1;
  412. goto out;
  413. }
  414. if(kbd_reset_pending) {
  415. sunkbd_type = ch;
  416. kbd_reset_pending = 0;
  417. if(ch == SUNKBD_TYPE4)
  418. send_cmd(SKBDCMD_GLAYOUT);
  419. goto out;
  420. } else if(kbd_layout_pending) {
  421. sunkbd_layout = ch;
  422. kbd_layout_pending = 0;
  423. goto out;
  424. } else if(ch == SKBD_ALLUP) {
  425. del_timer (&auto_repeat_timer);
  426. memset(key_down, 0, sizeof(key_down));
  427. sun_compute_shiftstate();
  428. goto out;
  429. }
  430. #ifdef SKBD_DEBUG
  431. if(ch == 0x7f)
  432. printk("KBD<ALL KEYS UP>");
  433. else
  434. printk("KBD<%x %s>", ch,
  435.        ((ch&0x80) ? "UP" : "DOWN"));
  436. #endif
  437. /* Whee, a real character. */
  438. if(regs) {
  439. pt_regs = regs;
  440. last_keycode = keycode = ch;
  441. } else {
  442. keycode = ch;
  443. }
  444. do_poke_blanked_console = 1;
  445. schedule_console_callback();
  446. add_keyboard_randomness(keycode);
  447. tty = ttytab? ttytab[fg_console]: NULL;
  448. if (tty && (!tty->driver_data)) {
  449. /* This is to workaround ugly bug in tty_io.c, which
  450.                    does not do locking when it should */
  451. tty = NULL;
  452. }
  453. kbd = kbd_table + fg_console;
  454. if((raw_mode = (kbd->kbdmode == VC_RAW))) {
  455. if (kbd_redirected == fg_console+1)
  456. push_kbd (keycode);
  457. else
  458. put_queue(keycode);
  459. /* we do not return yet, because we want to maintain
  460.  * the key_down array, so that we have the correct
  461.  * values  when finishing RAW mode or when changing VT's.
  462.  */
  463. }
  464. up_flag = (keycode & SUNKBD_UBIT);  /* The 'up' bit */
  465. keycode &= SUNKBD_KMASK;            /* all the rest */
  466. del_timer (&auto_repeat_timer);
  467. if(up_flag) {
  468. rep = 0;
  469. clear_bit(keycode, key_down);
  470. } else {
  471. if (!norepeat_keys[keycode]) {
  472. if (kbd_rate_ticks) {
  473. auto_repeat_timer.expires =
  474. jiffies + kbd_delay_ticks;
  475. add_timer (&auto_repeat_timer);
  476. }
  477. }
  478. rep = test_and_set_bit(keycode, key_down);
  479. }
  480. #ifdef CONFIG_MAGIC_SYSRQ /* Handle the SysRq hack */
  481. if (l1a_state.l1_down) {
  482. if (!up_flag)
  483. handle_sysrq(sun_sysrq_xlate[keycode], pt_regs, kbd, tty);
  484. goto out;
  485. }
  486. #endif
  487. if(raw_mode)
  488. goto out;
  489. if(kbd->kbdmode == VC_MEDIUMRAW) {
  490. put_queue(keycode + up_flag);
  491. goto out;
  492. }
  493.   /*
  494.  * Small change in philosophy: earlier we defined repetition by
  495.  *  rep = keycode == prev_keycode;
  496.  *  prev_keycode = keycode;
  497.  * but now by the fact that the depressed key was down already.
  498.  * Does this ever make a difference? Yes.
  499.  */
  500. /*
  501.    *  Repeat a key only if the input buffers are empty or the
  502.    *  characters get echoed locally. This makes key repeat usable
  503.    *  with slow applications and under heavy loads.
  504.  */
  505. if (!rep ||
  506.     (vc_kbd_mode(kbd,VC_REPEAT) && tty &&
  507.      (L_ECHO(tty) || (tty->driver.chars_in_buffer(tty) == 0)))) {
  508. u_short keysym;
  509. u_char type;
  510. /* the XOR below used to be an OR */
  511. int shift_final = shift_state ^ kbd->lockstate ^ kbd->slockstate;
  512. ushort *key_map = key_maps[shift_final];
  513. if (key_map != NULL) {
  514. keysym = key_map[keycode];
  515. type = KTYP(keysym);
  516. if (type >= 0xf0) {
  517.     type -= 0xf0;
  518.     if (type == KT_LETTER) {
  519. type = KT_LATIN;
  520. if (vc_kbd_led(kbd, VC_CAPSLOCK)) {
  521.     key_map = key_maps[shift_final ^ (1<<KG_SHIFT)];
  522.     if (key_map)
  523.       keysym = key_map[keycode];
  524. }
  525.     }
  526.     (*key_handler[type])(keysym & 0xff, up_flag);
  527.     if (type != KT_SLOCK)
  528.       kbd->slockstate = 0;
  529. }
  530. } else {
  531. /* maybe beep? */
  532. /* we have at least to update shift_state */
  533. sun_compute_shiftstate();
  534. }
  535. }
  536. out:
  537. tasklet_schedule(&keyboard_tasklet);
  538. }
  539. void sunkbd_inchar(unsigned char ch, struct pt_regs *regs)
  540. {
  541. unsigned long flags;
  542. spin_lock_irqsave(&sunkbd_lock, flags);
  543. __sunkbd_inchar(ch, regs);
  544. spin_unlock_irqrestore(&sunkbd_lock, flags);
  545. }
  546. static void put_queue(int ch)
  547. {
  548. wake_up(&keypress_wait);
  549. if (tty) {
  550. tty_insert_flip_char(tty, ch, 0);
  551. con_schedule_flip(tty);
  552. }
  553. }
  554. static void puts_queue(char *cp)
  555. {
  556. wake_up(&keypress_wait);
  557. if (!tty)
  558. return;
  559. while (*cp) {
  560. tty_insert_flip_char(tty, *cp, 0);
  561. cp++;
  562. }
  563. con_schedule_flip(tty);
  564. }
  565. static void applkey(int key, char mode)
  566. {
  567. static char buf[] = { 0x1b, 'O', 0x00, 0x00 };
  568. buf[1] = (mode ? 'O' : '[');
  569. buf[2] = key;
  570. puts_queue(buf);
  571. }
  572. static void enter(void)
  573. {
  574. put_queue(13);
  575. if (vc_kbd_mode(kbd,VC_CRLF))
  576. put_queue(10);
  577. }
  578. static void caps_toggle(void)
  579. {
  580. if (rep)
  581. return;
  582. chg_vc_kbd_led(kbd, VC_CAPSLOCK);
  583. }
  584. static void caps_on(void)
  585. {
  586. if (rep)
  587. return;
  588. set_vc_kbd_led(kbd, VC_CAPSLOCK);
  589. }
  590. static void show_ptregs(void)
  591. {
  592. if (pt_regs)
  593. show_regs(pt_regs);
  594. }
  595. static void hold(void)
  596. {
  597. if (rep || !tty)
  598. return;
  599. /*
  600.  * Note: SCROLLOCK will be set (cleared) by stop_tty (start_tty);
  601.  * these routines are also activated by ^S/^Q.
  602.  * (And SCROLLOCK can also be set by the ioctl KDSKBLED.)
  603.  */
  604. if (tty->stopped)
  605. start_tty(tty);
  606. else
  607. stop_tty(tty);
  608. }
  609. static void num(void)
  610. {
  611. if (vc_kbd_mode(kbd,VC_APPLIC))
  612. applkey('P', 1);
  613. else
  614. bare_num();
  615. }
  616. /*
  617.  * Bind this to Shift-NumLock if you work in application keypad mode
  618.  * but want to be able to change the NumLock flag.
  619.  * Bind this to NumLock if you prefer that the NumLock key always
  620.  * changes the NumLock flag.
  621.  */
  622. static void bare_num(void)
  623. {
  624. if (!rep)
  625. chg_vc_kbd_led(kbd,VC_NUMLOCK);
  626. }
  627. static void lastcons(void)
  628. {
  629. /* switch to the last used console, ChN */
  630. set_console(last_console);
  631. }
  632. static void decr_console(void)
  633. {
  634. int i;
  635.  
  636. for (i = fg_console-1; i != fg_console; i--) {
  637. if (i == -1)
  638. i = MAX_NR_CONSOLES-1;
  639. if (vc_cons_allocated(i))
  640. break;
  641. }
  642. set_console(i);
  643. }
  644. static void incr_console(void)
  645. {
  646. int i;
  647. for (i = fg_console+1; i != fg_console; i++) {
  648. if (i == MAX_NR_CONSOLES)
  649. i = 0;
  650. if (vc_cons_allocated(i))
  651. break;
  652. }
  653. set_console(i);
  654. }
  655. static void send_intr(void)
  656. {
  657. if (!tty)
  658. return;
  659. tty_insert_flip_char(tty, 0, TTY_BREAK);
  660. con_schedule_flip(tty);
  661. }
  662. static void scroll_forw(void)
  663. {
  664. scrollfront(0);
  665. }
  666. static void scroll_back(void)
  667. {
  668. scrollback(0);
  669. }
  670. static void boot_it(void)
  671. {
  672. extern int obp_system_intr(void);
  673. if (!obp_system_intr())
  674. ctrl_alt_del();
  675. /* sigh.. attempt to prevent multiple entry */
  676. last_keycode=1;
  677. rep = 0;
  678. }
  679. static void compose(void)
  680. {
  681. dead_key_next = 1;
  682. compose_led_on = 1;
  683. set_leds();
  684. }
  685. #ifdef CONFIG_PCI
  686. extern int spawnpid, spawnsig;
  687. #else
  688. int spawnpid, spawnsig;
  689. #endif
  690. static void spawn_console(void)
  691. {
  692.         if (spawnpid)
  693.    if(kill_proc(spawnpid, spawnsig, 1))
  694.      spawnpid = 0;
  695. }
  696. static void SAK(void)
  697. {
  698. do_SAK(tty);
  699. #if 0
  700. /*
  701.  * Need to fix SAK handling to fix up RAW/MEDIUM_RAW and
  702.  * vt_cons modes before we can enable RAW/MEDIUM_RAW SAK
  703.  * handling.
  704.  * 
  705.  * We should do this some day --- the whole point of a secure
  706.  * attention key is that it should be guaranteed to always
  707.  * work.
  708.  */
  709. reset_vc(fg_console);
  710. do_unblank_screen(); /* not in interrupt routine? */
  711. #endif
  712. }
  713. static void do_ignore(unsigned char value, char up_flag)
  714. {
  715. }
  716. static void do_null()
  717. {
  718. sun_compute_shiftstate();
  719. }
  720. static void do_spec(unsigned char value, char up_flag)
  721. {
  722. if (up_flag)
  723. return;
  724. if (value >= SIZE(spec_fn_table))
  725. return;
  726. spec_fn_table[value]();
  727. }
  728. static void do_lowercase(unsigned char value, char up_flag)
  729. {
  730. printk("keyboard.c: do_lowercase was called - impossiblen");
  731. }
  732. static void do_self(unsigned char value, char up_flag)
  733. {
  734. if (up_flag)
  735. return; /* no action, if this is a key release */
  736. if (diacr) {
  737. value = handle_diacr(value);
  738. compose_led_on = 0;
  739. set_leds();
  740. }
  741. if (dead_key_next) {
  742. dead_key_next = 0;
  743. diacr = value;
  744. return;
  745. }
  746. put_queue(value);
  747. }
  748. #define A_GRAVE  '`'
  749. #define A_ACUTE  '''
  750. #define A_CFLEX  '^'
  751. #define A_TILDE  '~'
  752. #define A_DIAER  '"'
  753. #define A_CEDIL  ','
  754. static unsigned char ret_diacr[NR_DEAD] =
  755. {A_GRAVE, A_ACUTE, A_CFLEX, A_TILDE, A_DIAER, A_CEDIL };
  756. /* If a dead key pressed twice, output a character corresponding to it, */
  757. /* otherwise just remember the dead key. */
  758. static void do_dead(unsigned char value, char up_flag)
  759. {
  760. if (up_flag)
  761. return;
  762. value = ret_diacr[value];
  763. if (diacr == value) {   /* pressed twice */
  764. diacr = 0;
  765. put_queue(value);
  766. return;
  767. }
  768. diacr = value;
  769. }
  770. /* If space is pressed, return the character corresponding the pending */
  771. /* dead key, otherwise try to combine the two. */
  772. unsigned char handle_diacr(unsigned char ch)
  773. {
  774. int d = diacr;
  775. int i;
  776. diacr = 0;
  777. if (ch == ' ')
  778. return d;
  779. for (i = 0; i < accent_table_size; i++) {
  780. if (accent_table[i].diacr == d && accent_table[i].base == ch)
  781. return accent_table[i].result;
  782. }
  783. put_queue(d);
  784. return ch;
  785. }
  786. static void do_cons(unsigned char value, char up_flag)
  787. {
  788. if (up_flag)
  789. return;
  790. set_console(value);
  791. }
  792. static void do_fn(unsigned char value, char up_flag)
  793. {
  794. if (up_flag)
  795. return;
  796. if (value < SIZE(func_table)) {
  797. if (func_table[value])
  798. puts_queue(func_table[value]);
  799. } else
  800. printk("do_fn called with value=%dn", value);
  801. }
  802. static void do_pad(unsigned char value, char up_flag)
  803. {
  804. static const char *pad_chars = "0123456789+-*/15,.?";
  805. static const char *app_map = "pqrstuvwxylSRQMnn?";
  806. if (up_flag)
  807. return; /* no action, if this is a key release */
  808. /* kludge... shift forces cursor/number keys */
  809. if (vc_kbd_mode(kbd,VC_APPLIC) && !k_down[KG_SHIFT]) {
  810. applkey(app_map[value], 1);
  811. return;
  812. }
  813. if (!vc_kbd_led(kbd,VC_NUMLOCK))
  814. switch (value) {
  815. case KVAL(K_PCOMMA):
  816. case KVAL(K_PDOT):
  817. do_fn(KVAL(K_REMOVE), 0);
  818. return;
  819. case KVAL(K_P0):
  820. do_fn(KVAL(K_INSERT), 0);
  821. return;
  822. case KVAL(K_P1):
  823. do_fn(KVAL(K_SELECT), 0);
  824. return;
  825. case KVAL(K_P2):
  826. do_cur(KVAL(K_DOWN), 0);
  827. return;
  828. case KVAL(K_P3):
  829. do_fn(KVAL(K_PGDN), 0);
  830. return;
  831. case KVAL(K_P4):
  832. do_cur(KVAL(K_LEFT), 0);
  833. return;
  834. case KVAL(K_P6):
  835. do_cur(KVAL(K_RIGHT), 0);
  836. return;
  837. case KVAL(K_P7):
  838. do_fn(KVAL(K_FIND), 0);
  839. return;
  840. case KVAL(K_P8):
  841. do_cur(KVAL(K_UP), 0);
  842. return;
  843. case KVAL(K_P9):
  844. do_fn(KVAL(K_PGUP), 0);
  845. return;
  846. case KVAL(K_P5):
  847. applkey('G', vc_kbd_mode(kbd, VC_APPLIC));
  848. return;
  849. }
  850. put_queue(pad_chars[value]);
  851. if (value == KVAL(K_PENTER) && vc_kbd_mode(kbd, VC_CRLF))
  852. put_queue(10);
  853. }
  854. static void do_cur(unsigned char value, char up_flag)
  855. {
  856. static const char *cur_chars = "BDCA";
  857. if (up_flag)
  858. return;
  859. applkey(cur_chars[value], vc_kbd_mode(kbd,VC_CKMODE));
  860. }
  861. static void do_shift(unsigned char value, char up_flag)
  862. {
  863. int old_state = shift_state;
  864. if (rep)
  865. return;
  866. /* Mimic typewriter:
  867.    a CapsShift key acts like Shift but undoes CapsLock */
  868. if (value == KVAL(K_CAPSSHIFT)) {
  869. value = KVAL(K_SHIFT);
  870. if (!up_flag)
  871. clr_vc_kbd_led(kbd, VC_CAPSLOCK);
  872. }
  873. if (up_flag) {
  874. /* handle the case that two shift or control
  875.    keys are depressed simultaneously */
  876. if (k_down[value])
  877. k_down[value]--;
  878. } else
  879. k_down[value]++;
  880. if (k_down[value])
  881. shift_state |= (1 << value);
  882. else
  883. shift_state &= ~ (1 << value);
  884. /* kludge, no joke... */
  885. if (up_flag && shift_state != old_state && npadch != -1) {
  886. put_queue(npadch & 0xff);
  887. npadch = -1;
  888. }
  889. }
  890. /* called after returning from RAW mode or when changing consoles -
  891.    recompute k_down[] and shift_state from key_down[] */
  892. /* maybe called when keymap is undefined, so that shiftkey release is seen */
  893. void sun_compute_shiftstate(void)
  894. {
  895. int i, j, k, sym, val;
  896. shift_state = 0;
  897. for(i=0; i < SIZE(k_down); i++)
  898.   k_down[i] = 0;
  899. for(i=0; i < SIZE(key_down); i++)
  900.   if(key_down[i]) { /* skip this word if not a single bit on */
  901.     k = i*BITS_PER_LONG;
  902.     for(j=0; j<BITS_PER_LONG; j++,k++)
  903.       if(test_bit(k, key_down)) {
  904. sym = U(plain_map[k]);
  905. if(KTYP(sym) == KT_SHIFT) {
  906.   val = KVAL(sym);
  907.   if (val == KVAL(K_CAPSSHIFT))
  908.     val = KVAL(K_SHIFT);
  909.   k_down[val]++;
  910.   shift_state |= (1<<val);
  911. }
  912.       }
  913.   }
  914. }
  915. static void do_meta(unsigned char value, char up_flag)
  916. {
  917. if (up_flag)
  918. return;
  919. if (vc_kbd_mode(kbd, VC_META)) {
  920. put_queue('33');
  921. put_queue(value);
  922. } else
  923. put_queue(value | 0x80);
  924. }
  925. static void do_ascii(unsigned char value, char up_flag)
  926. {
  927. int base;
  928. if (up_flag)
  929. return;
  930. if (value < 10)    /* decimal input of code, while Alt depressed */
  931.     base = 10;
  932. else {       /* hexadecimal input of code, while AltGr depressed */
  933.     value -= 10;
  934.     base = 16;
  935. }
  936. if (npadch == -1)
  937.   npadch = value;
  938. else
  939.   npadch = npadch * base + value;
  940. }
  941. static void do_lock(unsigned char value, char up_flag)
  942. {
  943. if (up_flag || rep)
  944. return;
  945. chg_vc_kbd_lock(kbd, value);
  946. }
  947. /*
  948.  * The leds display either (i) the status of NumLock, CapsLock, ScrollLock,
  949.  * or (ii) whatever pattern of lights people want to show using KDSETLED,
  950.  * or (iii) specified bits of specified words in kernel memory.
  951.  */
  952. static unsigned char ledstate = 0xff; /* undefined */
  953. static unsigned char ledioctl;
  954. unsigned char sun_getledstate(void) {
  955.     return ledstate;
  956. }
  957. void sun_setledstate(struct kbd_struct *kbd, unsigned int led) {
  958.     if (!(led & ~7)) {
  959. ledioctl = led;
  960. kbd->ledmode = LED_SHOW_IOCTL;
  961.     } else
  962. kbd->ledmode = LED_SHOW_FLAGS;
  963.     set_leds();
  964. }
  965. static struct ledptr {
  966.     unsigned int *addr;
  967.     unsigned int mask;
  968.     unsigned char valid:1;
  969. } ledptrs[3];
  970. void register_leds(int console, unsigned int led,
  971.    unsigned int *addr, unsigned int mask) {
  972.     struct kbd_struct *kbd = kbd_table + console;
  973.     if (led < 3) {
  974. ledptrs[led].addr = addr;
  975. ledptrs[led].mask = mask;
  976. ledptrs[led].valid = 1;
  977. kbd->ledmode = LED_SHOW_MEM;
  978.     } else
  979. kbd->ledmode = LED_SHOW_FLAGS;
  980. }
  981. static inline unsigned char getleds(void){
  982.     struct kbd_struct *kbd = kbd_table + fg_console;
  983.     unsigned char leds;
  984.     if (kbd->ledmode == LED_SHOW_IOCTL)
  985.       return ledioctl;
  986.     leds = kbd->ledflagstate;
  987.     if (kbd->ledmode == LED_SHOW_MEM) {
  988. if (ledptrs[0].valid) {
  989.     if (*ledptrs[0].addr & ledptrs[0].mask)
  990.       leds |= 1;
  991.     else
  992.       leds &= ~1;
  993. }
  994. if (ledptrs[1].valid) {
  995.     if (*ledptrs[1].addr & ledptrs[1].mask)
  996.       leds |= 2;
  997.     else
  998.       leds &= ~2;
  999. }
  1000. if (ledptrs[2].valid) {
  1001.     if (*ledptrs[2].addr & ledptrs[2].mask)
  1002.       leds |= 4;
  1003.     else
  1004.       leds &= ~4;
  1005. }
  1006.     }
  1007.     return leds;
  1008. }
  1009. /*
  1010.  * This routine is the bottom half of the keyboard interrupt
  1011.  * routine, and runs with all interrupts enabled. It does
  1012.  * console changing, led setting and copy_to_cooked, which can
  1013.  * take a reasonably long time.
  1014.  *
  1015.  * Aside from timing (which isn't really that important for
  1016.  * keyboard interrupts as they happen often), using the software
  1017.  * interrupt routines for this thing allows us to easily mask
  1018.  * this when we don't want any of the above to happen. Not yet
  1019.  * used, but this allows for easy and efficient race-condition
  1020.  * prevention later on.
  1021.  */
  1022. static unsigned char sunkbd_ledstate = 0xff; /* undefined */
  1023. void sun_kbd_bh(unsigned long dummy)
  1024. {
  1025. unsigned long flags;
  1026. unsigned char leds, kbd_leds;
  1027. spin_lock_irqsave(&sunkbd_lock, flags);
  1028. leds = getleds();
  1029. kbd_leds = vcleds_to_sunkbd(leds);
  1030. if (kbd_leds != sunkbd_ledstate) {
  1031. ledstate = leds;
  1032. sunkbd_ledstate = kbd_leds;
  1033. send_cmd(SKBDCMD_SETLED);
  1034. send_cmd(kbd_leds);
  1035. }
  1036. spin_unlock_irqrestore(&sunkbd_lock, flags);
  1037. }
  1038. /* Support for keyboard "beeps". */ 
  1039. /* Timer routine to turn off the beep after the interval expires. */
  1040. static void sunkbd_kd_nosound(unsigned long __unused)
  1041. {
  1042. unsigned long flags;
  1043. spin_lock_irqsave(&sunkbd_lock, flags);
  1044. send_cmd(SKBDCMD_BELLOFF);
  1045. spin_unlock_irqrestore(&sunkbd_lock, flags);
  1046. }
  1047. /*
  1048.  * Initiate a keyboard beep. If the frequency is zero, then we stop
  1049.  * the beep. Any other frequency will start a monotone beep. The beep
  1050.  * will be stopped by a timer after "ticks" jiffies. If ticks is 0,
  1051.  * then we do not start a timer.
  1052.  */
  1053. static void sunkbd_kd_mksound(unsigned int hz, unsigned int ticks)
  1054. {
  1055. unsigned long flags;
  1056. static struct timer_list sound_timer = { function: sunkbd_kd_nosound };
  1057. spin_lock_irqsave(&sunkbd_lock, flags);
  1058. del_timer(&sound_timer);
  1059. if (hz) {
  1060. send_cmd(SKBDCMD_BELLON);
  1061. if (ticks) {
  1062. sound_timer.expires = jiffies + ticks;
  1063. add_timer(&sound_timer);
  1064. }
  1065. } else
  1066. send_cmd(SKBDCMD_BELLOFF);
  1067. spin_unlock_irqrestore(&sunkbd_lock, flags);
  1068. }
  1069. extern void (*kd_mksound)(unsigned int hz, unsigned int ticks);
  1070. int __init sun_kbd_init(void)
  1071. {
  1072. int i, opt_node;
  1073. struct kbd_struct kbd0;
  1074. extern struct tty_driver console_driver;
  1075. kbd0.ledflagstate = kbd0.default_ledflagstate = KBD_DEFLEDS;
  1076. kbd0.ledmode = LED_SHOW_FLAGS;
  1077. kbd0.lockstate = KBD_DEFLOCK;
  1078. kbd0.slockstate = 0;
  1079. kbd0.modeflags = KBD_DEFMODE;
  1080. kbd0.kbdmode = VC_XLATE;
  1081.  
  1082. for (i = 0 ; i < MAX_NR_CONSOLES ; i++)
  1083. kbd_table[i] = kbd0;
  1084. ttytab = console_driver.table;
  1085. kd_mksound = sunkbd_kd_mksound;
  1086. /* XXX Check keyboard-click? property in 'options' PROM node XXX */
  1087. if(sparc_cpu_model != sun4) {
  1088. opt_node = prom_getchild(prom_root_node);
  1089. opt_node = prom_searchsiblings(opt_node, "options");
  1090. i = prom_getintdefault(opt_node, "keyboard-click?", -1);
  1091. if(i != -1)
  1092. sunkbd_clickp = 1;
  1093. else
  1094. sunkbd_clickp = 0;
  1095. } else {
  1096. sunkbd_clickp = 0;
  1097. }
  1098. keyboard_tasklet.func = sun_kbd_bh;
  1099. tasklet_enable(&keyboard_tasklet);
  1100. tasklet_schedule(&keyboard_tasklet);
  1101. return 0;
  1102. }
  1103. /* /dev/kbd support */
  1104. #define KBD_QSIZE 32
  1105. static Firm_event kbd_queue [KBD_QSIZE];
  1106. static int kbd_head, kbd_tail;
  1107. static spinlock_t kbd_queue_lock = SPIN_LOCK_UNLOCKED;
  1108. char kbd_opened;
  1109. static int kbd_active = 0;
  1110. static DECLARE_WAIT_QUEUE_HEAD(kbd_wait);
  1111. static struct fasync_struct *kb_fasync;
  1112. void
  1113. push_kbd (int scan)
  1114. {
  1115. unsigned long flags;
  1116. int next;
  1117. if (scan == KBD_IDLE)
  1118. return;
  1119. spin_lock_irqsave(&kbd_queue_lock, flags);
  1120. next = (kbd_head + 1) % KBD_QSIZE;
  1121. if (next != kbd_tail){
  1122. kbd_queue [kbd_head].id = scan & KBD_KEYMASK;
  1123. kbd_queue [kbd_head].value=scan & KBD_UP ? VKEY_UP : VKEY_DOWN;
  1124. kbd_queue [kbd_head].time = xtime;
  1125. kbd_head = next;
  1126. }
  1127. spin_unlock_irqrestore(&kbd_queue_lock, flags);
  1128. kill_fasync (&kb_fasync, SIGIO, POLL_IN);
  1129. wake_up_interruptible (&kbd_wait);
  1130. }
  1131. static ssize_t
  1132. kbd_read (struct file *f, char *buffer, size_t count, loff_t *ppos)
  1133. {
  1134. DECLARE_WAITQUEUE(wait, current);
  1135. unsigned long flags;
  1136. char *end, *p;
  1137. /* Return EWOULDBLOCK, because this is what the X server expects */
  1138. if (kbd_head == kbd_tail){
  1139. if (f->f_flags & O_NONBLOCK)
  1140. return -EWOULDBLOCK;
  1141. add_wait_queue (&kbd_wait, &wait);
  1142. repeat:
  1143. set_current_state(TASK_INTERRUPTIBLE);
  1144. if (kbd_head == kbd_tail && !signal_pending(current)) {
  1145. schedule();
  1146. goto repeat;
  1147. }
  1148. current->state = TASK_RUNNING;
  1149. remove_wait_queue (&kbd_wait, &wait);
  1150. }
  1151. /* There is data in the keyboard, fill the user buffer */
  1152. end = buffer+count;
  1153. p = buffer;
  1154. spin_lock_irqsave(&kbd_queue_lock, flags);
  1155. for (; p < end && kbd_head != kbd_tail;){
  1156. Firm_event this_event = kbd_queue[kbd_tail];
  1157. kbd_tail = (kbd_tail + 1) % KBD_QSIZE;
  1158. spin_unlock_irqrestore(&kbd_queue_lock, flags);
  1159. #ifdef CONFIG_SPARC32_COMPAT
  1160. if (current->thread.flags & SPARC_FLAG_32BIT) {
  1161. if (copy_to_user((Firm_event *)p, &this_event,
  1162.  sizeof(Firm_event)-sizeof(struct timeval)))
  1163. return -EFAULT;
  1164. p += sizeof(Firm_event)-sizeof(struct timeval);
  1165. if (__put_user(this_event.time.tv_sec, (u32 *)p))
  1166. return -EFAULT;
  1167. p += sizeof(u32);
  1168. if (__put_user(this_event.time.tv_usec, (u32 *)p))
  1169. return -EFAULT;
  1170. p += sizeof(u32);
  1171. } else
  1172. #endif
  1173. {
  1174. if (copy_to_user((Firm_event *)p, &this_event, 
  1175.  sizeof(Firm_event)))
  1176. return -EFAULT;
  1177. p += sizeof (Firm_event);
  1178. }
  1179. #ifdef KBD_DEBUG
  1180. printk ("[%s]", this_event.value == VKEY_UP ? "UP" : "DOWN");
  1181. #endif
  1182. spin_lock_irqsave(&kbd_queue_lock, flags);
  1183. }
  1184. spin_unlock_irqrestore(&kbd_queue_lock, flags);
  1185. return p-buffer;
  1186. }
  1187. /* Needed by X */
  1188. static int kbd_fasync (int fd, struct file *filp, int on)
  1189. {
  1190. int retval;
  1191. retval = fasync_helper (fd, filp, on, &kb_fasync);
  1192. if (retval < 0)
  1193. return retval;
  1194. return 0;
  1195. }
  1196. static unsigned int kbd_poll (struct file *f, poll_table *wait)
  1197. {
  1198. poll_wait(f, &kbd_wait, wait);
  1199. if (kbd_head != kbd_tail)
  1200. return POLLIN | POLLRDNORM;
  1201. return 0;
  1202. }
  1203. static int
  1204. kbd_ioctl (struct inode *i, struct file *f, unsigned int cmd, unsigned long arg)
  1205. {
  1206. unsigned char c;
  1207. unsigned char leds = 0;
  1208. int value;
  1209. switch (cmd){
  1210. case KIOCTYPE:   /* return keyboard type */
  1211. if (put_user(sunkbd_type, (int *) arg))
  1212. return -EFAULT;
  1213. break;
  1214. case KIOCGTRANS:
  1215. if (put_user(TR_UNTRANS_EVENT, (int *) arg))
  1216. return -EFAULT;
  1217. break;
  1218. case KIOCTRANS:
  1219. if (get_user(value, (int *) arg))
  1220. return -EFAULT;
  1221. if (value != TR_UNTRANS_EVENT)
  1222. return -EINVAL;
  1223. break;
  1224. case KIOCLAYOUT:
  1225. if (put_user(sunkbd_layout, (int *) arg))
  1226. return -EFAULT;
  1227. break;
  1228. case KIOCSDIRECT:
  1229. #ifndef CODING_NEW_DRIVER
  1230. if (get_user(value, (int *) arg))
  1231. return -EFAULT;
  1232. if(value)
  1233. kbd_redirected = fg_console + 1;
  1234. else
  1235. kbd_redirected = 0;
  1236. kbd_table [fg_console].kbdmode = kbd_redirected ? VC_RAW : VC_XLATE;
  1237. #endif
  1238. break;
  1239. case KIOCCMD:
  1240. if (get_user(value, (int *) arg))
  1241. return -EFAULT;
  1242. c = (unsigned char) value;
  1243. switch (c) {
  1244. case SKBDCMD_CLICK:
  1245. case SKBDCMD_NOCLICK:
  1246. spin_lock_irq(&sunkbd_lock);
  1247. send_cmd(c);
  1248. spin_unlock_irq(&sunkbd_lock);
  1249. return 0;
  1250. case SKBDCMD_BELLON:
  1251. kd_mksound(1,0);
  1252. return 0;
  1253. case SKBDCMD_BELLOFF:
  1254. kd_mksound(0,0);
  1255. return 0;
  1256. default:
  1257. return -EINVAL;
  1258. }
  1259. case KIOCSLED:
  1260. if (get_user(c, (unsigned char *) arg))
  1261. return -EFAULT;
  1262. if (c & LED_SCRLCK) leds |= (1 << VC_SCROLLOCK);
  1263. if (c & LED_NLOCK) leds |= (1 << VC_NUMLOCK);
  1264. if (c & LED_CLOCK) leds |= (1 << VC_CAPSLOCK);
  1265. compose_led_on = !!(c & LED_CMPOSE);
  1266. sun_setledstate(kbd_table + fg_console, leds);
  1267. break;
  1268. case KIOCGLED:
  1269. if (put_user(vcleds_to_sunkbd(getleds()), (unsigned char *) arg))
  1270. return -EFAULT;
  1271. break;
  1272. case KIOCGRATE:
  1273. {
  1274. struct kbd_rate rate;
  1275. rate.delay = kbd_delay_ticks;
  1276. if (kbd_rate_ticks)
  1277. rate.rate = HZ / kbd_rate_ticks;
  1278. else
  1279. rate.rate = 0;
  1280. if (copy_to_user((struct kbd_rate *)arg, &rate,
  1281.  sizeof(struct kbd_rate)))
  1282. return -EFAULT;
  1283. return 0;
  1284. }
  1285. case KIOCSRATE:
  1286. {
  1287. struct kbd_rate rate;
  1288. if (verify_area(VERIFY_READ, (void *)arg,
  1289. sizeof(struct kbd_rate)))
  1290. return -EFAULT;
  1291. copy_from_user(&rate, (struct kbd_rate *)arg,
  1292.        sizeof(struct kbd_rate));
  1293. if (rate.rate > 50)
  1294. return -EINVAL;
  1295. if (rate.rate == 0)
  1296. kbd_rate_ticks = 0;
  1297. else
  1298. kbd_rate_ticks = HZ / rate.rate;
  1299. kbd_delay_ticks = rate.delay;
  1300. return 0;
  1301. }
  1302. case FIONREAD: /* return number of bytes in kbd queue */
  1303. {
  1304. int count;
  1305. count = kbd_head - kbd_tail;
  1306. if (put_user((count < 0) ? KBD_QSIZE - count : count, (int *) arg))
  1307. return -EFAULT;
  1308. return 0;
  1309. }
  1310. default:
  1311. printk ("Unknown Keyboard ioctl: %8.8xn", cmd);
  1312. return -EINVAL;
  1313. }
  1314. return 0;
  1315. }
  1316. static int
  1317. kbd_open (struct inode *i, struct file *f)
  1318. {
  1319. spin_lock_irq(&kbd_queue_lock);
  1320. kbd_active++;
  1321. if (kbd_opened)
  1322. goto out;
  1323. kbd_opened = fg_console + 1;
  1324. kbd_head = kbd_tail = 0;
  1325.  out:
  1326. spin_unlock_irq(&kbd_queue_lock);
  1327. return 0;
  1328. }
  1329. static int
  1330. kbd_close (struct inode *i, struct file *f)
  1331. {
  1332. spin_lock_irq(&kbd_queue_lock);
  1333. if (!--kbd_active) {
  1334. if (kbd_redirected)
  1335. kbd_table [kbd_redirected-1].kbdmode = VC_XLATE;
  1336. kbd_redirected = 0;
  1337. kbd_opened = 0;
  1338. kbd_fasync (-1, f, 0);
  1339. }
  1340. spin_unlock_irq(&kbd_queue_lock);
  1341. return 0;
  1342. }
  1343. static struct file_operations kbd_fops =
  1344. {
  1345. read: kbd_read,
  1346. poll: kbd_poll,
  1347. ioctl: kbd_ioctl,
  1348. open: kbd_open,
  1349. release: kbd_close,
  1350. fasync: kbd_fasync,
  1351. };
  1352. void __init keyboard_zsinit(void (*put_char)(unsigned char))
  1353. {
  1354. int timeout = 0;
  1355. kbd_put_char = put_char;
  1356. if (!kbd_put_char)
  1357. panic("keyboard_zsinit: no put_char parameter");
  1358. /* Test out the leds */
  1359. sunkbd_type = 255;
  1360. sunkbd_layout = 0;
  1361. send_cmd(SKBDCMD_RESET);
  1362. send_cmd(SKBDCMD_RESET);
  1363. while((sunkbd_type==255) && timeout++ < 25000) {
  1364. udelay(100);
  1365. barrier();
  1366. }
  1367. if(timeout>=25000) {
  1368. printk("keyboard: not presentn");
  1369. return;
  1370. }
  1371. if(sunkbd_type != SUNKBD_TYPE4) {
  1372. printk("Sun TYPE %d keyboard detected ", sunkbd_type);
  1373. } else {
  1374. timeout=0;
  1375. while((sunkbd_layout==0) && timeout++ < 10000) {
  1376. udelay(100);
  1377. barrier();
  1378. }
  1379. printk("Sun TYPE %d keyboard detected ",
  1380.        ((sunkbd_layout & SUNKBD_LOUT_TYP5_MASK) ? 5 : 4));
  1381. }
  1382. if(sunkbd_type == SUNKBD_TYPE2)
  1383. sunkbd_clickp = 0;
  1384. spin_lock_irq(&sunkbd_lock);
  1385. if(sunkbd_clickp) {
  1386. send_cmd(SKBDCMD_CLICK);
  1387. printk("with keyclickn");
  1388. } else {
  1389. send_cmd(SKBDCMD_NOCLICK);
  1390. printk("without keyclickn");
  1391. }
  1392. /* Dork with led lights, then turn them all off */
  1393. send_cmd(SKBDCMD_SETLED); send_cmd(0xf); /* All on */
  1394. send_cmd(SKBDCMD_SETLED); send_cmd(0x0); /* All off */
  1395. spin_unlock_irq(&sunkbd_lock);
  1396. /* Register the /dev/kbd interface */
  1397. devfs_register (NULL, "kbd", DEVFS_FL_DEFAULT,
  1398. KBD_MAJOR, 0,
  1399. S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH,
  1400. &kbd_fops, NULL);
  1401. if (devfs_register_chrdev (KBD_MAJOR, "kbd", &kbd_fops)){
  1402. printk ("Could not register /dev/kbd devicen");
  1403. return;
  1404. }
  1405. return;
  1406. }