— 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