From f3ca0d8e6ad00a214cf0dec1cd8f5978daa88717 Mon Sep 17 00:00:00 2001 From: kfx Date: Thu, 18 Nov 2010 23:47:57 +0800 Subject: [PATCH] update adc drivers --- arch/arm/mach-rk29/board-rk29sdk-key.c | 47 +++++++++++++------------- drivers/input/keyboard/rk29_keys.c | 37 ++++++++++++++------ 2 files changed, 50 insertions(+), 34 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29sdk-key.c b/arch/arm/mach-rk29/board-rk29sdk-key.c index fcf767927e30..dacbda10e6e5 100755 --- a/arch/arm/mach-rk29/board-rk29sdk-key.c +++ b/arch/arm/mach-rk29/board-rk29sdk-key.c @@ -8,86 +8,85 @@ #define PRESS_LEV_HIGH 0 static struct rk29_keys_button key_button[] = { - [0] = { + { .desc = "vol+", .code = KEY_VOLUMEDOWN, .gpio = RK29_PIN0_PB0, .active_low = PRESS_LEV_LOW, }, - [1] = { + { .desc = "vol-", .code = KEY_VOLUMEUP, .gpio = RK29_PIN0_PB1, .active_low = PRESS_LEV_LOW, }, - [2] = { + { .desc = "menu", .code = EV_MENU, .gpio = RK29_PIN0_PB2, .active_low = PRESS_LEV_LOW, }, - [3] = { + { .desc = "home", .code = KEY_HOME, - .code_long_press = KEY_F4, .gpio = RK29_PIN0_PB3, .active_low = PRESS_LEV_LOW, }, - [4] = { - .desc = "back", - .code = KEY_BACK, + { + .desc = "esc", + .code = KEY_ESC, .gpio = RK29_PIN0_PB4, .active_low = PRESS_LEV_LOW, }, - [5] = { - .desc = "esc", - .code = KEY_ESC, + { + .desc = "iokey6", + .code = KEY_BACK, + .code_long_press = EV_ENCALL, .gpio = RK29_PIN0_PB5, .active_low = PRESS_LEV_LOW, }, -#if 0 - [6] = { + { .desc = "vol+", .code = KEY_VOLUMEDOWN, .adc_value = 95, .active_low = PRESS_LEV_LOW, }, - [7] = { + { .desc = "vol-", .code = KEY_VOLUMEUP, .adc_value = 249, .active_low = PRESS_LEV_LOW, }, - [8] = { + { .desc = "menu", .code = EV_MENU, .adc_value = 406, .active_low = PRESS_LEV_LOW, }, - [9] = { + { .desc = "home", .code = KEY_HOME, .code_long_press = KEY_F4, .adc_value = 561, .active_low = PRESS_LEV_LOW, }, - [10] = { - .desc = "back", - .code = KEY_BACK, + { + .desc = "esc", + .code = KEY_ESC, .adc_value = 726, .active_low = PRESS_LEV_LOW, }, - [11] = { - .desc = "esc", - .code = KEY_ESC, + { + .desc = "adkey6", + .code = KEY_BACK, + .code_long_press = EV_ENCALL, .adc_value = 899, .active_low = PRESS_LEV_LOW, }, -#endif }; struct rk29_keys_platform_data rk29_keys_pdata = { .buttons = key_button, .nbuttons = ARRAY_SIZE(key_button), - .chn = -1, //chn: 0-7, if do not use ADC,set 'chn' -1 + .chn = 1, //chn: 0-7, if do not use ADC,set 'chn' -1 }; diff --git a/drivers/input/keyboard/rk29_keys.c b/drivers/input/keyboard/rk29_keys.c index 60ae7fa1ccc8..17cadafde0b6 100755 --- a/drivers/input/keyboard/rk29_keys.c +++ b/drivers/input/keyboard/rk29_keys.c @@ -50,6 +50,7 @@ struct rk29_button_data { struct rk29_keys_drvdata { int nbuttons; + int result; struct input_dev *input; struct adc_client *client; struct timer_list timer; @@ -79,12 +80,14 @@ static void keys_long_press_timer(unsigned long _data) if(state) { if(bdata->long_press_count != 0) { if(bdata->long_press_count % (LONG_PRESS_COUNT+ONE_SEC_COUNT) == 0){ - key_dbg(bdata, "key[%s]: report ev[%d] state[0]\n", button->desc, button->code_long_press); + key_dbg(bdata, "%skey[%s]: report ev[%d] state[0]\n", + (!button->gpio)?"ad":"io", button->desc, button->code_long_press); input_event(input, type, button->code_long_press, 0); input_sync(input); } else if(bdata->long_press_count%LONG_PRESS_COUNT == 0) { - key_dbg(bdata, "key[%s]: report ev[%d] state[1]\n", button->desc, button->code_long_press); + key_dbg(bdata, "%skey[%s]: report ev[%d] state[1]\n", + (!button->gpio)?"ad":"io", button->desc, button->code_long_press); input_event(input, type, button->code_long_press, 1); input_sync(input); } @@ -96,8 +99,8 @@ static void keys_long_press_timer(unsigned long _data) else { if(bdata->long_press_count <= LONG_PRESS_COUNT) { bdata->long_press_count = 0; - key_dbg(bdata, "key[%s]: report ev[%d] state[1], report ev[%d] state[0]\n", - button->desc, button->code, button->code); + key_dbg(bdata, "%skey[%s]: report ev[%d] state[1], report ev[%d] state[0]\n", + (!button->gpio)?"ad":"io", button->desc, button->code, button->code); input_event(input, type, button->code, 1); input_sync(input); input_event(input, type, button->code, 0); @@ -105,7 +108,8 @@ static void keys_long_press_timer(unsigned long _data) } else { if(bdata->state != state) - key_dbg(bdata, "key[%s]: report ev[%d] state[0]\n", button->desc, button->code_long_press); + key_dbg(bdata, "%skey[%s]: report ev[%d] state[0]\n", + (!button->gpio)?"ad":"io", button->desc, button->code_long_press); input_event(input, type, button->code_long_press, 0); input_sync(input); } @@ -126,7 +130,8 @@ static void keys_timer(unsigned long _data) state = !!button->adc_state; if(bdata->state != state) { bdata->state = state; - key_dbg(bdata, "key[%s]: report ev[%d] state[%d]\n", button->desc, button->code, bdata->state); + key_dbg(bdata, "%skey[%s]: report ev[%d] state[%d]\n", + (!button->gpio)?"ad":"io", button->desc, button->code, bdata->state); input_event(input, type, button->code, bdata->state); input_sync(input); } @@ -151,6 +156,8 @@ static void callback(struct adc_client *client, void *client_param, int result) { struct rk29_keys_drvdata *ddata = (struct rk29_keys_drvdata *)client_param; int i; + if(result > INVALID_ADVALUE && result < EMPTY_ADVALUE) + ddata->result = result; for (i = 0; i < ddata->nbuttons; i++) { struct rk29_button_data *bdata = &ddata->data[i]; struct rk29_keys_button *button = bdata->button; @@ -161,7 +168,9 @@ static void callback(struct adc_client *client, void *client_param, int result) button->adc_state = 1; else button->adc_state = 0; - + if(bdata->state != button->adc_state) + mod_timer(&bdata->timer, + jiffies + msecs_to_jiffies(DEFAULT_DEBOUNCE_INTERVAL)); } return; } @@ -172,6 +181,14 @@ static void adc_timer(unsigned long _data) adc_async_read(ddata->client); mod_timer(&ddata->timer, jiffies + msecs_to_jiffies(ADC_SAMPLE_TIME)); } +static ssize_t adc_value_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct rk29_keys_drvdata *ddata = dev_get_drvdata(dev); + + return sprintf(buf, "adc_value: %d\n", ddata->result); +} + +static DEVICE_ATTR(get_adc_value, S_IRUGO | S_IWUSR, adc_value_show, NULL); static int __devinit keys_probe(struct platform_device *pdev) { @@ -286,8 +303,8 @@ static int __devinit keys_probe(struct platform_device *pdev) } device_init_wakeup(&pdev->dev, wakeup); - - return 0; + error = device_create_file(&pdev->dev, &dev_attr_get_adc_value); + return error; fail2: while (--i >= 0) { @@ -380,7 +397,7 @@ static struct platform_driver keys_device_driver = { .probe = keys_probe, .remove = __devexit_p(keys_remove), .driver = { - .name = "gpio-keys", + .name = "rk29-keys", .owner = THIS_MODULE, #ifdef CONFIG_PM .pm = &keys_pm_ops, -- 2.34.1