rk3288 按键rk_key.c

```
这里我们分析一下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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值