From: Paul M. <le...@li...> - 2007-07-16 22:05:52
|
On Mon, Jul 16, 2007 at 11:47:40PM -0700, Kristoffer Ericson wrote: > Paul could you just give this a check. Im working on scan_keyb and that should be ready tommorow. > > This patch is based on what andriy made with my additions : > Keymap now uses KEY_X instead of 0x00.. > Fixed for dead keys, so they all work. > Please take this up with Dmitry (added to CC), that's where these things end up going anyways.. > diff --git a/drivers/input/keyboard/hp680_keyb.c b/drivers/input/keyboard/hp680_keyb.c > new file mode 100644 > index 0000000..2890668 > --- /dev/null > +++ b/drivers/input/keyboard/hp680_keyb.c > @@ -0,0 +1,218 @@ > +/* > + * drivers/input/keyboard/hp680_keyb.c > + * > + * HP Jornada 680/690 scan keyboard > + * > + * Copyright (C) 2005 Andriy Skulysh > + * Copyright (C) 2006 Paul Mundt > + * Copyright (C) 2007 Kristoffer Ericson <Kri...@gm...> > + * > + * Splitted from drivers/input/keyboard/hp600_keyb.c > + * > + * Copyright (C) 2000 YAEGASHI Takeshi > + * HP600 keyboard scan routine and translation table > + * Copyright (C) 2000 Niibe Yutaka > + * HP620 keyboard translation table > + */ > +#include <linux/input.h> > +#include <linux/kernel.h> > +#include <linux/module.h> > +#include <linux/init.h> > +#include <asm/delay.h> > +#include <asm/io.h> > +#include "scan_keyb.h" > + > +#define PCCR 0xa4000104 > +#define PDCR 0xa4000106 > +#define PECR 0xa4000108 > +#define PFCR 0xa400010a > +#define PCDR 0xa4000124 > +#define PDDR 0xa4000126 > +#define PEDR 0xa4000128 > +#define PFDR 0xa400012a > +#define PGDR 0xa400012c > +#define PHDR 0xa400012e > +#define PJDR 0xa4000130 > +#define PKDR 0xa4000132 > +#define PLDR 0xa4000134 > + > +/*************************************************************** > +HP Jornada 680(SWEDISH version) keyboard > +[!] indicates Special Characters > +______________________________________________________________________ > +| ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 POWER| > +| 1 2 3 4 5 6 7 8 9 0 + ` BKPSPACE| > +|* Q W E R T Y U I O P ! ^ ENTER| > +| TAB A S D F G H J K L ! ! ' ENTER| > +| SHIFT Z X C V B N M , . - UP SHIFT| > +| CTRL WIN ALT ? =======SPACE======== ALTG DEL LEF DO RI ] > +----------------------------------------------------------------------- > +****************************************************************/ > + > +/**************************************************************** > +HP Jornada 690(Japanese version) keyboard scan matrix > + > + PTC7 PTC6 PTC5 PTC4 PTC3 PTC2 PTC1 PTC0 > +PTD1 REC Escape on/off Han/Zen Hira Eisu > +PTD5 REC Z on/off Enter : / > +PTD7 REC Right Down > +PTE0 REC Windows on/off > +PTE1 REC A on/off ] [ ; > +PTE3 REC Tab on/off ShirtR \ Up > +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 > +PTD7 Muhen Alt Left > +PTE0 Henkan _ Del Space Ctrl > +PTE1 H G J K L F D S > +PTE3 ShiftL > +PTE6 Y T U I O R E W > +PTE7 6 5 7 8 9 4 3 2 > + > + PTG5 PTG4 PTG3 PTG0 PTH0 > +* REC REW FWW Cover on/off > + > + > + 7 6 5 4 3 2 1 0 > +C: 0xffff 0xdf IP IP IP IP IP IP IP IP > +D: 0x6786 0x59 O I O IP I F O I > +E: 0x5045 0x00 O O F F O F O O > +F: 0xffff 0xff IP IP IP IP IP IP IP IP > +G: 0xaffe 0xfd I I IP IP IP IP IP I > +H: 0x70f2 0x49 O IP F F IP IP F I > +J: 0x0704 0x22 F F O IP F F O F > +K: 0x0100 0x10 F F F O F F F F > +L: 0x0c3c 0x26 F F IP F F IP IP F > + > +****************************************************************/ > + > +static const unsigned char hp680kbd_scancodes[] = { > + /* PTD1 */ > + KEY_CAPSLOCK, KEY_MACRO, KEY_LEFTCTRL, KEY_RESERVED, KEY_ESC, KEY_RESERVED, > + KEY_RESERVED, KEY_RESERVED, KEY_F1, KEY_F2, KEY_F3, KEY_F8, KEY_F7, KEY_F2, > + KEY_F4, KEY_F5, > + > + /* PTD5 */ > + KEY_SLASH, KEY_APOSTROPHE, KEY_ENTER, KEY_RESERVED, KEY_Z, KEY_RESERVED, > + KEY_RESERVED, KEY_RESERVED, KEY_X, KEY_C, KEY_V, KEY_DOT, KEY_COMMA, > + KEY_M, KEY_B, KEY_N, > + > + /* PTD7 */ > + KEY_KP2, KEY_KP6, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, > + KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_KP4, > + KEY_RESERVED, KEY_RESERVED, KEY_LEFTALT, KEY_HANJA, > + > + /* PTE0 */ > + KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_FINANCE, KEY_RESERVED, > + KEY_RESERVED, KEY_RESERVED, KEY_LEFTCTRL, KEY_RESERVED, KEY_SPACE, KEY_KPDOT, > + KEY_VOLUMEUP, 249, KEY_RESERVED, KEY_RESERVED, > + > + /* PTE1 */ > + KEY_SEMICOLO, KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_RESERVED, KEY_A, KEY_RESERVED, > + KEY_RESERVED, KEY_RESERVED, KEY_S, KEY_D, KEY_F, KEY_L, KEY_K, KEY_J, KEY_G, KEY_H, > + > + /* PTE3 */ > + KEY_KP8, KEY_LEFTMETA, KEY_RIGHTSHIFT, KEY_RESERVED, KEY_TAB, KEY_RESERVED, KEY_RESERVED, > + KEY_RESERVED, KEY_RESERVED, KEY_LEFTSHIFT, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, > + KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, > + > + /* PTE6 */ > + KEY_P, KEY_LEFTBRACE, KEY_BACKSPACE, KEY_RESERVED, KEY_Q, KEY_RESERVED, KEY_RESERVED, > + KEY_RESERVED, KEY_W, KEY_E, KEY_R, KEY_O, KEY_I, KEY_U, KEY_T, KEY_R, > + > + /* PTE7 */ > + KEY_0, KEY_MINUS, KEY_EQUAL, KEY_RESERVED, KEY_1, KEY_RESERVED, KEY_RESERVED, > + KEY_RESERVED, KEY_2, KEY_3, KEY_4, KEY_9, KEY_8, KEY_7, KEY_5, KEY_6, > + > + /* **** */ > + KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, > + KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, > + KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, > +}; > + > +static int hp680_japanese_scan_kbd(unsigned char *s) > +{ > + int i; > + unsigned short ec_static,dc_static; /* = UINT16_t */ > + unsigned char matrix_switch[] = { > + 0xfd, 0xff, /* PTD1 PD(1) */ > + 0xdf, 0xff, /* PTD5 PD(5) */ > + 0x7f, 0xff, /* PTD7 PD(7) */ > + 0xff, 0xfe, /* PTE0 PE(0) */ > + 0xff, 0xfd, /* PTE1 PE(1) */ > + 0xff, 0xf7, /* PTE3 PE(3) */ > + 0xff, 0xbf, /* PTE6 PE(6) */ > + 0xff, 0x7f, /* PTE7 PE(7) */ > + }, *t=matrix_switch; > + /* PD(x) : > + 1. 0xcc0c & (1~(1 << (2*(x)+1))))) > + 2. (0xf0cf & 0xfffff) */ > + /* PE(x) : > + 1. 0xcc0c & 0xffff > + 2. 0xf0cf & (1~(1 << (2*(x)+1))))) */ > + unsigned short matrix_PDE[] = { > + 0xcc04, 0xf0cf, /* PD(1) */ > + 0xc40c, 0xf0cf, /* PD(5) */ > + 0x4c0c, 0xf0cf, /* PD(7) */ > + 0xcc0c, 0xf0cd, /* PE(0) */ > + 0xcc0c, 0xf0c7, /* PE(1) */ > + 0xcc0c, 0xf04f, /* PE(3) */ > + 0xcc0c, 0xd0cf, /* PE(6) */ > + 0xcc0c, 0x70cf, /* PE(7) */ > + }, *y=matrix_PDE; > + /* Save these control reg bits */ > + dc_static = (ctrl_inw(PDCR) & (~0xcc0c)); > + ec_static = (ctrl_inw(PECR) & (~0xf0cf)); > + > + for (i=0; i<8; i++) { > + /* disable output for all but the one we want to scan */ > + ctrl_outw((dc_static | *y++), PDCR); > + ctrl_outw((ec_static | *y++), PECR); > + udelay(5); > + > + /* Get scanline row */ > + ctrl_outb(*t++, PDDR); > + ctrl_outb(*t++, PEDR); > + udelay(50); > + > + /* Read data */ > + *s++=ctrl_inb(PCDR); > + *s++=ctrl_inb(PFDR); > + } > + /* Scan no lines */ > + ctrl_outb(0xff, PDDR); > + ctrl_outb(0xff, PEDR); > + > + /* Enable all scanlines */ > + ctrl_outw((dc_static | (0x5555 & 0xcc0c)),PDCR); > + ctrl_outw((ec_static | (0x5555 & 0xf0cf)),PECR); > + /* Ignore extra keys and events */ > + *s++=ctrl_inb(PGDR); > + *s++=ctrl_inb(PHDR); > + > + return 0; > +} > + > +static struct scan_keyboard hp680_kbd = { > + .scan = hp680_japanese_scan_kbd, > + .table = hp680_japanese_table, > + .length = 16, > +}; > + > +static int __init hp680_kbd_init_hw(void) > +{ > + printk(KERN_INFO "HP680 matrix scan keyboard registered\n"); > + return register_scan_keyboard(&hp680_kbd); > +} > + > +static void __exit hp680_kbd_exit_hw(void) > +{ > + unregister_scan_keyboard(&hp680_kbd); > +} > + > +module_init(hp680_kbd_init_hw); > +module_exit(hp680_kbd_exit_hw); > +MODULE_LICENSE("GPL"); |