Android 展讯 12 解决旋钮编码器旋转一次报两次事件

— a/bsp/kernel/kernel5.4/drivers/input/misc/rotary_encoder.c
+++ b/bsp/kernel/kernel5.4/drivers/input/misc/rotary_encoder.c
@@ -54,13 +54,15 @@ struct rotary_encoder {
signed char dir; /* 1 - clockwise, -1 - CCW */

    unsigned int last_stable;
  •   unsigned long rotenc_swdeb;
    
  •   unsigned long rotenc_hwdeb;
    
  •   struct delayed_work rotary_encoder_work;
    

};

static unsigned long foreward_dir = 0;
static unsigned long back_dir = 0;

+static struct rotary_encoder *g_Encoder = NULL;
//powerkey enable for ACC
static const struct of_device_id powerkey_dt_ids[] = {
{
@@ -214,37 +216,44 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}

-static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
+static void rotary_encoder_delay_workcallback(struct work_struct *work)
{

  •   struct rotary_encoder *encoder = dev_id;
      unsigned int state;
    
  •   mutex_lock(&encoder->access_mutex);
    
  •   mutex_lock(&g_Encoder->access_mutex);
    
  •   state = rotary_encoder_get_state(encoder);
    
  •   state = rotary_encoder_get_state(g_Encoder);
    
  •   if ((encoder->last_stable + 1) % 4 == state)
    
  •   printk("zdc %s,%d g_Encoder->last_stable=%d,state=0x%x\n", __func__,__LINE__, g_Encoder->last_stable, state);
    
  •   if ((g_Encoder->last_stable + 1) % 4 == state)
      {
       foreward_dir++;
       back_dir = 0;
    
  •           encoder->dir = 1;
    
  •           g_Encoder->dir = 1;
      }
    
  •   else if (encoder->last_stable == (state + 1) % 4)
    
  •   else if (g_Encoder->last_stable == (state + 1) % 4)
      {
    
  •    foreward_dir=0;
    
  •    back_dir++;
    
  •           encoder->dir = -1;
    
  •    foreward_dir=0;        
    
  •    back_dir++;        
    
  •           g_Encoder->dir = -1;
      }
      else{
              goto out;
      }
    
  •   rotary_encoder_report_event(encoder);
    
  •   rotary_encoder_report_event(g_Encoder);
    

out:

  •   encoder->last_stable = state;
    
  •   mutex_unlock(&encoder->access_mutex);
    
  •   g_Encoder->last_stable = state;
    
  •   mutex_unlock(&g_Encoder->access_mutex);
    
  •   //enable_irq(g_Encoder->irq[0]);
    
  •   //enable_irq(g_Encoder->irq[1]);
    

+}
+
+static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
+{

  •   schedule_delayed_work(&g_Encoder->rotary_encoder_work, msecs_to_jiffies(0));
      return IRQ_HANDLED;
    

}

@@ -258,6 +267,8 @@ static int rotary_encoder_probe(struct platform_device *pdev)
unsigned int i;
int err;

  •   u32 ints[2] = {0};
    
  •   encoder = devm_kzalloc(dev, sizeof(struct rotary_encoder), GFP_KERNEL);
      if (!encoder)
              return -ENOMEM;
    

@@ -371,6 +382,7 @@ static int rotary_encoder_probe(struct platform_device *pdev)
encoder->irq[i], i);
return err;
}

  •           enable_irq_wake(encoder->irq[i]);
      }
    
      err = input_register_device(input);
    

@@ -382,6 +394,18 @@ static int rotary_encoder_probe(struct platform_device *pdev)
device_init_wakeup(dev,
device_property_read_bool(dev, “wakeup-source”));

  •   /*--------------------------------------------------------------------------------------------------------*/
    
  •   g_Encoder = encoder;
    
  •   err = device_property_read_u32(dev, "rotary-encoder-debounce",ints);
    
  •   if (!err)
    
  •           g_Encoder->rotenc_hwdeb = ints[1];
    
  •   g_Encoder->rotenc_swdeb = msecs_to_jiffies(10); //10ms
    
  •   INIT_DELAYED_WORK(&g_Encoder->rotary_encoder_work, rotary_encoder_delay_workcallback);
    
  •   /*--------------------------------------------------------------------------------------------------------*/
    
  •   platform_set_drvdata(pdev, encoder);
    
      dw_get_powerkey_en();//add
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值