Rewrite pfckbd_callout_hitachi() to do the same scan line dance that

pfckbd_callout_hp() does.  Change the order of scan and the layout of
the matrix to be more natural.

Chords like <Shift>+<L> now work.

From KIYOHARA Takashi.
This commit is contained in:
uwe 2005-01-18 03:59:11 +00:00
parent 26187fa579
commit a1e2e32edf
2 changed files with 105 additions and 47 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pfckbd.c,v 1.12 2003/12/14 04:03:16 uwe Exp $ */
/* $NetBSD: pfckbd.c,v 1.13 2005/01/18 03:59:11 uwe Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pfckbd.c,v 1.12 2003/12/14 04:03:16 uwe Exp $");
__KERNEL_RCSID(0, "$NetBSD: pfckbd.c,v 1.13 2005/01/18 03:59:11 uwe Exp $");
#include "debug_hpcsh.h"
@ -319,45 +319,103 @@ pfckbd_callout_hp(void *arg)
void
pfckbd_callout_hitachi(void *arg)
{
#define PFCKBD_HITACHI_PCCR_MASK 0xfffc
#define PFCKBD_HITACHI_PDCR_MASK 0x000c
#define PFCKBD_HITACHI_PECR_MASK 0x30cf
#define PFCKBD_HITACHI_PCDR_SCN_MASK 0xfe
#define PFCKBD_HITACHI_PDDR_SCN_MASK 0xf7
#define PFCKBD_HITACHI_PEDR_SCN_MASK 0xff
#define PFCKBD_HITACHI_PCDR_SNS_MASK 0x01
#define PFCKBD_HITACHI_PFDR_SNS_MASK 0xfe
/*
* Disable output on all lines but the n'th line in C.
* Pull the n'th scan line in C low.
*/
#define PC(n) \
{ (u_int16_t)(PFCKBD_HITACHI_PCCR_MASK & (~(1 << (2*(n)+1)))), \
(u_int16_t)(PFCKBD_HITACHI_PDCR_MASK & 0xffff), \
(u_int16_t)(PFCKBD_HITACHI_PECR_MASK & 0xffff), \
(u_int8_t)(PFCKBD_HITACHI_PCDR_SCN_MASK & ~(1 << (n))), \
PFCKBD_HITACHI_PDDR_SCN_MASK, \
PFCKBD_HITACHI_PEDR_SCN_MASK }
/* Ditto for D */
#define PD(n) \
{ (u_int16_t)(PFCKBD_HITACHI_PCCR_MASK & 0xffff), \
(u_int16_t)(PFCKBD_HITACHI_PDCR_MASK & (~(1 << (2*(n)+1)))), \
(u_int16_t)(PFCKBD_HITACHI_PECR_MASK & 0xffff), \
PFCKBD_HITACHI_PCDR_SCN_MASK, \
(u_int8_t)(PFCKBD_HITACHI_PDDR_SCN_MASK & ~(1 << (n))), \
PFCKBD_HITACHI_PEDR_SCN_MASK }
/* Ditto for E */
#define PE(n) \
{ (u_int16_t)(PFCKBD_HITACHI_PCCR_MASK & 0xffff), \
(u_int16_t)(PFCKBD_HITACHI_PDCR_MASK & 0xffff), \
(u_int16_t)(PFCKBD_HITACHI_PECR_MASK & (~(1 << (2*(n)+1)))), \
PFCKBD_HITACHI_PCDR_SCN_MASK, \
PFCKBD_HITACHI_PDDR_SCN_MASK, \
(u_int8_t)(PFCKBD_HITACHI_PEDR_SCN_MASK & ~(1 << (n))) }
static const struct {
u_int8_t d, e;
u_int16_t cc, dc, ec; u_int8_t c, d, e;
} scan[] = {
{ 0xf5, 0xff },
{ 0xd7, 0xff },
{ 0xf7, 0xfd },
{ 0xf7, 0xbf },
{ 0xf7, 0x7f },
{ 0xf7, 0xf7 },
{ 0xf7, 0xfe },
{ 0x77, 0xff },
PE(6), PE(3), PE(1), PE(0), PC(7), PC(6), PC(5), PC(4),
PC(3), PC(2), PD(1), PC(1)
};
#undef PC
#undef PD
#undef PE
struct pfckbd_core *pc = arg;
u_int16_t data;
int column;
u_int16_t cc, dc, ec;
uint8_t data[2];
int i;
if (!pc->pc_enabled)
goto reinstall;
for (column = 0; column < 8; column++) {
_reg_write_1(SH7709_PCDR, ~(1 << column));
delay(50);
data = ((_reg_read_1(SH7709_PFDR) & 0xfe) |
(_reg_read_1(SH7709_PCDR) & 0x01)) << 8;
_reg_write_1(SH7709_PCDR, 0xff);
_reg_write_1(SH7709_PDDR, scan[column].d);
_reg_write_1(SH7709_PEDR, scan[column].e);
delay(50);
data |= (_reg_read_1(SH7709_PFDR) & 0xfe) |
(_reg_read_1(SH7709_PCDR) & 0x01);
_reg_write_1(SH7709_PDDR, 0xf7);
_reg_write_1(SH7709_PEDR, 0xff);
/* bits in C/D/E control regs we do not touch (XXX: can they change?) */
cc = _reg_read_2(SH7709_PCCR) & ~PFCKBD_HITACHI_PCCR_MASK;
dc = _reg_read_2(SH7709_PDCR) & ~PFCKBD_HITACHI_PDCR_MASK;
ec = _reg_read_2(SH7709_PECR) & ~PFCKBD_HITACHI_PECR_MASK;
pfckbd_input(pc->pc_hpckbd, pc->pc_column, data, column);
for (i = 0; i < 12; i++) {
/* disable output to all lines except the one we scan */
_reg_write_2(SH7709_PDCR, cc | scan[i].cc);
_reg_write_2(SH7709_PDCR, dc | scan[i].dc);
_reg_write_2(SH7709_PECR, ec | scan[i].ec);
delay(5);
/* pull the scan line low */
_reg_write_1(SH7709_PCDR, scan[i].c);
_reg_write_1(SH7709_PDDR, scan[i].d);
_reg_write_1(SH7709_PEDR, scan[i].e);
delay(50);
/* read sense */
data[i & 0x1] =
((_reg_read_1(SH7709_PCDR) & PFCKBD_HITACHI_PCDR_SNS_MASK) |
(_reg_read_1(SH7709_PFDR) & PFCKBD_HITACHI_PFDR_SNS_MASK));
if (i & 0x1)
pfckbd_input(pc->pc_hpckbd, pc->pc_column,
(data[0] | (data[1] << 8)), (i >> 1));
}
_reg_write_1(SH7709_PDDR, 0xf7);
_reg_write_1(SH7709_PEDR, 0xff);
data = _reg_read_1(SH7709_PGDR) | (_reg_read_1(SH7709_PHDR) << 8);
/* scan no lines */
_reg_write_1(SH7709_PCDR, PFCKBD_HITACHI_PCDR_SCN_MASK);
_reg_write_1(SH7709_PDDR, PFCKBD_HITACHI_PDDR_SCN_MASK);
_reg_write_1(SH7709_PEDR, PFCKBD_HITACHI_PEDR_SCN_MASK);
/* enable all scan lines */
_reg_write_2(SH7709_PCCR, cc | (0x5555 & PFCKBD_HITACHI_PCCR_MASK));
_reg_write_2(SH7709_PDCR, dc | (0x5555 & PFCKBD_HITACHI_PDCR_MASK));
_reg_write_2(SH7709_PECR, ec | (0x5555 & PFCKBD_HITACHI_PECR_MASK));
reinstall:
callout_schedule(&pc->pc_soft_ch, 1);

View File

@ -1,4 +1,4 @@
/* $NetBSD: hpckbdkeymap.h,v 1.30 2005/01/11 01:54:20 uwe Exp $ */
/* $NetBSD: hpckbdkeymap.h,v 1.31 2005/01/18 03:59:11 uwe Exp $ */
/*-
* Copyright (c) 1999-2002 The NetBSD Foundation, Inc.
@ -801,22 +801,22 @@ const int hp620lx_special_keymap[] = {
/* Japanese */
const u_int8_t persona_hpw50pad_jp_keytrans[] = {
/* 0 1 2 3 4 5 6 7 */
/* 0 */ SPL, UNK, 61 , 59 , UNK, 60 , 62 , UNK,
/* 1 */ UNK, UNK, UNK, 29 , UNK, UNK, 123, UNK,
/* 2 */ UNK, UNK, UNK, 1 , UNK, 56 , 46 , UNK,
/* 3 */ UNK, UNK, 221, 41 , UNK, 15 , 33 , UNK,
/* 4 */ 42 , UNK, 58 , 45 , UNK, 44 , 20 , UNK,
/* 5 */ 54 , UNK, 16 , 30 , UNK, 2 , 6 , UNK,
/* 6 */ 205, UNK, 4 , 17 , UNK, 3 , 5 , UNK,
/* 7 */ 14 , UNK, 18 , 31 , UNK, 32 , 19 , UNK,
/* 8 */ UNK, UNK, 68 , 67 , 66 , 65 , 64 , 63 ,
/* 9 */ UNK, UNK, 203, 121, 53 , 48 , 49 , 47 ,
/*10 */ UNK, UNK, 208, 112, 57 , 51 , 50 , 34 ,
/*11 */ UNK, UNK, 43 , 52 , 39 , 37 , 36 , 35 ,
/*12 */ UNK, UNK, 27 , 40 , 26 , 38 , 23 , 22 ,
/*13 */ UNK, UNK, 200, 28 , 115, 24 , 9 , 21 ,
/*14 */ UNK, UNK, 125, 12 , UNK, 10 , UNK, UNK,
/*15 */ UNK, UNK, 14 , 13 , 11 , 25 , 8 , 7 ,
/* 0 */ 59 , 61 , 63 , 65 , 67 , SPL, UNK, UNK, /* ON button */
/* 1 */ 29 , UNK, 47 , 48 , 121, UNK, UNK, UNK,
/* 2 */ 1 , UNK, 34 , 51 , 112, UNK, UNK, UNK,
/* 3 */ 41 , 221, 35 , 37 , 52 , UNK, UNK, UNK,
/* 4 */ 45 , 58 , 22 , 38 , 40 , 42 , UNK, UNK,
/* 5 */ 30 , 16 , 21 , 24 , 28 , 54 , UNK, UNK,
/* 6 */ 17 , 4 , UNK, 10 , 12 , 205, UNK, UNK,
/* 7 */ 31 , 18 , 7 , 25 , 13 , 83 , UNK, UNK,
/* 8 */ 60 , 62 , 64 , 66 , 68 , IGN, UNK, UNK, /* REC button */
/* 9 */ UNK, 123, 49 , 53 , 203, UNK, UNK, UNK,
/*10 */ 56 , 46 , 50 , 57 , 208, UNK, UNK, UNK,
/*11 */ 15 , 33 , 36 , 39 , 43 , UNK, UNK, UNK,
/*12 */ 44 , 20 , 23 , 26 , 27 , UNK, UNK, UNK,
/*13 */ 2 , 6 , 9 , 115, 200, UNK, UNK, UNK,
/*14 */ 3 , 5 , UNK, UNK, 125, UNK, UNK, UNK,
/*15 */ 32 , 19 , 8 , 11 , 14 , UNK, UNK, UNK,
};
const int persona_hpw50pad_special_keymap[] = {