update adc drivers

This commit is contained in:
kfx
2010-11-18 23:47:57 +08:00
parent 0a0fed0512
commit f3ca0d8e6a
2 changed files with 50 additions and 34 deletions

View File

@@ -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
};

View File

@@ -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,