From: Kristoffer E. <kri...@gm...> - 2007-07-16 21:43:13
|
Greetings, 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. Best wishes Kristoffer 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"); |