patch-2.4.4 linux/drivers/char/hp600_keyb.c
Next file: linux/drivers/char/i810_rng.c
Previous file: linux/drivers/char/ftape/zftape/zftape-vtbl.c
Back to the patch index
Back to the overall index
- Lines: 350
- Date:
Wed Apr 11 21:24:52 2001
- Orig file:
v2.4.3/linux/drivers/char/hp600_keyb.c
- Orig date:
Fri Sep 22 14:21:17 2000
diff -u --recursive --new-file v2.4.3/linux/drivers/char/hp600_keyb.c linux/drivers/char/hp600_keyb.c
@@ -1,13 +1,17 @@
/*
- * $Id: hp600_keyb.c,v 1.1 2000/06/10 21:45:30 yaegashi Exp $
+ * $Id$
* Copyright (C) 2000 YAEGASHI Takeshi
- * HP600 keyboard scan routine and translate table
+ * HP600 keyboard scan routine and translation table
+ * Copyright (C) 2000 Niibe Yutaka
+ * HP620 keyboard translation table
*/
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/init.h>
-#include <linux/delay.h>
+
+#include <asm/machvec.h>
+#include <asm/delay.h>
#include <asm/io.h>
#include "scan_keyb.h"
@@ -17,55 +21,119 @@
#define PFDR 0xa400012a
#define PGDR 0xa400012c
#define PHDR 0xa400012e
+#define PJDR 0xa4000130
+#define PKDR 0xa4000132
+#define PLDR 0xa4000134
+
+static const unsigned char hp620_japanese_table[] = {
+ /* PTD1 */
+ 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+ /* PTD5 */
+ 0x18, 0x19, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ /* PTD7 */
+ 0x26, 0x1a, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+ /* PTE0 */
+ 0x27, 0x1b, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x2a, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* PTE1 */
+ 0x35, 0x28, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x3a, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x34,
+ /* PTE3 */
+ 0x48, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2d, 0x2e, 0x7b, 0x30, 0x31, 0x32, 0x33,
+ /* PTE6 */
+ 0x4b, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x2c, 0x38, 0x00, 0x39, 0x79, 0x7d, 0x73,
+ /* PTE7 */
+ 0x41, 0x42, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40,
+ /* **** */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
-static const unsigned char hp690_japanese_table[]={
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x70, 0x3a,
- 0x3f, 0x3e, 0x40, 0x41, 0x42, 0x3d, 0x3c, 0x3b,
-
- 0x00, 0x00, 0x00, 0x2c, 0x00, 0x1c, 0x28, 0x35,
- 0x31, 0x30, 0x32, 0x33, 0x34, 0x2f, 0x2e, 0x2d,
-
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x50,
- 0x7b, 0x38, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00,
+static const unsigned char hp680_japanese_table[] = {
+ /* PTD1 */
+ 0x3a, 0x70, 0x29, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x3b, 0x3c, 0x3d, 0x42, 0x41, 0x40, 0x3e, 0x3f,
+ /* PTD5 */
+ 0x35, 0x28, 0x1c, 0x00, 0x2c, 0x00, 0x00, 0x00,
+ 0x2d, 0x2e, 0x2f, 0x34, 0x33, 0x32, 0x30, 0x31,
+ /* PTD7 */
+ 0x50, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x38, 0x7b,
+ /* PTE0 */
+ 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00,
+ 0x1d, 0x00, 0x39, 0x53, 0x73, 0xf9, 0x00, 0x00,
+ /* PTE1 */
+ 0x27, 0x1b, 0x2b, 0x00, 0x1e, 0x00, 0x00, 0x00,
+ 0x1f, 0x20, 0x21, 0x26, 0x25, 0x24, 0x22, 0x23,
+ /* PTE3 */
+ 0x48, 0x7d, 0x36, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* PTE6 */
+ 0x19, 0x1a, 0x0e, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x11, 0x12, 0x13, 0x18, 0x17, 0x16, 0x14, 0x15,
+ /* PTE7 */
+ 0x0b, 0x0c, 0x0d, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x03, 0x04, 0x05, 0x0a, 0x09, 0x08, 0x06, 0x07,
+ /* **** */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xf9, 0x73, 0x53, 0x39, 0x00, 0x1d,
-
- 0x00, 0x00, 0x00, 0x1e, 0x00, 0x2b, 0x1b, 0x27,
- 0x23, 0x22, 0x24, 0x25, 0x26, 0x21, 0x20, 0x1f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
- 0x00, 0x00, 0x00, 0x0f, 0x00, 0x36, 0x7d, 0x48,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00,
- 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x1a, 0x19,
- 0x15, 0x14, 0x16, 0x17, 0x18, 0x13, 0x12, 0x11,
+static int hp620_japanese_scan_kbd(unsigned char *s)
+{
+ int i;
+ unsigned char matrix_switch[] = {
+ 0xfd, 0xff, /* PTD1 */
+ 0xdf, 0xff, /* PTD5 */
+ 0x7f, 0xff, /* PTD7 */
+ 0xff, 0xfe, /* PTE0 */
+ 0xff, 0xfd, /* PTE1 */
+ 0xff, 0xf7, /* PTE3 */
+ 0xff, 0xbf, /* PTE6 */
+ 0xff, 0x7f, /* PTE7 */
+ }, *t=matrix_switch;
- 0x00, 0x00, 0x00, 0x02, 0x00, 0x0d, 0x0c, 0x0b,
- 0x07, 0x06, 0x08, 0x09, 0x0a, 0x05, 0x04, 0x03,
+ for(i=0; i<8; i++) {
+ ctrl_outb(*t++, PDDR);
+ ctrl_outb(*t++, PEDR);
+ udelay(50);
+ *s++=ctrl_inb(PCDR);
+ *s++=ctrl_inb(PFDR);
+ }
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+ ctrl_outb(0xff, PDDR);
+ ctrl_outb(0xff, PEDR);
+ *s++=ctrl_inb(PGDR);
+ *s++=ctrl_inb(PHDR);
-static const unsigned char hp690_switch[]= {
- 0xfd, 0xff,
- 0xdf, 0xff,
- 0x7f, 0xff,
- 0xff, 0xfe,
- 0xff, 0xfd,
- 0xff, 0xf7,
- 0xff, 0xbf,
- 0xff, 0x7f,
-};
+ return 0;
+}
-static void hp690_japanese_scan_kbd(unsigned char *s)
+static int hp680_japanese_scan_kbd(unsigned char *s)
{
int i;
- unsigned const char *t=hp690_switch;
+ unsigned char matrix_switch[] = {
+ 0xfd, 0xff, /* PTD1 */
+ 0xdf, 0xff, /* PTD5 */
+ 0x7f, 0xff, /* PTD7 */
+ 0xff, 0xfe, /* PTE0 */
+ 0xff, 0xfd, /* PTE1 */
+ 0xff, 0xf7, /* PTE3 */
+ 0xff, 0xbf, /* PTE6 */
+ 0xff, 0x7f, /* PTE7 */
+ }, *t=matrix_switch;
- for(i=0; i<9; i++) {
+ for(i=0; i<8; i++) {
ctrl_outb(*t++, PDDR);
ctrl_outb(*t++, PEDR);
*s++=ctrl_inb(PCDR);
@@ -77,18 +145,25 @@
*s++=ctrl_inb(PGDR);
*s++=ctrl_inb(PHDR);
+
+ return 0;
}
void __init hp600_kbd_init_hw(void)
{
scan_kbd_init();
- register_scan_keyboard(hp690_japanese_scan_kbd,
- hp690_japanese_table, 18);
+
+ if (MACH_HP620)
+ register_scan_keyboard(hp620_japanese_scan_kbd,
+ hp620_japanese_table, 18);
+ else if (MACH_HP680 || MACH_HP690)
+ register_scan_keyboard(hp680_japanese_scan_kbd,
+ hp680_japanese_table, 18);
+
printk(KERN_INFO "HP600 matrix scan keyboard registered\n");
}
-
/****************************************************************
HP Jornada 690(Japanese version) keyboard scan matrix
@@ -102,7 +177,6 @@
PTE6 REC Q on/off BS @ P
PTE7 REC 1 on/off ^ - 0
-
PTF7 PTF6 PTF5 PTF4 PTF3 PTF2 PTF1 PTF0
PTD1 F5 F4 F6 F7 F8 F3 F2 F1
PTD5 N B M , . V C X
@@ -129,3 +203,136 @@
L: 0x0c3c 0x26 F F IP F F IP IP F
****************************************************************/
+
+/****************************************************************
+HP Jornada 620(Japanese version) keyboard scan matrix
+
+ PTC7 PTC6 PTC5 PTC4 PTC3 PTC2 PTC1 PTC0
+PTD1 EREC BS Ctrl on/off - 0 9
+PTD5 EREC BS Ctrl on/off ^ P O
+PTD7 EREC BS Ctrl on/off ] @ L
+PTE0 EREC BS Ctrl on/off Han/Zen [ ;
+PTE1 EREC BS Ctrl on/off Enter : /
+PTE3 EREC BS Ctrl on/off Right Up
+PTE6 EREC BS Ctrl on/off Down Left
+PTE7 EREC BS Ctrl on/off F8 F7
+
+ PTF7 PTF6 PTF5 PTF4 PTF3 PTF2 PTF1 PTF0
+PTD1 8 7 6 5 4 3 2 1
+PTD5 I U Y T R E W Q
+PTD7 K J H G F D S A
+PTE0 ESC Tab Shift
+PTE1 . V Caps Hira
+PTE3 , M N B Muhen C X
+PTE6 _ \ Henkan Space Alt Z
+PTE7 F6 F5 F4 F3 F2 F1 REC
+
+ PTH0
+* on/off
+
+ 7 6 5 4 3 2 1 0
+C: 0xffff 0xff IP IP IP IP IP IP IP IP
+D: 0x4404 0xaf O F O F F F O F
+E: 0x5045 0xff O O F F O F O O
+F: 0xffff 0xff IP IP IP IP IP IP IP IP
+G: 0xd5ff 0x00 IP O O O IP IP IP IP
+H: 0x63ff 0xd1 O I F IP IP IP IP IP
+J: 0x0004 0x02 F F F F F F O F
+K: 0x0401 0xff F F O F F F F O
+L: 0x0c00 0x20 F F IP F F F F F
+
+ADCSR: 0x08
+ADCR: 0x3f
+
+ ****************************************************************/
+
+/****************************************************************
+Japanese 109 keyboard scan code layout
+
+ E02A- E1-
+01 3B 3C 3D 3E 3F 40 41 42 43 44 57 58 E037 46 1045
+
+29 02 03 04 05 06 07 08 09 0A 0B 0C 0D 7D 0E E052 E047 E049 45 E035 37 4A
+0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C E053 E04F E051 47 48 49 4E
+3A 1E 1F 20 21 22 23 24 25 26 27 28 2B 4B 4C 4D
+2A 2C 2D 2E 2F 30 31 32 33 34 35 73 36 E048 4F 50 51 E0-
+1D DB 38 7B 39 79 70 E038 DC DD E01D E04B E050 E04D 52 53 1C
+
+****************************************************************/
+
+#if 0
+int __init hp620_keyboard_test(void)
+{
+ int i;
+ unsigned char s[18];
+ unsigned long a, b, c, d;
+
+ printk("PCCR: %04lx, PCDR: %02lx\n",
+ ctrl_inw(0xa4000104), ctrl_inb(0xa4000124));
+ printk("PDCR: %04lx, PDDR: %02lx\n",
+ ctrl_inw(0xa4000106), ctrl_inb(0xa4000126));
+ printk("PECR: %04lx, PEDR: %02lx\n",
+ ctrl_inw(0xa4000108), ctrl_inb(0xa4000128));
+ printk("PFCR: %04lx, PFDR: %02lx\n",
+ ctrl_inw(0xa400010a), ctrl_inb(0xa400012a));
+ printk("PGCR: %04lx, PGDR: %02lx\n",
+ ctrl_inw(0xa400010c), ctrl_inb(0xa400012c));
+ printk("PHCR: %04lx, PHDR: %02lx\n",
+ ctrl_inw(0xa400010e), ctrl_inb(0xa400012e));
+ printk("PJCR: %04lx, PJDR: %02lx\n",
+ ctrl_inw(0xa4000110), ctrl_inb(0xa4000130));
+ printk("PKCR: %04lx, PKDR: %02lx\n",
+ ctrl_inw(0xa4000112), ctrl_inb(0xa4000132));
+ printk("PLCR: %04lx, PLDR: %02lx\n",
+ ctrl_inw(0xa4000114), ctrl_inb(0xa4000134));
+
+ printk("ADCSR: %02lx, ADCR: %02lx\n",
+ ctrl_inb(0xa4000090), ctrl_inb(0xa4000092));
+
+ ctrl_inb(0xa4000004);
+ ctrl_inb(0xa4000006);
+ ctrl_inb(0xa4000008);
+ ctrl_outb(0, 0xa4000004);
+ ctrl_outb(0, 0xa4000006);
+ ctrl_outb(0, 0xa4000008);
+ ctrl_outb(0, 0xa4000090);
+ ctrl_outb(0x3b, 0xa4000090);
+
+ while(1) {
+ hp620_japanese_scan_kbd(s);
+ for(i=0; i<18; i+=2)
+ printk("%02x%02x ", s[i], s[i+1]);
+
+#if 0
+ ctrl_outb(~2, PJDR);
+ printk("%02lx%02lx ", ctrl_inb(PCDR), ctrl_inb(PFDR));
+ ctrl_outb(0xff, PJDR);
+ ctrl_outb(~1, PKDR);
+ printk("%02lx%02lx ", ctrl_inb(PCDR), ctrl_inb(PFDR));
+ ctrl_outb(~32, PKDR);
+ printk("%02lx%02lx ", ctrl_inb(PCDR), ctrl_inb(PFDR));
+ ctrl_outb(0xff, PKDR);
+#endif
+
+ printk("%02lx%02lx%02lx%02lx ", a, b, c, d);
+ if(ctrl_inb(0xa4000090)&0x80) {
+ a=ctrl_inb(0xa4000080);
+ b=ctrl_inb(0xa4000084);
+ c=ctrl_inb(0xa4000088);
+ d=ctrl_inb(0xa400008c);
+ ctrl_outb(0x3b, 0xa4000090);
+ }
+ printk("%02lx%02lx%02lx ",
+ ctrl_inb(0xa4000004),
+ ctrl_inb(0xa4000006),
+ ctrl_inb(0xa4000008));
+
+ printk("\n");
+ }
+
+ return 0;
+}
+module_init(keyboard_probe);
+#endif
+
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)