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

Linux/Unix编程

开发平台:

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