* qi_lb60_keypad driver question? @ 2009-08-11 16:32 Xiangfu Liu 2009-08-12 2:15 ` Dmitry Torokhov 0 siblings, 1 reply; 12+ messages in thread From: Xiangfu Liu @ 2009-08-11 16:32 UTC (permalink / raw) To: Hard- and Software Development, Kernel, Distribution, Roadmap Cc: linux-kernel [-- Attachment #1: Type: text/plain, Size: 255 bytes --] Hi there I have try to write the keypad driver, but I don't know if this is the right direction. attach is the patch for the openwrt[1] .25 kernel. any advice will appreciate. thanks. [1] http://github.com/lindnermarek/openwrt-x-burst/commits/x-burst [-- Attachment #2: qi_lb60_keypad.patch --] [-- Type: text/x-patch, Size: 16333 bytes --] diff --git a/arch/mips/jz4740/board-qi_lb60.c b/arch/mips/jz4740/board-qi_lb60.c index 127fad8..33c00ac 100644 --- a/arch/mips/jz4740/board-qi_lb60.c +++ b/arch/mips/jz4740/board-qi_lb60.c @@ -56,7 +56,7 @@ static void __init board_cpm_setup(void) */ } -static void __init board_gpio_setup(void) +static int __init board_gpio_setup(void) { /* * Most of the GPIO pins should have been initialized by the boot-loader @@ -65,22 +65,22 @@ static void __init board_gpio_setup(void) /* * Initialize MSC pins */ - /* __gpio_as_msc(); */ + __gpio_as_msc(); /* * Initialize LCD pins */ - /* __gpio_as_lcd_18bit(); */ + __gpio_as_lcd_18bit(); /* * Initialize SSI pins */ - /* __gpio_as_ssi(); */ + __gpio_as_ssi(); /* * Initialize I2C pins */ - /* __gpio_as_i2c(); */ + __gpio_as_i2c(); /* * Initialize Other pins @@ -97,6 +97,20 @@ static void __init board_gpio_setup(void) __gpio_as_input(GPIO_DC_DETE_N); __gpio_as_input(GPIO_CHARG_STAT_N); + + unsigned int i; + for (i = 0; i < 8; i++) { + __gpio_as_output(GPIO_KEYOUT_BASE + i); + __gpio_set_pin(GPIO_KEYOUT_BASE + i); + } + + for (i = 0; i < 7; i++){ + __gpio_as_input(GPIO_KEYIN_BASE + i); + __gpio_enable_pull(GPIO_KEYIN_BASE + i); + } + + __gpio_as_input(GPIO_KEYIN_8); + __gpio_enable_pull(GPIO_KEYIN_8); } void __init jz_board_setup(void) @@ -108,3 +122,4 @@ void __init jz_board_setup(void) jz_timer_callback = pi_timer_callback; } + diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index 72bb407..4544df2 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -199,6 +199,15 @@ config KEYBOARD_ATARI To compile this driver as a module, choose M here: the module will be called atakbd. +config KEYBOARD_MATRIX + tristate "GPIO driven matrix keypad support" + depends on JZSOC + help + Enable support for GPIO driven matrix keypad. + + To compile this driver as a module, choose M here: the + module will be called matrix_keypad. + config KEYBOARD_HIL_OLD tristate "HP HIL keyboard support (simple driver)" depends on GSC || HP300 diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile index 9b4b67b..1fb7635 100644 --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile @@ -22,6 +22,7 @@ obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keypad.o obj-$(CONFIG_KEYBOARD_JZ) += jz_keypad.o obj-$(CONFIG_5x5_KEYBOARD_JZ) += jz_keypad_5x5.o +obj-$(CONFIG_KEYBOARD_MATRIX) += matrix_keypad.o qi_lb60_keypad.o obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o obj-$(CONFIG_KEYBOARD_HP6XX) += jornada680_kbd.o diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c new file mode 100644 index 0000000..a51273e --- /dev/null +++ b/drivers/input/keyboard/matrix_keypad.c @@ -0,0 +1,347 @@ +/* + * drivers/input/keyboard/matrix_keypad.c + * + * GPIO driven matrix keyboard driver + * + * Copyright (c) 2008 Marek Vasut <marek.vasut@xxxxxxxxx> + * + * Based on corgikbd.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include <linux/delay.h> +#include <linux/platform_device.h> +#include <linux/init.h> +#include <linux/input.h> +#include <linux/irq.h> +#include <linux/interrupt.h> +#include <linux/jiffies.h> +#include <linux/module.h> +#include <linux/gpio.h> +#include <linux/input/matrix_keypad.h> + +struct matrix_keypad { + struct matrix_keypad_platform_data *pdata; + struct input_dev *input_dev; + + uint32_t last_key_state[MATRIX_MAX_COLS]; + uint32_t *keycodes; + struct delayed_work work; +}; + +static void build_keycodes(struct matrix_keypad *keypad) +{ + struct matrix_keypad_platform_data *pdata = keypad->pdata; + struct input_dev *input_dev = keypad->input_dev; + uint32_t *key; + int i; + + keypad->keycodes = kzalloc(MATRIX_MAX_KEYS * sizeof(int), GFP_KERNEL); + + key = &pdata->key_map[0]; + for (i = 0; i < pdata->key_map_size; i++, key++) { + keypad->keycodes[KEY_ROWCOL(*key)] = KEY_VAL(*key); + set_bit(KEY_VAL(*key), input_dev->keybit); + } +} + +static unsigned int lookup_keycode(struct matrix_keypad *keypad, + int row, int col) +{ + return keypad->keycodes[(row << 4) + col]; +} + +static void activate_all_cols(struct matrix_keypad_platform_data *pdata, + int on) +{ + int i; + + for (i = 0; i < pdata->num_col_gpios; i++) + gpio_set_value(pdata->col_gpios[i], + (on) ? !pdata->active_low : pdata->active_low); +} + +static void activate_col(struct matrix_keypad_platform_data *pdata, + int col, int on) +{ + gpio_set_value(pdata->col_gpios[col], + (on) ? !pdata->active_low : pdata->active_low); + + if (on && pdata->col_scan_delay_us) + udelay(pdata->col_scan_delay_us); +} + +static int row_asserted(struct matrix_keypad_platform_data *pdata, int row) +{ + return gpio_get_value(pdata->row_gpios[row]) ? + !pdata->active_low : pdata->active_low; +} + +static void enable_row_irqs(struct matrix_keypad *keypad) +{ + struct matrix_keypad_platform_data *pdata = keypad->pdata; + int i; + + for (i = 0; i < pdata->num_row_gpios; i++) + enable_irq(gpio_to_irq(pdata->row_gpios[i])); +} + +static void disable_row_irqs(struct matrix_keypad *keypad) +{ + struct matrix_keypad_platform_data *pdata = keypad->pdata; + int i; + + for (i = 0; i < pdata->num_row_gpios; i++) + disable_irq_nosync(gpio_to_irq(pdata->row_gpios[i])); +} + +/* + * This gets the keys from keyboard and reports it to input subsystem + */ +static void matrix_keypad_scan(struct work_struct *work) +{ + struct matrix_keypad *keypad = + container_of(work, struct matrix_keypad, work.work); + struct matrix_keypad_platform_data *pdata = keypad->pdata; + uint32_t new_state[MATRIX_MAX_COLS]; + int row, col; + + /* de-activate all columns for scanning */ + activate_all_cols(pdata, 0); + + memset(new_state, 0, sizeof(new_state)); + + /* assert each column and read the row status out */ + for (col = 0; col < pdata->num_col_gpios; col++) { + + activate_col(pdata, col, 1); + + for (row = 0; row < pdata->num_row_gpios; row++) + new_state[col] |= row_asserted(pdata, row) ? + (1 << row) : 0; + activate_col(pdata, col, 0); + } + + for (col = 0; col < pdata->num_col_gpios; col++) { + uint32_t bits_changed; + + bits_changed = keypad->last_key_state[col] ^ new_state[col]; + if (bits_changed == 0) + continue; + + for (row = 0; row < pdata->num_row_gpios; row++) { + if ((bits_changed & (1 << row)) == 0) + continue; + + input_report_key(keypad->input_dev, + lookup_keycode(keypad, row, col), + new_state[col] & (1 << row)); + } + } + input_sync(keypad->input_dev); + memcpy(keypad->last_key_state, new_state, sizeof(new_state)); + + activate_all_cols(pdata, 1); + enable_row_irqs(keypad); +} + +static irqreturn_t matrix_keypad_interrupt(int irq, void *id) +{ + struct matrix_keypad *keypad = id; + + disable_row_irqs(keypad); + schedule_delayed_work(&keypad->work, + msecs_to_jiffies(keypad->pdata->debounce_ms)); + return IRQ_HANDLED; +} + +#ifdef CONFIG_PM +static int matrix_keypad_suspend(struct platform_device *pdev, +pm_message_t state) +{ + struct matrix_keypad *keypad = platform_get_drvdata(pdev); + struct matrix_keypad_platform_data *pdata = keypad->pdata; + int i; + + if (device_may_wakeup(&pdev->dev)) + for (i = 0; i < pdata->num_row_gpios; i++) + enable_irq_wake(gpio_to_irq(pdata->row_gpios[i])); + + return 0; +} + +static int matrix_keypad_resume(struct platform_device *pdev) +{ + struct matrix_keypad *keypad = platform_get_drvdata(pdev); + struct matrix_keypad_platform_data *pdata = keypad->pdata; + int i; + + if (device_may_wakeup(&pdev->dev)) + for (i = 0; i < pdata->num_row_gpios; i++) + disable_irq_wake(gpio_to_irq(pdata->row_gpios[i])); + + return 0; +} +#else +#define matrix_keypad_suspend NULL +#define matrix_keypad_resume NULL +#endif + +static int __devinit init_matrix_gpio(struct matrix_keypad *keypad) +{ + struct matrix_keypad_platform_data *pdata = keypad->pdata; + int i, err = -EINVAL; + + /* initialized strobe lines as outputs, activated */ + for (i = 0; i < pdata->num_col_gpios; i++) { + err = gpio_request(pdata->col_gpios[i], "matrix_kbd_col"); + if (err) { + pr_err("failed to request GPIO%d for COL%d\n", + pdata->col_gpios[i], i); + goto err_free_cols; + } + + gpio_direction_output(pdata->col_gpios[i], !pdata->active_low); + } + + for (i = 0; i < pdata->num_row_gpios; i++) { + err = gpio_request(pdata->row_gpios[i], "matrix_kbd_row"); + if (err) { + pr_err("failed to request GPIO%d for ROW%d\n", + pdata->row_gpios[i], i); + goto err_free_rows; + } + + gpio_direction_input(pdata->row_gpios[i]); + } + + for (i = 0; i < pdata->num_row_gpios; i++) { + err = request_irq(gpio_to_irq(pdata->row_gpios[i]), + matrix_keypad_interrupt, IRQF_DISABLED | + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + "matrix-keypad", keypad); + if (err) { + pr_err("Unable to acquire interrupt for GPIO line %i\n", + pdata->row_gpios[i]); + goto err_free_irqs; + } + } + return 0; + +err_free_irqs: + for (i = i - 1; i >= 0; i--) + free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); + +err_free_rows: + for (i = i - 1; i >= 0; i--) + gpio_free(pdata->row_gpios[i]); + +err_free_cols: + for (i = i - 1; i >= 0; i--) + gpio_free(pdata->col_gpios[i]); + + return err; +} + +static int __devinit matrix_keypad_probe(struct platform_device *pdev) +{ + struct matrix_keypad_platform_data *pdata; + struct matrix_keypad *keypad; + struct input_dev *input_dev; + int err = -ENOMEM; + + if ((pdata = pdev->dev.platform_data) == NULL) { + dev_err(&pdev->dev, "no platform data defined\n"); + return -EINVAL; + } + + keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); + if (keypad == NULL) + return -ENOMEM; + + input_dev = input_allocate_device(); + if (!input_dev) + goto err_free_keypad; + + platform_set_drvdata(pdev, keypad); + + keypad->input_dev = input_dev; + keypad->pdata = pdata; + INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan); + + input_dev->name = pdev->name; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = &pdev->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + + build_keycodes(keypad); + + err = input_register_device(keypad->input_dev); + if (err) + goto err_free_input; + + err = init_matrix_gpio(keypad); + if (err) + goto err_unregister; + + return 0; + +err_unregister: + input_unregister_device(input_dev); +err_free_input: + input_free_device(input_dev); +err_free_keypad: + kfree(keypad); + return err; +} + +static int matrix_keypad_remove(struct platform_device *pdev) +{ + struct matrix_keypad *keypad = platform_get_drvdata(pdev); + int i; + + for (i = 0; i < keypad->pdata->num_row_gpios; i++) { + free_irq(gpio_to_irq(keypad->pdata->row_gpios[i]), keypad); + gpio_free(keypad->pdata->row_gpios[i]); + } + + for (i = 0; i < keypad->pdata->num_col_gpios; i++) + gpio_free(keypad->pdata->col_gpios[i]); + + input_unregister_device(keypad->input_dev); + kfree(keypad); + return 0; +} + +static struct platform_driver matrix_keypad_driver = { + .probe = matrix_keypad_probe, + .remove = matrix_keypad_remove, + .suspend = matrix_keypad_suspend, + .resume = matrix_keypad_resume, + .driver = { + .name = "matrix-keypad", + .owner = THIS_MODULE, + }, +}; + +static int __devinit matrix_keypad_init(void) +{ + return platform_driver_register(&matrix_keypad_driver); +} + +static void __exit matrix_keypad_exit(void) +{ + platform_driver_unregister(&matrix_keypad_driver); +} + +module_init(matrix_keypad_init); +module_exit(matrix_keypad_exit); + +MODULE_AUTHOR("Marek Vasut <marek.vasut@xxxxxxxxx>"); +MODULE_DESCRIPTION("GPIO Driven Matrix Keypad Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:matrix-keypad"); diff --git a/drivers/input/keyboard/qi_lb60_keypad.c b/drivers/input/keyboard/qi_lb60_keypad.c new file mode 100644 index 0000000..0b2e548 --- /dev/null +++ b/drivers/input/keyboard/qi_lb60_keypad.c @@ -0,0 +1,128 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include <linux/module.h> +#include <linux/version.h> + +#include <linux/init.h> +#include <linux/fs.h> +#include <linux/interrupt.h> +#include <linux/irq.h> +#include <linux/sched.h> +#include <linux/pm.h> +#include <linux/sysctl.h> +#include <linux/proc_fs.h> +#include <linux/delay.h> +#include <linux/platform_device.h> +#include <linux/input.h> +#include <linux/input/matrix_keypad.h> + +#include <asm/gpio.h> + +#include <asm/jzsoc.h> + +static const uint32_t qi_lb60_keymap[] = { + KEY(0, 0, KEY_ENTER), + KEY(0, 1, KEY_ENTER), + KEY(0, 2, KEY_3), + KEY(0, 3, KEY_5), + KEY(0, 4, KEY_6), + KEY(0, 5, KEY_7), + KEY(0, 6, KEY_9), + KEY(0, 7, KEY_0), + KEY(1, 1, KEY_2), + KEY(1, 2, KEY_4), + KEY(1, 3, KEY_R), + KEY(1, 4, KEY_Y), + KEY(1, 5, KEY_8), + KEY(1, 6, KEY_I), + KEY(1, 7, KEY_O), + KEY(2, 0, KEY_TAB), + KEY(2, 1, KEY_Q), + KEY(2, 2, KEY_E), + KEY(2, 3, KEY_T), + KEY(2, 4, KEY_G), + KEY(2, 5, KEY_U), + KEY(2, 6, KEY_J), + KEY(2, 7, KEY_K), + KEY(3, 0, KEY_F1), + KEY(3, 1, KEY_W), + KEY(3, 2, KEY_S), + KEY(3, 3, KEY_F), + KEY(3, 4, KEY_V), + KEY(3, 5, KEY_H), + KEY(3, 6, KEY_M), + KEY(3, 7, KEY_L), + KEY(4, 0, KEY_F2), + KEY(4, 1, KEY_A), + KEY(4, 2, KEY_D), + KEY(4, 3, KEY_C), + KEY(4, 4, KEY_B), + KEY(4, 5, KEY_N), + KEY(4, 6, KEY_DOT), + KEY(5, 0, KEY_F3), + KEY(5, 1, KEY_Z), + KEY(5, 2, KEY_X), + KEY(5, 3, KEY_MINUS), + KEY(5, 4, KEY_SPACE), + KEY(5, 5, KEY_COMMA), + KEY(5, 7, KEY_UP), + KEY(6, 0, KEY_F4), + KEY(6, 1, KEY_F5), + KEY(6, 2, KEY_F6), + KEY(6, 3, KEY_F7), + KEY(6, 4, KEY_F8), + KEY(6, 5, KEY_MENU), + KEY(6, 6, KEY_LEFT), + KEY(6, 7, KEY_DOWN), + KEY(7, 0, KEY_4), + KEY(7, 1, KEY_5), + KEY(7, 2, KEY_6), + KEY(7, 3, KEY_7), + KEY(7, 4, KEY_8), + KEY(7, 5, KEY_9), + KEY(7, 6, KEY_LEFT), + KEY(7, 7, KEY_DOWN), +}; + +static struct matrix_keypad_platform_data qi_lb60_pdata = { + .key_map = qi_lb60_keymap, + .key_map_size = ARRAY_SIZE(qi_lb60_keymap), + .col_gpios = {114, 115, 116, 117, 118, 119, 120, 122, -1}, + .row_gpios = {74, 75, 76, 77, 78, 79, 80, 81, -1}, + .num_col_gpios = 8, + .num_row_gpios = 8, + .col_scan_delay_us = 10, + .debounce_ms = 10, + .active_low = 1, +}; + +static struct platform_device qi_lb60_device = { + .name = "qi_lb60-keyboard", + .name = "matrix-keypad", + .id = -1, + .dev = { + .platform_data = &qi_lb60_pdata, + }, +}; + +static int __init qi_kbd_init(void) +{ + return platform_device_register(&qi_lb60_device); +} + +static void __exit qi_kbd_exit(void) +{ + platform_device_unregister(&qi_lb60_device); +} + +module_init(qi_kbd_init); +module_exit(qi_kbd_exit); + +MODULE_AUTHOR("Xiangfu"); +MODULE_DESCRIPTION("Qi keypad driver"); +MODULE_LICENSE("GPL"); diff --git a/include/linux/input/matrix_keypad.h b/include/linux/input/matrix_keypad.h new file mode 100644 index 0000000..8b661cb --- /dev/null +++ b/include/linux/input/matrix_keypad.h @@ -0,0 +1,34 @@ +#ifndef _MATRIX_KEYPAD_H +#define _MATRIX_KEYPAD_H + +#include <linux/input.h> + +#define MATRIX_MAX_ROWS 16 +#define MATRIX_MAX_COLS 16 +#define MATRIX_MAX_KEYS (MATRIX_MAX_ROWS * MATRIX_MAX_COLS) + +struct matrix_keypad_platform_data { + /* scancode map for the matrix keys */ + uint32_t *key_map; + int key_map_size; + + unsigned row_gpios[MATRIX_MAX_ROWS]; + unsigned col_gpios[MATRIX_MAX_COLS]; + int num_row_gpios; + int num_col_gpios; + + unsigned int active_low; + unsigned int col_scan_delay_us; + + /* key debounce interval in milli-second */ + unsigned int debounce_ms; +}; + +#define KEY(row, col, val) ((((row) & (MATRIX_MAX_ROWS - 1)) << 28) |\ + (((col) & (MATRIX_MAX_COLS - 1)) << 24) |\ + (val & 0xffffff)) + +#define KEY_ROWCOL(k) (((k) >> 24) & 0xff) +#define KEY_VAL(k) ((k) & 0xffffff) + +#endif /* _MATRIX_KEYPAD_H */ ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: qi_lb60_keypad driver question? 2009-08-11 16:32 qi_lb60_keypad driver question? Xiangfu Liu @ 2009-08-12 2:15 ` Dmitry Torokhov 2009-08-12 2:41 ` Xiangfu Liu 2009-08-30 16:06 ` (matrix_keypad driver) " Xiangfu Liu 0 siblings, 2 replies; 12+ messages in thread From: Dmitry Torokhov @ 2009-08-12 2:15 UTC (permalink / raw) To: Xiangfu Liu Cc: Hard- and Software Development, Kernel, Distribution, Roadmap, linux-kernel Hi, On Wed, Aug 12, 2009 at 12:32:57AM +0800, Xiangfu Liu wrote: > Hi there > I have try to write the keypad driver, > but I don't know if this is the right direction. These kind of questions are better suited for teh linux-input mailing list. > attach is the patch for the openwrt[1] .25 kernel. > Which is not telling most of the people anything. For example I have no idea whta .25 kernel is. > diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c > new file mode 100644 > index 0000000..a51273e > --- /dev/null > +++ b/drivers/input/keyboard/matrix_keypad.c > @@ -0,0 +1,347 @@ > +/* > + * drivers/input/keyboard/matrix_keypad.c > + * > + * GPIO driven matrix keyboard driver > + * There is already an updated version of matrix_keypad driver in mainline, you don't need to repost it. > diff --git a/drivers/input/keyboard/qi_lb60_keypad.c b/drivers/input/keyboard/qi_lb60_keypad.c > new file mode 100644 > index 0000000..0b2e548 > --- /dev/null > +++ b/drivers/input/keyboard/qi_lb60_keypad.c This should go into arch specific board setup code, not in drivers/input > + > +static struct platform_device qi_lb60_device = { > + .name = "qi_lb60-keyboard", > + .name = "matrix-keypad", You are setting .name twice. Also, statically allocated platform devices may not be unregistered. Just create this device once in your board init code instead of having a separate unloadable module. -- Dmitry ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: qi_lb60_keypad driver question? 2009-08-12 2:15 ` Dmitry Torokhov @ 2009-08-12 2:41 ` Xiangfu Liu 2009-08-30 16:06 ` (matrix_keypad driver) " Xiangfu Liu 1 sibling, 0 replies; 12+ messages in thread From: Xiangfu Liu @ 2009-08-12 2:41 UTC (permalink / raw) To: Dmitry Torokhov Cc: Hard- and Software Development, Kernel, Distribution, Roadmap, linux-kernel Hi Dmitry Torokhow thanks for the reply. Dmitry Torokhov wrote: > Which is not telling most of the people anything. For example I have no > idea whta .25 kernel is. > we are current work on 2.6.25.20 kernel. make it work in 'Ben NanoNote' [1] all the patch is at [2] > There is already an updated version of matrix_keypad driver in mainline, > you don't need to repost it. > This should go into arch specific board setup code, not in drivers/input > > >> + >> +static struct platform_device qi_lb60_device = { >> + .name = "qi_lb60-keyboard", >> + .name = "matrix-keypad", >> > > You are setting .name twice. Also, statically allocated platform devices > may not be unregistered. Just create this device once in your board init > code instead of having a separate unloadable module. > thanks for the info. [1]http://www.qi-hardware.com/products/ben-nanonote/ [2]http://github.com/lindnermarek/openwrt-x-burst/tree/adb28f982f25a822d2dda9aa054470f3fff02908/target/linux/xburst/patches-2.6.25 -- Xiangfu Liu 刘向富 ================================== Qi Hardware Inc. Mobile: +86 132 4141 2371 Jabber: xiangfu.z at gmail.com Email : xiangfu at qi-hardware.com Web : http://www.qi-hardware.com ================================== ^ permalink raw reply [flat|nested] 12+ messages in thread
* (matrix_keypad driver) Re: qi_lb60_keypad driver question? 2009-08-12 2:15 ` Dmitry Torokhov 2009-08-12 2:41 ` Xiangfu Liu @ 2009-08-30 16:06 ` Xiangfu Liu 2009-09-01 1:37 ` Dmitry Torokhov 1 sibling, 1 reply; 12+ messages in thread From: Xiangfu Liu @ 2009-08-30 16:06 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: linux-input [-- Attachment #1: Type: text/plain, Size: 557 bytes --] Hi now the keypad in Ben NanoNote[1] is work. problem is I don't know how to write the special assemble key of matrix_key driver. some kind of 'SHIFT', like the red key in [2]. when I press the 'RED UP POINT' + 'W' = '@' attach is the Ben keypad driver platform.c:260 ~ 364 lines. thanks for any advice [1] http://www.qi-hardware.com/products/ben-nanonote/ [2] http://downloads.qi-hardware.com/hardware/mechanical/ben/2009_08_26/keyboard_problem_2.JPG -- Best Regards Xiangfu Liu Email: xiangfu at qi-hardware dot com Web: http://www.qi-hardware.com [-- Attachment #2: platform.c --] [-- Type: text/x-csrc, Size: 10464 bytes --] /* * Platform device support for Jz4740 SoC. * * Copyright 2007, <yliu@ingenic.cn> * * This file is licensed under the terms of the GNU General Public * License version 2. This program is licensed "as is" without any * warranty of any kind, whether express or implied. */ #include <linux/device.h> #include <linux/platform_device.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/resource.h> #include <linux/mtd/jz4740_nand.h> #include <linux/jz4740_fb.h> #include <linux/input/matrix_keypad.h> #include <linux/mtd/jz4740_nand.h> #include <asm/jzsoc.h> /* OHCI (USB full speed host controller) */ static struct resource jz_usb_ohci_resources[] = { [0] = { .start = CPHYSADDR(UHC_BASE), // phys addr for ioremap .end = CPHYSADDR(UHC_BASE) + 0x10000 - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_UHC, .end = IRQ_UHC, .flags = IORESOURCE_IRQ, }, }; /* The dmamask must be set for OHCI to work */ static u64 ohci_dmamask = ~(u32)0; static struct platform_device jz_usb_ohci_device = { .name = "jz-ohci", .id = 0, .dev = { .dma_mask = &ohci_dmamask, .coherent_dma_mask = 0xffffffff, }, .num_resources = ARRAY_SIZE(jz_usb_ohci_resources), .resource = jz_usb_ohci_resources, }; /*** LCD controller ***/ static struct resource jz_lcd_resources[] = { [0] = { .start = CPHYSADDR(LCD_BASE), .end = CPHYSADDR(LCD_BASE) + 0x10000 - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_LCD, .end = IRQ_LCD, .flags = IORESOURCE_IRQ, } }; static u64 jz_lcd_dmamask = ~(u32)0; static struct platform_device jz_lcd_device = { .name = "jz-lcd", .id = 0, .dev = { .dma_mask = &jz_lcd_dmamask, .coherent_dma_mask = 0xffffffff, }, .num_resources = ARRAY_SIZE(jz_lcd_resources), .resource = jz_lcd_resources, }; /* UDC (USB gadget controller) */ static struct resource jz_usb_gdt_resources[] = { [0] = { .start = CPHYSADDR(UDC_BASE), .end = CPHYSADDR(UDC_BASE) + 0x10000 - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_UDC, .end = IRQ_UDC, .flags = IORESOURCE_IRQ, }, }; static u64 udc_dmamask = ~(u32)0; static struct platform_device jz_usb_gdt_device = { .name = "jz-udc", .id = 0, .dev = { .dma_mask = &udc_dmamask, .coherent_dma_mask = 0xffffffff, }, .num_resources = ARRAY_SIZE(jz_usb_gdt_resources), .resource = jz_usb_gdt_resources, }; /** MMC/SD controller **/ static struct resource jz_mmc_resources[] = { [0] = { .start = CPHYSADDR(MSC_BASE), .end = CPHYSADDR(MSC_BASE) + 0x10000 - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_MSC, .end = IRQ_MSC, .flags = IORESOURCE_IRQ, } }; static u64 jz_mmc_dmamask = ~(u32)0; static struct platform_device jz_mmc_device = { .name = "jz-mmc", .id = 0, .dev = { .dma_mask = &jz_mmc_dmamask, .coherent_dma_mask = 0xffffffff, }, .num_resources = ARRAY_SIZE(jz_mmc_resources), .resource = jz_mmc_resources, }; /** I2C controller **/ static struct resource jz_i2c_resources[] = { [0] = { .start = CPHYSADDR(I2C_BASE), .end = CPHYSADDR(I2C_BASE) + 0x10000 - 1, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_I2C, .end = IRQ_I2C, .flags = IORESOURCE_IRQ, } }; static u64 jz_i2c_dmamask = ~(u32)0; static struct platform_device jz_i2c_device = { .name = "jz_i2c", .id = 0, .dev = { .dma_mask = &jz_i2c_dmamask, .coherent_dma_mask = 0xffffffff, }, .num_resources = ARRAY_SIZE(jz_i2c_resources), .resource = jz_i2c_resources, }; static struct resource jz_nand_resources[] = { [0] = { .start = CPHYSADDR(EMC_BASE), .end = CPHYSADDR(EMC_BASE) + 0x10000 - 1, .flags = IORESOURCE_MEM, }, }; #ifdef QI_LB60_2GB_NAND static struct nand_ecclayout qi_lb60_ecclayout = { .eccbytes = 72, .eccpos = { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83}, .oobfree = { {.offset = 2, .length = 10}, {.offset = 84, .length = 44}} }; static struct mtd_partition qi_lb60_partitions[] = { { .name = "NAND BOOT partition", .offset = 0 * 0x100000, .size = 4 * 0x100000, }, { .name = "NAND KERNEL partition", .offset = 4 * 0x100000, .size = 4 * 0x100000, }, { .name = "NAND ROOTFS partition", .offset = 8 * 0x100000, .size = 504 * 0x100000, }, { .name = "NAND DATA partition", .offset = 512 * 0x100000, .size = (512 + 1024) * 0x100000, }, }; #else static struct nand_ecclayout qi_lb60_ecclayout = { .eccbytes = 36, .eccpos = { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41}, .oobfree = { {.offset = 2, .length = 4}, {.offset = 42, .length = 22}} }; static struct mtd_partition qi_lb60_partitions[] = { { .name = "NAND BOOT partition", .offset = 0 * 0x100000, .size = 4 * 0x100000, }, { .name = "NAND KERNEL partition", .offset = 4 * 0x100000, .size = 4 * 0x100000, }, { .name = "NAND ROOTFS partition", .offset = 8 * 0x100000, .size = 504 * 0x100000, }, { .name = "NAND DATA partition", .offset = 512 * 0x100000, .size = 512 * 0x100000, }, }; #endif /* QI_LB60_2GB_NAND */ static struct jz_nand_platform_data jz_nand_platform_data = { .num_partitions = ARRAY_SIZE(qi_lb60_partitions), .partitions = qi_lb60_partitions, .ecc_layout = &qi_lb60_ecclayout, .busy_gpio = 94, }; static struct platform_device jz_nand_device = { .name = "jz4740-nand", .num_resources = ARRAY_SIZE(jz_nand_resources), .resource = jz_nand_resources, .dev = { .platform_data = &jz_nand_platform_data, } }; /* #define KEEP_UART_ALIVE * don't define this. the keyboard and keyboard both work */ #define KEY_QI_QI KEY_MINUS #define KEY_QI_UPRED KEY_F14 #define KEY_QI_VOLUP KEY_VOLUMEDOWN #define KEY_QI_VOLDOWN KEY_VOLUMEUP static const uint32_t qi_lb60_keymap[] = { KEY(0, 0, KEY_F1), /* S2 */ KEY(0, 1, KEY_F2), /* S3 */ KEY(0, 2, KEY_F3), /* S4 */ KEY(0, 3, KEY_F4), /* S5 */ KEY(0, 4, KEY_F5), /* S6 */ KEY(0, 5, KEY_F6), /* S7 */ KEY(0, 6, KEY_F7), /* S8 */ KEY(1, 0, KEY_Q), /* S10 */ KEY(1, 1, KEY_W), /* S11 */ KEY(1, 2, KEY_E), /* S12 */ KEY(1, 3, KEY_R), /* S13 */ KEY(1, 4, KEY_T), /* S14 */ KEY(1, 5, KEY_Y), /* S15 */ KEY(1, 6, KEY_U), /* S16 */ KEY(1, 7, KEY_I), /* S17 */ KEY(2, 0, KEY_A), /* S18 */ KEY(2, 1, KEY_S), /* S19 */ KEY(2, 2, KEY_D), /* S20 */ KEY(2, 3, KEY_F), /* S21 */ KEY(2, 4, KEY_G), /* S22 */ KEY(2, 5, KEY_H), /* S23 */ KEY(2, 6, KEY_J), /* S24 */ KEY(2, 7, KEY_K), /* S25 */ KEY(3, 0, KEY_ESC), /* S26 */ KEY(3, 1, KEY_Z), /* S27 */ KEY(3, 2, KEY_X), /* S28 */ KEY(3, 3, KEY_C), /* S29 */ KEY(3, 4, KEY_V), /* S30 */ KEY(3, 5, KEY_B), /* S31 */ KEY(3, 6, KEY_N), /* S32 */ KEY(3, 7, KEY_M), /* S33 */ KEY(4, 0, KEY_TAB), /* S34 */ KEY(4, 1, KEY_CAPSLOCK), /* S35 */ KEY(4, 2, KEY_BACKSLASH), /* S36 */ KEY(4, 3, KEY_APOSTROPHE), /* S37 */ KEY(4, 4, KEY_COMMA), /* S38 */ KEY(4, 5, KEY_DOT), /* S39 */ KEY(4, 6, KEY_SLASH), /* S40 */ KEY(4, 7, KEY_UP), /* S41 */ KEY(5, 0, KEY_O), /* S42 */ KEY(5, 1, KEY_L), /* S43 */ KEY(5, 2, KEY_EQUAL), /* S44 */ KEY(5, 3, KEY_QI_UPRED), /* S45 */ KEY(5, 4, KEY_SPACE), /* S46 */ KEY(5, 5, KEY_QI_QI), /* S47 */ KEY(5, 6, KEY_LEFTCTRL), /* S48 */ KEY(5, 7, KEY_LEFT), /* S49 */ KEY(6, 0, KEY_F8), /* S50 */ KEY(6, 1, KEY_P), /* S51 */ KEY(6, 2, KEY_BACKSPACE),/* S52 */ KEY(6, 3, KEY_ENTER), /* S53 */ KEY(6, 4, KEY_QI_VOLUP), /* S54 */ KEY(6, 5, KEY_QI_VOLDOWN), /* S55 */ KEY(6, 6, KEY_DOWN), /* S56 */ KEY(6, 7, KEY_RIGHT), /* S57 */ #ifndef KEEP_UART_ALIVE KEY(7, 0, KEY_LEFTSHIFT), /* S58 */ KEY(7, 1, KEY_LEFTALT), /* S59 */ KEY(7, 2, KEY_FN), /* S60 */ #endif }; static const struct matrix_keymap_data qi_lb60_keymap_data = { .keymap = qi_lb60_keymap, .keymap_size = ARRAY_SIZE(qi_lb60_keymap), }; static const unsigned int qi_lb60_keypad_cols[] = { 74, 75, 76, 77, 78, 79, 80, 81, }; static const unsigned int qi_lb60_keypad_rows[] = { 114, 115, 116, 117, 118, 119, 120, #ifndef KEEP_UART_ALIVE 122, #endif }; static struct matrix_keypad_platform_data qi_lb60_pdata = { .keymap_data = &qi_lb60_keymap_data, .col_gpios = qi_lb60_keypad_cols, .row_gpios = qi_lb60_keypad_rows, .num_col_gpios = ARRAY_SIZE(qi_lb60_keypad_cols), .num_row_gpios = ARRAY_SIZE(qi_lb60_keypad_rows), .col_scan_delay_us = 10, .debounce_ms = 10, .wakeup = 1, .active_low = 1, }; static struct platform_device qi_lb60_keypad = { .name = "matrix-keypad", .id = -1, .dev = { .platform_data = &qi_lb60_pdata, }, }; static struct fb_videomode qi_lb60_video_modes[] = { { .name = "320x240", .xres = 320, .yres = 240, .pixclock = 700000, .left_margin = 140, .right_margin = 273, .upper_margin = 20, .lower_margin = 1, .hsync_len = 1, .vsync_len = 1, .sync = 0, .vmode = FB_VMODE_NONINTERLACED, }, }; static struct jz4740_fb_platform_data qi_lb60_fb_data = { .width = 60, .height = 45, .num_modes = ARRAY_SIZE(qi_lb60_video_modes), .modes = qi_lb60_video_modes, .bpp = 24, .lcd_type = JZ_LCD_TYPE_8BIT_SERIAL, }; static struct resource fb_resources[] = { [0] = { .start = CPHYSADDR(LCD_BASE), .end = CPHYSADDR(LCD_BASE) + 0x10000 - 1, .flags = IORESOURCE_MEM, }, }; static struct platform_device qi_lb60_fb = { .name = "jz4740-fb", .id = -1, .num_resources = ARRAY_SIZE(fb_resources), .resource = fb_resources, .dev = { .dma_mask = &jz_lcd_dmamask, .coherent_dma_mask = 0xffffffff, .platform_data = &qi_lb60_fb_data, }, }; /* All */ static struct platform_device *jz_platform_devices[] __initdata = { &jz_usb_ohci_device, &jz_lcd_device, &jz_usb_gdt_device, &jz_mmc_device, &jz_nand_device, &jz_i2c_device, &qi_lb60_keypad, &qi_lb60_fb, }; static int __init jz_platform_init(void) { return platform_add_devices(jz_platform_devices, ARRAY_SIZE(jz_platform_devices)); } arch_initcall(jz_platform_init); ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: (matrix_keypad driver) Re: qi_lb60_keypad driver question? 2009-08-30 16:06 ` (matrix_keypad driver) " Xiangfu Liu @ 2009-09-01 1:37 ` Dmitry Torokhov 2009-09-04 11:38 ` Xiangfu Liu ` (2 more replies) 0 siblings, 3 replies; 12+ messages in thread From: Dmitry Torokhov @ 2009-09-01 1:37 UTC (permalink / raw) To: Xiangfu Liu; +Cc: linux-input Hi, On Mon, Aug 31, 2009 at 12:06:42AM +0800, Xiangfu Liu wrote: > Hi > now the keypad in Ben NanoNote[1] is work. problem is I don't know > how to write the special assemble key of matrix_key driver. some kind > of 'SHIFT', like the red key in [2]. when I press the 'RED UP POINT' > + 'W' = '@' > Historically our KEY_* definitions did not include defines for symbols like '@' because they do not have a dedicated key but rather being produced as a combination of a primary key + modifier; the mapping is done either in console driver or in X. Looking at the picture of the device that you provided it appears that your device does not have a dedicated '@' key so it should work in the same fashion as above. -- Dmitry ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: (matrix_keypad driver) Re: qi_lb60_keypad driver question? 2009-09-01 1:37 ` Dmitry Torokhov @ 2009-09-04 11:38 ` Xiangfu Liu 2009-09-07 2:50 ` Xiangfu Liu 2009-09-09 7:35 ` (matrix_keypad driver) Re: qi_lb60_keypad driver question? Xiangfu Liu 2 siblings, 0 replies; 12+ messages in thread From: Xiangfu Liu @ 2009-09-04 11:38 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: linux-input Hi Dmitry sorry for the late reply. thanks for the info. I will try to work on the console driver since our device don't have X. will send report when I have any progress. Best Regards Xiangfu Dmitry Torokhov wrote: > Hi, > > On Mon, Aug 31, 2009 at 12:06:42AM +0800, Xiangfu Liu wrote: >> Hi >> now the keypad in Ben NanoNote[1] is work. problem is I don't know >> how to write the special assemble key of matrix_key driver. some kind >> of 'SHIFT', like the red key in [2]. when I press the 'RED UP POINT' >> + 'W' = '@' >> > > Historically our KEY_* definitions did not include defines for symbols > like '@' because they do not have a dedicated key but rather being > produced as a combination of a primary key + modifier; the mapping is > done either in console driver or in X. > > Looking at the picture of the device that you provided it appears that > your device does not have a dedicated '@' key so it should work in the > same fashion as above. > -- Xiangfu Liu Email: xiangfu at qi-hardware dot com Web: http://www.qi-hardware.com ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: (matrix_keypad driver) Re: qi_lb60_keypad driver question? 2009-09-01 1:37 ` Dmitry Torokhov 2009-09-04 11:38 ` Xiangfu Liu @ 2009-09-07 2:50 ` Xiangfu Liu 2009-09-08 16:48 ` matrix_keypad driver, Combination keys Xiangfu Liu 2009-09-09 7:35 ` (matrix_keypad driver) Re: qi_lb60_keypad driver question? Xiangfu Liu 2 siblings, 1 reply; 12+ messages in thread From: Xiangfu Liu @ 2009-09-07 2:50 UTC (permalink / raw) To: Dmitry Torokhov Cc: linux-input, Hard- and Software Development, Kernel, Distribution, Roadmap Hi Dmitry Dmitry Torokhov wrote: > Hi, > Historically our KEY_* definitions did not include defines for symbols > like '@' because they do not have a dedicated key but rather being > produced as a combination of a primary key + modifier; the mapping is > done either in console driver or in X. > > Looking at the picture of the device that you provided it appears that > your device does not have a dedicated '@' key so it should work in the > same fashion as above. > since we don't have X now. I google about this. I don't know how to modify the console driver. can you tell me which file I need look into? thanks. I found an another method. we use busybox in rootfs. the busybox have command [dumpkmap] [loadkmap] [showkey], ----------- in host system run : /usr/bin/dumpkeys > normal_keymap /usr/bin/loadkeys funky_mini_keyboard_keymap /usr/bin/busybox dumpkmap > funky_mini_keyboard_keymap.bin /usr/bin/loadkeys normal_keymap then in target system run "loadkmap funky_mini_keyboard_keymap.bin" ----------- in our device have a two special keys [RED UP POINT] keycode is 94 [QI] keycode is 93 the loadkeys alwasy like: compose '|' 's' to '$' how to write the keycode to the loadkeys file. I just found this method yesterday. not test yet. anyone have experience on this? thanks for advice -- Best Regards Xiangfu Liu Email: xiangfu at qi-hardware dot com Web: http://www.qi-hardware.com ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: matrix_keypad driver, Combination keys 2009-09-07 2:50 ` Xiangfu Liu @ 2009-09-08 16:48 ` Xiangfu Liu 0 siblings, 0 replies; 12+ messages in thread From: Xiangfu Liu @ 2009-09-08 16:48 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: linux-input, linux-kernel Xiangfu Liu wrote: > Hi Dmitry > Dmitry Torokhov wrote: >> Hi, >> Historically our KEY_* definitions did not include defines for symbols >> like '@' because they do not have a dedicated key but rather being >> produced as a combination of a primary key + modifier; the mapping is >> done either in console driver or in X. >> >> Looking at the picture of the device that you provided it appears that >> your device does not have a dedicated '@' key so it should work in the >> same fashion as above. >> > > since we don't have X now. I google about this. I don't know how to > modify the console driver. can you tell me which file I need look > into? thanks. > > I found an another method. we use busybox in rootfs. the busybox have > command [dumpkmap] [loadkmap] [showkey], > > ----------- > in host system run : > /usr/bin/dumpkeys > normal_keymap > /usr/bin/loadkeys funky_mini_keyboard_keymap > /usr/bin/busybox dumpkmap > funky_mini_keyboard_keymap.bin > /usr/bin/loadkeys normal_keymap > > then in target system run > "loadkmap funky_mini_keyboard_keymap.bin" > ----------- > > in our device have a two special keys > [RED UP POINT] keycode is 94 > [QI] keycode is 93 > can I modify this function matrix_keyboard.c:103 static void matrix_keypad_scan(struct work_struct *work) to detect the combination keys? like: 1. if press the compose keys [RED UP POINT] just record 2. if next press the 'w'. will report '@' to OS. if it's possible. how to report '@' to OS. I saw the source code is always report the keycode. thanks for help -- Xiangfu Liu Email: xiangfu at qi-hardware dot com Web: http://www.qi-hardware.com ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: (matrix_keypad driver) Re: qi_lb60_keypad driver question? 2009-09-01 1:37 ` Dmitry Torokhov 2009-09-04 11:38 ` Xiangfu Liu 2009-09-07 2:50 ` Xiangfu Liu @ 2009-09-09 7:35 ` Xiangfu Liu 2009-09-09 8:36 ` Dmitry Torokhov 2 siblings, 1 reply; 12+ messages in thread From: Xiangfu Liu @ 2009-09-09 7:35 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: linux-input Dmitry Torokhov wrote: > Hi, > > On Mon, Aug 31, 2009 at 12:06:42AM +0800, Xiangfu Liu wrote: >> Hi >> now the keypad in Ben NanoNote[1] is work. problem is I don't know >> how to write the special assemble key of matrix_key driver. some kind >> of 'SHIFT', like the red key in [2]. when I press the 'RED UP POINT' >> + 'W' = '@' >> > > Historically our KEY_* definitions did not include defines for symbols > like '@' because they do not have a dedicated key but rather being > produced as a combination of a primary key + modifier; the mapping is > done either in console driver or in X. > thanks Dmitry. can you point me which file I need look into, I am newbie in kernel. -- Xiangfu Liu Email: xiangfu at qi-hardware dot com Web: http://www.qi-hardware.com ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: (matrix_keypad driver) Re: qi_lb60_keypad driver question? 2009-09-09 7:35 ` (matrix_keypad driver) Re: qi_lb60_keypad driver question? Xiangfu Liu @ 2009-09-09 8:36 ` Dmitry Torokhov 2009-09-09 8:46 ` Xiangfu Liu 0 siblings, 1 reply; 12+ messages in thread From: Dmitry Torokhov @ 2009-09-09 8:36 UTC (permalink / raw) To: Xiangfu Liu; +Cc: linux-input Hi Xiangfu, On Wed, Sep 09, 2009 at 03:35:21PM +0800, Xiangfu Liu wrote: > Dmitry Torokhov wrote: > > Hi, > > > > On Mon, Aug 31, 2009 at 12:06:42AM +0800, Xiangfu Liu wrote: > >> Hi > >> now the keypad in Ben NanoNote[1] is work. problem is I don't know > >> how to write the special assemble key of matrix_key driver. some kind > >> of 'SHIFT', like the red key in [2]. when I press the 'RED UP POINT' > >> + 'W' = '@' > >> > > > > Historically our KEY_* definitions did not include defines for symbols > > like '@' because they do not have a dedicated key but rather being > > produced as a combination of a primary key + modifier; the mapping is > > done either in console driver or in X. > > > thanks Dmitry. > can you point me which file I need look into, I believe you already discovered loadkeys and the keyboard maps that are used in console mode. I believe you just need to make your 'up point' key a modifier and make sure that 'W' with that particular modifier emits '@'. -- Dmitry ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: (matrix_keypad driver) Re: qi_lb60_keypad driver question? 2009-09-09 8:36 ` Dmitry Torokhov @ 2009-09-09 8:46 ` Xiangfu Liu 2009-09-09 9:14 ` Dmitry Torokhov 0 siblings, 1 reply; 12+ messages in thread From: Xiangfu Liu @ 2009-09-09 8:46 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: linux-input Dmitry Torokhov wrote: > Hi Xiangfu, > > On Wed, Sep 09, 2009 at 03:35:21PM +0800, Xiangfu Liu wrote: >> Dmitry Torokhov wrote: >>> Hi, >>> >>> On Mon, Aug 31, 2009 at 12:06:42AM +0800, Xiangfu Liu wrote: >>>> Hi >>>> now the keypad in Ben NanoNote[1] is work. problem is I don't know >>>> how to write the special assemble key of matrix_key driver. some kind >>>> of 'SHIFT', like the red key in [2]. when I press the 'RED UP POINT' >>>> + 'W' = '@' >>>> >>> Historically our KEY_* definitions did not include defines for symbols >>> like '@' because they do not have a dedicated key but rather being >>> produced as a combination of a primary key + modifier; the mapping is >>> done either in console driver or in X. >>> >> thanks Dmitry. >> can you point me which file I need look into, > > I believe you already discovered loadkeys and the keyboard maps that are > used in console mode. I believe you just need to make your 'up point' > key a modifier and make sure that 'W' with that particular modifier > emits '@'. > the keycode 94 is the 'up point' the loadkeys always like: keycode 94 = Compose compose 'w' 'w' to '@' it's take three keys not two. I must press 'up point' + 'w' + 'w' then it's will display '@'. not 'up point' + 'w' = '@' thanks for reply. -- Xiangfu Liu Email: xiangfu at qi-hardware dot com Web: http://www.qi-hardware.com ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: (matrix_keypad driver) Re: qi_lb60_keypad driver question? 2009-09-09 8:46 ` Xiangfu Liu @ 2009-09-09 9:14 ` Dmitry Torokhov 0 siblings, 0 replies; 12+ messages in thread From: Dmitry Torokhov @ 2009-09-09 9:14 UTC (permalink / raw) To: Xiangfu Liu; +Cc: linux-input On Wed, Sep 09, 2009 at 04:46:58PM +0800, Xiangfu Liu wrote: > Dmitry Torokhov wrote: > > Hi Xiangfu, > > > > On Wed, Sep 09, 2009 at 03:35:21PM +0800, Xiangfu Liu wrote: > >> Dmitry Torokhov wrote: > >>> Hi, > >>> > >>> On Mon, Aug 31, 2009 at 12:06:42AM +0800, Xiangfu Liu wrote: > >>>> Hi > >>>> now the keypad in Ben NanoNote[1] is work. problem is I don't know > >>>> how to write the special assemble key of matrix_key driver. some kind > >>>> of 'SHIFT', like the red key in [2]. when I press the 'RED UP POINT' > >>>> + 'W' = '@' > >>>> > >>> Historically our KEY_* definitions did not include defines for symbols > >>> like '@' because they do not have a dedicated key but rather being > >>> produced as a combination of a primary key + modifier; the mapping is > >>> done either in console driver or in X. > >>> > >> thanks Dmitry. > >> can you point me which file I need look into, > > > > I believe you already discovered loadkeys and the keyboard maps that are > > used in console mode. I believe you just need to make your 'up point' > > key a modifier and make sure that 'W' with that particular modifier > > emits '@'. > > > the keycode 94 is the 'up point' > > the loadkeys always like: > keycode 94 = Compose > compose 'w' 'w' to '@' > > it's take three keys not two. > I must press 'up point' + 'w' + 'w' then it's will display '@'. > not 'up point' + 'w' = '@' > You probably want to map your 'up point' to AltGr: keycode 94 = AltGr altgr keycode <w-keycode> = at You will find additional information in 'man keymaps', also see documentation that comes with 'kbd' package. -- Dmitry ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2009-09-09 9:14 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-08-11 16:32 qi_lb60_keypad driver question? Xiangfu Liu 2009-08-12 2:15 ` Dmitry Torokhov 2009-08-12 2:41 ` Xiangfu Liu 2009-08-30 16:06 ` (matrix_keypad driver) " Xiangfu Liu 2009-09-01 1:37 ` Dmitry Torokhov 2009-09-04 11:38 ` Xiangfu Liu 2009-09-07 2:50 ` Xiangfu Liu 2009-09-08 16:48 ` matrix_keypad driver, Combination keys Xiangfu Liu 2009-09-09 7:35 ` (matrix_keypad driver) Re: qi_lb60_keypad driver question? Xiangfu Liu 2009-09-09 8:36 ` Dmitry Torokhov 2009-09-09 8:46 ` Xiangfu Liu 2009-09-09 9:14 ` Dmitry Torokhov
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.