admin 管理员组

文章数量: 1184232

一、kernel部分主要发按键信息到android上层。

diff --git a/kernel/drivers/misc/key/reset_key.c b/kernel-4.14/drivers/misc/key/reset_key.c
index 127319a29fa..8d954fc28c5 100755
--- a/kernel/drivers/misc/key/reset_key.c
+++ b/kernel/drivers/misc/key/reset_key.c
@@ -12,12 +12,14 @@
 #include <linux/jiffies.h>
 #include <linux/reset.h>
 #include <linux/reboot.h>
-
+#include <linux/input.h>
+#include <linux/miscdevice.h>
 struct reset_key {
     struct device_node *nd;
     int reset_gpio;
     unsigned int irq;
     struct delayed_work rest_work;
+    struct input_dev *reset_key_dev ;
 };
 
 struct reset_key key;
@@ -28,39 +30,53 @@ struct file_operations reset_key_fops = {
 
 struct miscdevice reset_key_misc = {
     .minor = MISC_DYNAMIC_MINOR,
-	.name = "reset_key",
-	.fops = &reset_key_fops,
+   .name = "reset_key",
+   .fops = &reset_key_fops,
 };
 
 void rest_work_func(struct work_struct *work)
 {
     
-    int value = 0;
-
+    int value = 0 ;
+    static int key_is_down = 0;
+	disable_irq(key.irq);
     value = gpio_get_value(key.reset_gpio);
-    printk("[%s] value = %d\n",__func__,value);
+    printk(" [%s] value = %d  irq=%d\n",__func__,value,key.irq);
     if(1 == value)
     {
         // orderly_reboot();
-        kernel_restart(NULL);
+       // kernel_restart(NULL);
         // 重置
         // reset_control_reset(struct reset_control *rstc);
-        irq_set_irq_type(key.irq,IRQF_TRIGGER_FALLING);
+     //   test_temp = irq_set_irq_type(key.irq,IRQ_TYPE_LEVEL_LOW);
+	if(key_is_down){
+	input_report_key(key.reset_key_dev, KEY_F10, 0);
+	input_sync(key.reset_key_dev);	
+	}
+	key_is_down = 0;
         printk("[%s] if value = %d\n",__func__,value);
     }
     else
     {
         // orderly_reboot();
-        irq_set_irq_type(key.irq,IRQF_TRIGGER_RISING);
+      //   test_temp = irq_set_irq_type(key.irq,IRQ_TYPE_LEVEL_HIGH);
+	if(key_is_down == 0){
+	input_report_key(key.reset_key_dev, KEY_F10, 1);
+	input_sync(key.reset_key_dev);
+	key_is_down = 1;
+	}
+	
         printk("[%s] else value = %d\n",__func__,value);
     }
+	enable_irq(key.irq);
     //  orderly_reboot();
 }
 
 irqreturn_t reset_key_irq_handler(int data, void *arg)
 {
     
-    schedule_delayed_work(&key.rest_work,msecs_to_jiffies(20));
+    schedule_delayed_work(&key.rest_work, msecs_to_jiffies(50));
+   
     // schedule_work  结构体名不一样
     return IRQ_HANDLED;
 }
@@ -93,14 +109,15 @@ int reset_key_probe(struct platform_device *dev)
         printk("gpio_request failed\n");
         return -1;
     }
-
+gpio_direction_input(key.reset_gpio);
     // INIT_WORK(&key.rest_work,rest_work_func);
     INIT_DELAYED_WORK(&key.rest_work,rest_work_func);
 
     //中断注册 中断下文用工作队列
     key.irq = irq_of_parse_and_map(key.nd,0);
-    ret = request_irq(key.irq,reset_key_irq_handler,IRQF_TRIGGER_FALLING,
+    ret = request_irq(key.irq,reset_key_irq_handler,IRQ_TYPE_EDGE_BOTH,
 	     "reset_key_irq", NULL);
+	//gpio_set_debounce(key.reset_gpio, 10 * 1000);
     if(ret < 0)
     {
         printk("request_irq failed\n");
@@ -115,6 +132,14 @@ int reset_key_probe(struct platform_device *dev)
         printk("misc_register failed\n");
         return -1;
     }
+	key.reset_key_dev = input_allocate_device();	
+	key.reset_key_dev->name = "reset-key";
+	__set_bit(EV_KEY, key.reset_key_dev-&

本文标签: 按键 模式 方法 PhoneWindowManager Android