```
这里我们分析一下rk3288的按键驱动分析
//定时器执行函数
static void keys_timer(unsigned long _data)
{
struct rk_keys_drvdata *pdata = rk_key_get_drvdata();
struct rk_keys_button *button = (struct rk_keys_button *)_data;
struct input_dev *input = pdata->input;
int state;
//首先判断是否按键还是adc的类型,之后通过他们获取state
if (button->type == TYPE_GPIO)
state = !!((gpio_get_value(button->gpio) ? 1 : 0) ^
button->active_low);
else
state = !!button->adc_state;
//将存储的按键值和它对比,如果不一样的话就上报
if (button->state != state) {
button->state = state;
input_event(input, EV_KEY, button->code, button->state);
key_dbg(pdata, "%skey[%s]: report event[%d] state[%d]\n",
button->type == TYPE_ADC ? "adc" : "gpio",
button->desc, button->code, button->state);
input_event(input, EV_KEY, button->code, button->state);
input_sync(input);
}
//如果一直没有抬起的话,那么就一直重新计时
if (state)
mod_timer(&button->timer, jiffies + DEBOUNCE_JIFFIES);
}
static irqreturn_t keys_isr(int irq, void *dev_id)
{
struct rk_keys_drvdata *pdata = rk_key_get_drvdata();
struct rk_keys_button *button = (struct rk_keys_button *)dev_id;
struct input_dev *input = pdata->input;
BUG_ON(irq != gpio_to_irq(button->gpio));
if (button->wakeup && pdata->in_suspend) {
button->state = 1;
key_dbg(pdata,
"wakeup: %skey[%s]: report event[%d] state[%d]\n",
(button->type == TYPE_ADC) ? "adc" : "gpio",
button->desc, button->code, button->state);
input_event(input, EV_KEY, button->code, button->state);
input_sync(input);
}
if (button->wakeup)
wake_lock_timeout(&pdata->wake_lock, WAKE_LOCK_JIFFIES);
//重新设置定时器的值,重新计时
mod_timer(&button->timer, jiffies + DEBOUNCE_JIFFIES);
return IRQ_HANDLED;
}
static const struct of_device_id rk_key_match[] = {
{ .compatible = "rockchip,key", .data = NULL},
{},
};
MODULE_DEVICE_TABLE(of, rk_key_match);
static int rk_key_adc_iio_read(struct rk_keys_drvdata *data)
{
struct iio_channel *channel = data->chan;
int val, ret;
if (!channel)
return INVALID_ADVALUE;
ret = iio_read_channel_raw(channel, &val);
if (ret < 0) {
pr_err("read channel() error: %d\n", ret);
return ret;
}
return val;
}
//adc的执行函数
static void adc_key_poll(struct work_struct *wo
rk3288 按键rk_key.c
最新推荐文章于 2025-02-05 15:42:42 发布