PXA: PXA27x Matrix keypad driver
Subsystems (2)
PATCH v2 1/4 PXA: PXA27x Matrix keypad driver
From: Marek Vasut <[email protected]>
---
v2: use struct-based access to regs, minor cleanup
arch/arm/include/asm/arch-pxa/pxa-regs.h | 52 ------ arch/arm/include/asm/arch-pxa/regs-keypad.h | 84 +++++++++ drivers/input/Makefile | 2 + drivers/input/pxa27x-mkp.c | 245 +++++++++++++++++++++++++++ 4 files changed, 331 insertions(+), 52 deletions(-) create mode 100644 arch/arm/include/asm/arch-pxa/regs-keypad.h create mode 100644 drivers/input/pxa27x-mkp.c
arch/arm/include/asm/arch-pxa/pxa-regs.h +0 -52
@@ -2567,58 +2567,6 @@ typedef void (*ExcpHndlr) (void) ;#define OVL2C1_O2EN (1<<31)/* Enable bit for Overlay 2 */ #define CCR_CEN (1<<31)/* Enable bit for Cursor */ -/* Keypad controller */ - -#define KPC 0x41500000/* Keypad Interface Control register */ -#define KPDK 0x41500008/* Keypad Interface Direct Key register */ -#define KPREC 0x41500010/* Keypad Intefcace Rotary Encoder register */ -#define KPMK 0x41500018/* Keypad Intefcace Matrix Key register */ -#define KPAS 0x41500020/* Keypad Interface Automatic Scan register */ -#define KPASMKP0 0x41500028/* Keypad Interface Automatic Scan Multiple Key Presser register 0 */ -#define KPASMKP1 0x41500030/* Keypad Interface Automatic Scan Multiple Key Presser register 1 */ -#define KPASMKP2 0x41500038/* Keypad Interface Automatic Scan Multiple Key Presser register 2 */ -#define KPASMKP3 0x41500040/* Keypad Interface Automatic Scan Multiple Key Presser register 3 */ -#define KPKDI 0x41500048/* Keypad Interface Key Debounce Interval register */ - -#define KPC_AS (0x1 << 30)/* Automatic Scan bit */ -#define KPC_ASACT (0x1 << 29)/* Automatic Scan on Activity */ -#define KPC_MI (0x1 << 22)/* Matrix interrupt bit */ -#define KPC_IMKP (0x1 << 21)/* Ignore Multiple Key Press */ -#define KPC_MS7 (0x1 << 20)/* Matrix scan line 7 */ -#define KPC_MS6 (0x1 << 19)/* Matrix scan line 6 */ -#define KPC_MS5 (0x1 << 18)/* Matrix scan line 5 */ -#define KPC_MS4 (0x1 << 17)/* Matrix scan line 4 */ -#define KPC_MS3 (0x1 << 16)/* Matrix scan line 3 */ -#define KPC_MS2 (0x1 << 15)/* Matrix scan line 2 */ -#define KPC_MS1 (0x1 << 14)/* Matrix scan line 1 */ -#define KPC_MS0 (0x1 << 13)/* Matrix scan line 0 */ -#define KPC_ME (0x1 << 12)/* Matrix Keypad Enable */ -#define KPC_MIE (0x1 << 11)/* Matrix Interrupt Enable */ -#define KPC_DK_DEB_SEL (0x1 << 9)/* Direct Key Debounce select */ -#define KPC_DI (0x1 << 5)/* Direct key interrupt bit */ -#define KPC_DEE0 (0x1 << 2)/* Rotary Encoder 0 Enable */ -#define KPC_DE (0x1 << 1)/* Direct Keypad Enable */ -#define KPC_DIE (0x1 << 0)/* Direct Keypad interrupt Enable */ - -#define KPDK_DKP (0x1 << 31) -#define KPDK_DK7 (0x1 << 7) -#define KPDK_DK6 (0x1 << 6) -#define KPDK_DK5 (0x1 << 5) -#define KPDK_DK4 (0x1 << 4) -#define KPDK_DK3 (0x1 << 3) -#define KPDK_DK2 (0x1 << 2) -#define KPDK_DK1 (0x1 << 1) -#define KPDK_DK0 (0x1 << 0) - -#define KPREC_OF1 (0x1 << 31) -#define kPREC_UF1 (0x1 << 30) -#define KPREC_OF0 (0x1 << 15) -#define KPREC_UF0 (0x1 << 14) - -#define KPMK_MKP (0x1 << 31) -#define KPAS_SO (0x1 << 31) -#define KPASMKPx_SO (0x1 << 31) -#define GPIO113_BIT (1 << 17)/* GPIO113 in GPSR, GPCR, bit 17 */ #define PSLR 0x40F00034#define PSTR 0x40F00038/* Power Manager Standby Configuration Reg */
arch/arm/include/asm/arch-pxa/regs-keypad.h new file +84 -0
84 lines not on this page · raw message
drivers/input/Makefile +2 -0
@@ -31,6 +31,8 @@ COBJS-y += keyboard.o pc_keyb.o COBJS-$(CONFIG_PS2MULT) += ps2mult.o ps2ser.o endif +COBJS-$(CONFIG_PXA27X_MKP) += pxa27x-mkp.o + COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(COBJS))
drivers/input/pxa27x-mkp.c new file +245 -0
245 lines not on this page · raw message
Signature · 1 line
1.7.8.3
PATCH v2 2/4 zipitz2: enable pxa27x_mkp driver
---
v2: remove usbtty stuff from EXTRA_ENV_SETTINGS
include/configs/zipitz2.h | 82 ++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 77 insertions(+), 5 deletions(-)
include/configs/zipitz2.h +77 -5
@@ -80,6 +80,12 @@#define CONFIG_CMD_MMC #define CONFIG_CMD_SPI +#define CONFIG_EXTRA_ENV_SETTINGS \ + "stdout=lcd\0" \ + "stdin=pxa27x-mkp\0" \ + "stderr=lcd\0" \ + "" +#define CONFIG_KEYBOARD /* * MMC Card Configuration */
@@ -206,15 +212,81 @@ unsigned char zipitz2_spi_read(void);#define CONFIG_SYS_FLASH_PROTECTION /* +* Matrix keypad +*/ +#ifdef CONFIG_KEYBOARD +#define CONFIG_PXA27X_MKP + +#define CONFIG_PXA27X_MKP_MKP_COLS 7 +#define CONFIG_PXA27X_MKP_MKP_ROWS 6 + +#define CONFIG_PXA27X_MKP_DEBOUNCE 30 +#define CONFIG_PXA27X_MKP_DELAY 30000 + +#define CONFIG_PXA27X_MKP_MOD_SHIFT {5, 3} +#define CONFIG_PXA27X_MKP_MOD_ALT {5, 2} +#define CONFIG_PXA27X_MKP_MOD_CTRL {5, 4} + +#define CONFIG_PXA27X_MKP_KEYMAP \ + { 1, 1, 'q', 'Q', '1', 0xff }, \ + { 2, 1, 'i', 'I', '8', 0xff }, \ + { 3, 1, 'g', 'G', '\"', 0xff }, \ + { 4, 1, 'x', 'X', '/', 0xff }, \ + { 5, 1, '\r', 0xff, 0xff, 0xff }, \ + { 6, 1, '-', 0xff, 0xff, 0xff }, \ + \ + { 1, 2, 'w', 'W', '2', 0xff }, \ + { 2, 2, 'o', 'O', '9', 0xff }, \ + { 3, 2, 'h', 'H', '\'', 0xff }, \ + { 4, 2, 'c', 'C', '+', 0xff }, \ + \ + { 1, 3, 'e', 'E', '3', 0xff }, \ + { 2, 3, 'p', 'P', '0', 0xff }, \ + { 3, 3, 'j', 'J', '[', 0xff }, \ + { 4, 3, 'v', 'V', '*', 0xff }, \ + \ + { 0, 4, '\e', 0xff, '|', 0xff }, \ + { 1, 4, 'r', 'R', '4', 0xff }, \ + { 2, 4, 'a', 'A', '$', 0xff }, \ + { 3, 4, 'k', 'K', ']', 0xff }, \ + { 4, 4, 'b', 'B', '=', 0xff }, \ + \ + { 0, 5, '\t', 0xff, 0xff, 0xff }, \ + { 1, 5, 't', 'T', '5', 0xff }, \ + { 2, 5, 's', 'S', '#', 0xff }, \ + { 3, 5, 'l', 'L', '-', 0xff }, \ + { 4, 5, 'n', 'N', '_', 0xff }, \ + { 5, 5, ' ', 0xff, 0xff, 0xff }, \ + \ + { 1, 6, 'y', 'Y', '6', 0xff }, \ + { 2, 6, 'd', 'D', '&', 0xff }, \ + { 3, 6, '\b', 0xff, '\\', 0xff }, \ + { 4, 6, 'm', 'M', '?', 0xff }, \ + { 5, 6, ',', '(', '<', '{' }, \ + \ + { 1, 7, 'u', 'U', '7', 0xff }, \ + { 2, 7, 'f', 'F', '@', 0xff }, \ + { 3, 7, 'z', 'Z', '!', 0xff }, \ + { 4, 7, ';', '~', ':', 0xff }, \ + { 5, 7, '.', ')', '>', '}' }, \ + \ + { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } + +#define CONFIG_SYS_CONSOLE_ENV_OVERWRITE +#define CONFIG_SYS_CONSOLE_IS_IN_ENV + +#endif + +/* * GPIO settings */ #define CONFIG_SYS_GAFR0_L_VAL 0x02000140 -#define CONFIG_SYS_GAFR0_U_VAL 0x59188000 -#define CONFIG_SYS_GAFR1_L_VAL 0x63900002 +#define CONFIG_SYS_GAFR0_U_VAL 0x59188005 +#define CONFIG_SYS_GAFR1_L_VAL 0x639420a2#define CONFIG_SYS_GAFR1_U_VAL 0xaaa03950#define CONFIG_SYS_GAFR2_L_VAL 0x0aaaaaaa#define CONFIG_SYS_GAFR2_U_VAL 0x29000308 -#define CONFIG_SYS_GAFR3_L_VAL 0x54000000 +#define CONFIG_SYS_GAFR3_L_VAL 0x56aa9500#define CONFIG_SYS_GAFR3_U_VAL 0x000000d5#define CONFIG_SYS_GPCR0_VAL 0x00000000#define CONFIG_SYS_GPCR1_VAL 0x00000020
@@ -222,7 +294,7 @@ unsigned char zipitz2_spi_read(void);#define CONFIG_SYS_GPCR3_VAL 0x00000000#define CONFIG_SYS_GPDR0_VAL 0xdafcee00#define CONFIG_SYS_GPDR1_VAL 0xffa3aaab -#define CONFIG_SYS_GPDR2_VAL 0x8fe9ffff +#define CONFIG_SYS_GPDR2_VAL 0x8fe1ffff#define CONFIG_SYS_GPDR3_VAL 0x001b1f8a#define CONFIG_SYS_GPSR0_VAL 0x06080400#define CONFIG_SYS_GPSR1_VAL 0x007f0000
@@ -234,7 +306,7 @@ unsigned char zipitz2_spi_read(void);/* * Clock settings */ -#define CONFIG_SYS_CKEN 0x00511220 +#define CONFIG_SYS_CKEN 0x00591220#define CONFIG_SYS_CCCR 0x00000190/*
Signature · 1 line
1.7.8.3
PATCH v2 2/4 zipitz2: enable pxa27x_mkp driver
Quoted 2 lines
Signed-off-by Vasily Khoruzhick <[email protected]>---
Quoted 11 lines
v2: remove usbtty stuff from
EXTRA_ENV_SETTINGSinclude/configs/zipitz2.h | 82++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 77 insertions(+), 5 deletions(-)
include/configs/zipitz2.h +0
-0
include/configs/zipitz2.h line 83
Quoted 4 lines
include/configs/zipitz2.h +1
-0@@ -80,6 +80,12 @@#define CONFIG_CMD_MMC #define CONFIG_CMD_SPI +#define CONFIG_EXTRA_ENV_SETTINGS
\
Quoted 111 lines
include/configs/zipitz2.h +76
-5+"stdout=lcd\0" \ +"stdin=pxa27x-mkp\0" \ +"stderr=lcd\0" \ +"" +#define CONFIG_KEYBOARD/* * MMC Card Configuration */ @@ -206,15 +212,81 @@ unsigned char zipitz2_spi_read(void);#define CONFIG_SYS_FLASH_PROTECTION /* +* Matrix keypad +*/ +#ifdef CONFIG_KEYBOARD +#define CONFIG_PXA27X_MKP + +#define CONFIG_PXA27X_MKP_MKP_COLS 7 +#define CONFIG_PXA27X_MKP_MKP_ROWS 6 + +#define CONFIG_PXA27X_MKP_DEBOUNCE 30 +#define CONFIG_PXA27X_MKP_DELAY 30000 + +#define CONFIG_PXA27X_MKP_MOD_SHIFT {5, 3} +#define CONFIG_PXA27X_MKP_MOD_ALT {5, 2} +#define CONFIG_PXA27X_MKP_MOD_CTRL {5, 4} + +#define CONFIG_PXA27X_MKP_KEYMAP \ + { 1, 1, 'q', 'Q', '1', 0xff }, \ + { 2, 1, 'i', 'I', '8', 0xff }, \ + { 3, 1, 'g', 'G', '\"', 0xff }, \ + { 4, 1, 'x', 'X', '/', 0xff }, \ + { 5, 1, '\r', 0xff, 0xff, 0xff }, \ + { 6, 1, '-', 0xff, 0xff, 0xff }, \ + \ + { 1, 2, 'w', 'W', '2', 0xff }, \ + { 2, 2, 'o', 'O', '9', 0xff }, \ + { 3, 2, 'h', 'H', '\'', 0xff }, \ + { 4, 2, 'c', 'C', '+', 0xff }, \ + \ + { 1, 3, 'e', 'E', '3', 0xff }, \ + { 2, 3, 'p', 'P', '0', 0xff }, \ + { 3, 3, 'j', 'J', '[', 0xff }, \ + { 4, 3, 'v', 'V', '*', 0xff }, \ + \ + { 0, 4, '\e', 0xff, '|', 0xff }, \ + { 1, 4, 'r', 'R', '4', 0xff }, \ + { 2, 4, 'a', 'A', '$', 0xff }, \ + { 3, 4, 'k', 'K', ']', 0xff }, \ + { 4, 4, 'b', 'B', '=', 0xff }, \ + \ + { 0, 5, '\t', 0xff, 0xff, 0xff }, \ + { 1, 5, 't', 'T', '5', 0xff }, \ + { 2, 5, 's', 'S', '#', 0xff }, \ + { 3, 5, 'l', 'L', '-', 0xff }, \ + { 4, 5, 'n', 'N', '_', 0xff }, \ + { 5, 5, ' ', 0xff, 0xff, 0xff }, \ + \ + { 1, 6, 'y', 'Y', '6', 0xff }, \ + { 2, 6, 'd', 'D', '&', 0xff }, \ + { 3, 6, '\b', 0xff, '\\', 0xff }, \ + { 4, 6, 'm', 'M', '?', 0xff }, \ + { 5, 6, ',', '(', '<', '{' }, \ + \ + { 1, 7, 'u', 'U', '7', 0xff }, \ + { 2, 7, 'f', 'F', '@', 0xff }, \ + { 3, 7, 'z', 'Z', '!', 0xff }, \ + { 4, 7, ';', '~', ':', 0xff }, \ + { 5, 7, '.', ')', '>', '}' }, \ + \ + { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } + +#define CONFIG_SYS_CONSOLE_ENV_OVERWRITE +#define CONFIG_SYS_CONSOLE_IS_IN_ENV + +#endif + +/* * GPIO settings */ #define CONFIG_SYS_GAFR0_L_VAL 0x02000140 -#define CONFIG_SYS_GAFR0_U_VAL 0x59188000 -#define CONFIG_SYS_GAFR1_L_VAL 0x63900002 +#define CONFIG_SYS_GAFR0_U_VAL 0x59188005 +#define CONFIG_SYS_GAFR1_L_VAL 0x639420a2#define CONFIG_SYS_GAFR1_U_VAL 0xaaa03950#define CONFIG_SYS_GAFR2_L_VAL 0x0aaaaaaa#define CONFIG_SYS_GAFR2_U_VAL 0x29000308 -#define CONFIG_SYS_GAFR3_L_VAL 0x54000000 +#define CONFIG_SYS_GAFR3_L_VAL 0x56aa9500#define CONFIG_SYS_GAFR3_U_VAL 0x000000d5#define CONFIG_SYS_GPCR0_VAL 0x00000000#define CONFIG_SYS_GPCR1_VAL 0x00000020@@ -222,7 +294,7 @@ unsigned char zipitz2_spi_read(void);#define CONFIG_SYS_GPCR3_VAL 0x00000000#define CONFIG_SYS_GPDR0_VAL 0xdafcee00#define CONFIG_SYS_GPDR1_VAL 0xffa3aaab -#define CONFIG_SYS_GPDR2_VAL 0x8fe9ffff +#define CONFIG_SYS_GPDR2_VAL 0x8fe1ffff#define CONFIG_SYS_GPDR3_VAL 0x001b1f8a#define CONFIG_SYS_GPSR0_VAL 0x06080400#define CONFIG_SYS_GPSR1_VAL 0x007f0000@@ -234,7 +306,7 @@ unsigned char zipitz2_spi_read(void);/* * Clock settings */ -#define CONFIG_SYS_CKEN 0x00511220 +#define CONFIG_SYS_CKEN 0x00591220#define CONFIG_SYS_CCCR 0x00000190/*
PATCH v2 3/4 zipitz2: use pxa_mmc_gen as MMC driver
In reply to Vasily Khoruzhick---
v2: mmcinfo is necessary to scan card for partitions
board/zipitz2/zipitz2.c | 8 ++++++++ include/configs/zipitz2.h | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-)
board/zipitz2/zipitz2.c +8 -0
@@ -79,6 +79,14 @@ void dram_init_banksize(void) gd->bd->bi_dram[0 ].size =PHYS_SDRAM_1_SIZE ; } +#ifdef CONFIG_CMD_MMC +int board_mmc_init (bd_t *bis) +{ +pxa_mmc_register (0 ); +return 0 ; +} +#endif + #ifdef CONFIG_CMD_SPI struct {
include/configs/zipitz2.h +3 -2
@@ -45,7 +45,7 @@#define CONFIG_ARCH_CPU_INIT #define CONFIG_BOOTCOMMAND \ - "if mmc init && fatload mmc 0 0xa0000000 uboot.script ; then " \ + "if mmcinfo && ext2load mmc 0 0xa0000000 boot/uboot.script ; then " \ "source 0xa0000000; " \ "else " \ "bootm 0x60000; " \
@@ -91,7 +91,8 @@*/ #ifdef CONFIG_CMD_MMC #define CONFIG_MMC -#define CONFIG_PXA_MMC +#define CONFIG_GENERIC_MMC +#define CONFIG_PXA_MMC_GENERIC #define CONFIG_SYS_MMC_BASE 0xF0000000#define CONFIG_CMD_FAT #define CONFIG_CMD_EXT2
Signature · 1 line
1.7.8.3
PATCH v2 3/4 zipitz2: use pxa_mmc_gen as MMC driver
Quoted 32 lines
Signed-off-by Vasily Khoruzhick <[email protected]>---
v2: mmcinfo is necessary to scan card for partitionsboard/zipitz2/zipitz2.c | 8 ++++++++ include/configs/zipitz2.h | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-)board/zipitz2/zipitz2.c +8
-0@@ -79,6 +79,14 @@ void dram_init_banksize(void) gd->bd->bi_dram[0 ].size =PHYS_SDRAM_1_SIZE ; } +#ifdef CONFIG_CMD_MMC +int board_mmc_init (bd_t *bis) +{ +pxa_mmc_register (0 ); +return 0 ; +} +#endif + #ifdef CONFIG_CMD_SPI struct {include/configs/zipitz2.h +0
-0
include/configs/zipitz2.h line 47
Quoted 3 lines
include/configs/zipitz2.h +0
-0@@ -45,7 +45,7 @@#define CONFIG_ARCH_CPU_INIT #define CONFIG_BOOTCOMMAND
\
include/configs/zipitz2.h line 48
Quoted 2 lines
include/configs/zipitz2.h +1
-1-"if mmc init && fatload mmc 0 0xa0000000 uboot.script ; then " \ +"if mmcinfo && ext2load mmc 0 0xa0000000 boot/uboot.script ; then "
mmcinfo? WHY?!
Quoted 14 lines
include/configs/zipitz2.h +0
-0\"source 0xa0000000; " \"else " \include/configs/zipitz2.h +2
-1"bootm 0x60000; " \@@ -91,7 +91,8 @@*/ #ifdef CONFIG_CMD_MMC #define CONFIG_MMC -#define CONFIG_PXA_MMC +#define CONFIG_GENERIC_MMC +#define CONFIG_PXA_MMC_GENERIC #define CONFIG_SYS_MMC_BASE 0xF0000000#define CONFIG_CMD_FAT #define CONFIG_CMD_EXT2
PATCH v2 4/4 zipitz2: fix boot issue introduced by PXA low level init rework
In reply to Vasily KhoruzhickCONFIG_SYS_INIT_SP_ADDR points to RAM, but it's used before DRAM controller init. Fix it by setting CONFIG_SYS_INIT_SP_ADDR to SRAM
---
v2: no changes
include/configs/zipitz2.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
include/configs/zipitz2.h +1 -1
@@ -184,7 +184,7 @@ unsigned char zipitz2_spi_read(void);#define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_DRAM_BASE#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1 -#define CONFIG_SYS_INIT_SP_ADDR (GENERATED_GBL_DATA_SIZE + PHYS_SDRAM_1 + 2048) +#define CONFIG_SYS_INIT_SP_ADDR 0x5c038000/* * NOR FLASH
Signature · 1 line
1.7.8.3
PATCH v2 4/4 zipitz2: fix boot issue introduced by PXA low level init rework
Quoted 16 lines
CONFIG_SYS_INIT_SP_ADDRpoints to RAM, but it's used before DRAM controller init. Fix it by settingCONFIG_SYS_INIT_SP_ADDRto SRAMSigned-off-by Vasily Khoruzhick <[email protected]>---
v2: no changesinclude/configs/zipitz2.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)include/configs/zipitz2.h +0
-0
include/configs/zipitz2.h unsigned char zipitz2_spi_read(void); · line 187
Quoted 4 lines
include/configs/zipitz2.h +0
-1@@ -184,7 +184,7 @@ unsigned char zipitz2_spi_read(void);#define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_DRAM_BASE#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1 -#define CONFIG_SYS_INIT_SP_ADDR (GENERATED_GBL_DATA_SIZE +
PHYS_SDRAM_1 +
Quoted 1 line
2048) +#define
CONFIG_SYS_INIT_SP_ADDR0x5c038000
Why do you keep setting the arbitrary location here? Just use GENERATED_GBL_DATA_SIZE + PHYS_SRAM + 2048) or something. ... define PHYS_SRAM if needed.
M
Quoted 3 lines
/*
* NOR FLASH
PATCH v2 1/4 PXA: PXA27x Matrix keypad driver
In reply to Vasily KhoruzhickQuoted 22 lines
From: Marek Vasut <[email protected]>
Signed-off-by Marek Vasut <[email protected]>Signed-off-by Vasily Khoruzhick <[email protected]>[vasily: adapted Marek's old version for newer u-boot]---
v2: use struct-based access to regs, minor cleanuparch/arm/include/asm/arch-pxa/pxa-regs.h | 52 ------ arch/arm/include/asm/arch-pxa/regs-keypad.h | 84 +++++++++ drivers/input/Makefile | 2 + drivers/input/pxa27x-mkp.c | 245 +++++++++++++++++++++++++++ 4 files changed, 331 insertions(+), 52 deletions(-) create mode 100644 arch/arm/include/asm/arch-pxa/regs-keypad.h create mode 100644 drivers/input/pxa27x-mkp.c(quoted diff) +0
-0
b/arch/arm/include/asm/arch-pxa/pxa-regs.hindex b81b42c..d562658 100644
arch/arm/include/asm/arch-pxa/pxa-regs.h typedef void (*ExcpHndlr) (void) ; · line 2574
Quoted 8 lines
arch/arm/include/asm/arch-pxa/pxa-regs.h +0
-5@@ -2567,58 +2567,6 @@ typedef void (*ExcpHndlr) (void) ;#define OVL2C1_O2EN (1<<31)/* Enable bit for Overlay 2 */ #define CCR_CEN (1<<31)/* Enable bit for Cursor */ -/* Keypad controller */ - -#define KPC 0x41500000/* Keypad Interface Control register */ -#define KPDK 0x41500008/* Keypad Interface Direct Key register */ -#define KPREC 0x41500010/* Keypad Intefcace Rotary Encoder
register */
arch/arm/include/asm/arch-pxa/pxa-regs.h typedef void (*ExcpHndlr) (void) ; · line 2576
Quoted 2 lines
arch/arm/include/asm/arch-pxa/pxa-regs.h +0
-2-#define KPMK 0x41500018/* Keypad Intefcace Matrix Key register */ -#define KPAS 0x41500020/* Keypad Interface Automatic Scan register
*/
Quoted 7 lines
arch/arm/include/asm/arch-pxa/pxa-regs.h +0
-1-#define KPASMKP0 0x41500028/* Keypad Interface Automatic Scan Multiple Key Presser register 0 */ -#define KPASMKP1
0x41500030/* Keypad Interface
Automatic Scan Multiple Key Presser register 1 */ -#define
KPASMKP20x41500038/* Keypad Interface Automatic Scan Multiple Key
Presser register 2 */ -#define KPASMKP30x41500040/* Keypad Interface
Automatic Scan Multiple Key Presser register 3 */ -#define
KPKDI0x41500048/* Keypad Interface Key Debounce Interval register */
-
Quoted 9 lines
arch/arm/include/asm/arch-pxa/pxa-regs.h +0
-9-#define KPC_AS (0x1 << 30)/* Automatic Scan bit */ -#define KPC_ASACT (0x1 << 29)/* Automatic Scan on Activity */ -#define KPC_MI (0x1 << 22)/* Matrix interrupt bit */ -#define KPC_IMKP (0x1 << 21)/* Ignore Multiple Key Press */ -#define KPC_MS7 (0x1 << 20)/* Matrix scan line 7 */ -#define KPC_MS6 (0x1 << 19)/* Matrix scan line 6 */ -#define KPC_MS5 (0x1 << 18)/* Matrix scan line 5 */ -#define KPC_MS4 (0x1 << 17)/* Matrix scan line 4 */ -#define KPC_MS3 (0x1 << 16)/* Matrix scan line 3 */
arch/arm/include/asm/arch-pxa/pxa-regs.h typedef void (*ExcpHndlr) (void) ;
Quoted 10 lines
arch/arm/include/asm/arch-pxa/pxa-regs.h +0
-10-#define KPC_MS2 (0x1 << 15)/* Matrix scan line 2 */ -#define KPC_MS1 (0x1 << 14)/* Matrix scan line 1 */ -#define KPC_MS0 (0x1 << 13)/* Matrix scan line 0 */ -#define KPC_ME (0x1 << 12)/* Matrix Keypad Enable */ -#define KPC_MIE (0x1 << 11)/* Matrix Interrupt Enable */ -#define KPC_DK_DEB_SEL (0x1 << 9)/* Direct Key Debounce select */ -#define KPC_DI (0x1 << 5)/* Direct key interrupt bit */ -#define KPC_DEE0 (0x1 << 2)/* Rotary Encoder 0 Enable */ -#define KPC_DE (0x1 << 1)/* Direct Keypad Enable */ -#define KPC_DIE (0x1 << 0)/* Direct Keypad interrupt Enable
*/
Quoted 13 lines
arch/arm/include/asm/arch-pxa/pxa-regs.h +0
-13- -#define KPDK_DKP (0x1 << 31) -#define KPDK_DK7 (0x1 << 7) -#define KPDK_DK6 (0x1 << 6) -#define KPDK_DK5 (0x1 << 5) -#define KPDK_DK4 (0x1 << 4) -#define KPDK_DK3 (0x1 << 3) -#define KPDK_DK2 (0x1 << 2) -#define KPDK_DK1 (0x1 << 1) -#define KPDK_DK0 (0x1 << 0) - -#define KPREC_OF1 (0x1 << 31) -#define kPREC_UF1 (0x1 << 30)
arch/arm/include/asm/arch-pxa/pxa-regs.h typedef void (*ExcpHndlr) (void) ;
Quoted 10 lines
arch/arm/include/asm/arch-pxa/pxa-regs.h +0
-7-#define KPREC_OF0 (0x1 << 15) -#define KPREC_UF0 (0x1 << 14) - -#define KPMK_MKP (0x1 << 31) -#define KPAS_SO (0x1 << 31) -#define KPASMKPx_SO (0x1 << 31) -#define GPIO113_BIT (1 << 17)/* GPIO113 in GPSR, GPCR, bit 17 */ #define PSLR 0x40F00034#define PSTR 0x40F00038/* Power Manager Standby Configuration Reg
*/
Quoted 59 lines
(quoted diff) +0
-0
b/arch/arm/include/asm/arch-pxa/regs-keypad.hnew file mode 100644 index 0000000..f13da56arch/arm/include/asm/arch-pxa/regs-keypad.h new file +53
-0@@ -0,0 +1,84 @@ +/* +* Copyright (C) 2012 Vasily Khoruzhick <[email protected]> +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, +* MA 02111-1307 USA +*/ + +#ifndef __REGS_KEYPAD_H__ +#define __REGS_KEYPAD_H__ + +#define KEYPAD_BASE 0x41500000 + +struct kpasmkp_regs { +uint32_t kpasmkpx; +uint32_t reserved; +}; + +struct pxa_keypad_regs { +uint32_t kpc; +uint32_t reserved_1; +uint32_t kpdk; +uint32_t reserved_2; +uint32_t kprec; +uint32_t reserved_3; +uint32_t kpmk; +uint32_t reserved_4; +uint32_t kpas; +uint32_t reserved_5; +struct kpasmkp_regs kpasmkp[4 ]; +uint32_t kpkdi; +}; + +#define KPC_AS (0x1 << 30)/* Automatic Scan bit */ +#define KPC_ASACT (0x1 << 29)/* Automatic Scan on Activity */ +#define KPC_MI (0x1 << 22)/* Matrix interrupt bit */ +#define KPC_IMKP (0x1 << 21)/* Ignore Multiple Key Press */ +#define KPC_MS7 (0x1 << 20)/* Matrix scan line 7 */ +#define KPC_MS6 (0x1 << 19)/* Matrix scan line 6 */ +#define KPC_MS5 (0x1 << 18)/* Matrix scan line 5 */ +#define KPC_MS4 (0x1 << 17)/* Matrix scan line 4 */ +#define KPC_MS3 (0x1 << 16)/* Matrix scan line 3 */
arch/arm/include/asm/arch-pxa/regs-keypad.h line 63
Quoted 10 lines
arch/arm/include/asm/arch-pxa/regs-keypad.h new file +10
-0+#define KPC_MS2 (0x1 << 15)/* Matrix scan line 2 */ +#define KPC_MS1 (0x1 << 14)/* Matrix scan line 1 */ +#define KPC_MS0 (0x1 << 13)/* Matrix scan line 0 */ +#define KPC_ME (0x1 << 12)/* Matrix Keypad Enable */ +#define KPC_MIE (0x1 << 11)/* Matrix Interrupt Enable */ +#define KPC_DK_DEB_SEL (0x1 << 9)/* Direct Key Debounce select */ +#define KPC_DI (0x1 << 5)/* Direct key interrupt bit */ +#define KPC_DEE0 (0x1 << 2)/* Rotary Encoder 0 Enable */ +#define KPC_DE (0x1 << 1)/* Direct Keypad Enable */ +#define KPC_DIE (0x1 << 0)/* Direct Keypad interrupt Enable
*/
Quoted 117 lines
arch/arm/include/asm/arch-pxa/regs-keypad.h new file +21
-0+ +#define KPDK_DKP (0x1 << 31) +#define KPDK_DK7 (0x1 << 7) +#define KPDK_DK6 (0x1 << 6) +#define KPDK_DK5 (0x1 << 5) +#define KPDK_DK4 (0x1 << 4) +#define KPDK_DK3 (0x1 << 3) +#define KPDK_DK2 (0x1 << 2) +#define KPDK_DK1 (0x1 << 1) +#define KPDK_DK0 (0x1 << 0) + +#define KPREC_OF1 (0x1 << 31) +#define kPREC_UF1 (0x1 << 30) +#define KPREC_OF0 (0x1 << 15) +#define KPREC_UF0 (0x1 << 14) + +#define KPMK_MKP (0x1 << 31) +#define KPAS_SO (0x1 << 31) +#define KPASMKPx_SO (0x1 << 31) + +#endif drivers/input/Makefile +2
-0@@ -31,6 +31,8 @@ COBJS-y += keyboard.o pc_keyb.o COBJS-$(CONFIG_PS2MULT) += ps2mult.o ps2ser.o endif +COBJS-$(CONFIG_PXA27X_MKP) += pxa27x-mkp.o + COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(COBJS))drivers/input/pxa27x-mkp.c new file +77
-0@@ -0,0 +1,245 @@ +/* +* PXA27x matrix keypad controller driver +* +* Copyright (C) 2010 Marek Vasut <[email protected]> +* +* See file CREDITS for list of people who contributed to this +* project. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, +* MA 02111-1307 USA +*/ + +#include <common.h> +#include <stdio_dev.h> +#include <asm/arch/regs-keypad.h> +#include <asm/io.h> + +#define DEVNAME "pxa27x-mkp" + +struct { +char row; +char col; +char key; +char shift; +char alt; +char ctrl; +} keymap[] = { +CONFIG_PXA27X_MKP_KEYMAP , +}; + +static unsigned char queue[64 ] = {0 }; +static int queue_len; +static struct pxa_keypad_regs *regs; + +/* autorepeat stuff */ +static unsigned char last_key =0xff ; +static char key_counter; + +/* number of key scans before autorepeat kicks in */ +#ifndef CONFIG_PXA27X_KEY_REPEAT_FIRST +#define CONFIG_PXA27X_KEY_REPEAT_FIRST 12 +#endif +#ifndef CONFIG_PXA27X_KEY_REPEAT_NEXT +#define CONFIG_PXA27X_KEY_REPEAT_NEXT 2 +#endif + +enum { +MOD_NONE , +MOD_SHIFT , +MOD_ALT , +MOD_CTRL , +}; + +static int kbd_get_mdf (int row,int col) +{ +char mod_shift[2 ] =CONFIG_PXA27X_MKP_MOD_SHIFT ; +char mod_alt[2 ] =CONFIG_PXA27X_MKP_MOD_ALT ; +char mod_ctrl[2 ] =CONFIG_PXA27X_MKP_MOD_CTRL ; + +if (mod_shift[0 ] == row && mod_shift[1 ] == col) +return MOD_SHIFT ; +if (mod_alt[0 ] == row && mod_alt[1 ] == col) +return MOD_ALT ; +if (mod_ctrl[0 ] == row && mod_ctrl[1 ] == col) +return MOD_CTRL ;
drivers/input/pxa27x-mkp.c line 87
Quoted 10 lines
drivers/input/pxa27x-mkp.c new file +10
-0+return MOD_NONE ; +} + +static void kbd_lookup (int row,int col,int mod) +{ +int i =0 ; +static char key =0xff ; + +while (!(keymap[i].col ==0xff && keymap[i].row ==0xff )) { +if (keymap[i].row == row && keymap[i].col == col) {
if (!) { i++; continue };
... rest ...
Quoted 72 lines
drivers/input/pxa27x-mkp.c new file +72
-0+switch (mod) { +case MOD_NONE : + key = keymap[i].key; +break ; +case MOD_SHIFT : + key = keymap[i].shift; +break ; +case MOD_ALT : + key = keymap[i].alt; +break ; +case MOD_CTRL : + key = keymap[i].ctrl; +break ; + } +if (key ==0xff ) +continue ; + +if (key != last_key) { + queue[queue_len++] = key; + last_key = key; + key_counter =0 ; + }else /* same key as before */ +if (key_counter < +CONFIG_PXA27X_KEY_REPEAT_FIRST ) { +/* ignore key press */ + key_counter++; + }else { +/* ok, autorepeat */ + queue[queue_len++] = key; + key_counter = +CONFIG_PXA27X_KEY_REPEAT_FIRST + -CONFIG_PXA27X_KEY_REPEAT_NEXT ; + } + } + i++; + } +} + +static void scan_keys (int modif) +{ +uint32_t reg; +int col, row; +int mod =MOD_NONE ; +for (col =0 ; col <8 ; col +=2 ) { +while ((reg =readl (®s->kpasmkp[col >>1 ].kpasmkpx)) + & KPASMKPx_SO) + ; +for (row =0 ; row <8 ; row++) { +if (reg & (1 << row)) { +if (modif) { + mod =kbd_get_mdf (row, col); +if (mod !=MOD_NONE ) +return ; + }else +kbd_lookup (row, col, mod); + } +if ((reg >>16 ) & (1 << row)) { +if (modif) { + mod =kbd_get_mdf (row, col +1 ); +if (mod !=MOD_NONE ) +return ; + }else +kbd_lookup (row, col +1 , mod); + } + } + } +} + +static void kbd_read (void ) +{ +uint32_t reg; +int col, row;
drivers/input/pxa27x-mkp.c line 169
Quoted 10 lines
drivers/input/pxa27x-mkp.c new file +10
-0+int modif =0 ; +int numkeys; +int mod =MOD_NONE ; + +/* start one automatic scan */ +writel (readl (®s->kpc) |KPC_AS , ®s->kpc); + +/* wait for scan to finish */ +while (readl (®s->kpc) &KPC_AS ) + ;
Add timeout here.
Quoted 76 lines
drivers/input/pxa27x-mkp.c new file +76
-0+ + numkeys = (readl (®s->kpas) >>26 ) &0x1f ; +switch (numkeys) { +case 0 : +/* no key pressed, clear autorepeat counter */ + last_key =0xff ; + key_counter =0 ; +break ; +case 1 : + reg =readl (®s->kpas) &0xff ; + col = reg &0x0f ; + row = reg >>4 ; +if (kbd_get_mdf (row, col) !=MOD_NONE ) { +/* modifier only */ + last_key =0xff ; +/* no real key, clear autorepeat counter */ + key_counter =0 ; + }else +kbd_lookup (row, col, mod); +break ; +default : +/* multiple keys pressed, check KPASMKPx registers */ +/* First scan for modifiers */ +scan_keys (1 ); +/* Second for other keys */ +scan_keys (0 ); +break ; + } +} + +static int kbd_getc (void ) +{ +if (!queue_len) { +kbd_read (); +udelay (CONFIG_PXA27X_MKP_DELAY ); + } + +if (queue_len) +return queue[--queue_len]; +else +return 0 ; +} + +static int kbd_testc (void ) +{ +if (!queue_len) +kbd_read (); +return queue_len; +} + +int drv_keyboard_init (void ) +{ +int error =0 ; +struct stdio_dev kbddev; +if (!keymap) +return -1 ; + + regs = (struct pxa_keypad_regs *)KEYPAD_BASE ; + queue_len =0 ; + +writel ((CONFIG_PXA27X_MKP_MKP_ROWS <<26 ) | + (CONFIG_PXA27X_MKP_MKP_COLS <<23 ) | + (0xff <<13 ) |KPC_ME , ®s->kpc); +writel (CONFIG_PXA27X_MKP_DEBOUNCE , ®s->kpkdi); + +memset (&kbddev,0 ,sizeof (kbddev)); +strcpy (kbddev.name,DEVNAME ); + kbddev.flags =DEV_FLAGS_INPUT |DEV_FLAGS_SYSTEM ; + kbddev.putc =NULL ; + kbddev.puts =NULL ; + kbddev.getc = kbd_getc ; + kbddev.tstc = kbd_testc ; + + error =stdio_register (&kbddev); +return error; +}