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
版权声明:本文标题:2021-11-12 Android 11 长按按键进入恢复出厂设置的实现方法-PhoneWindowManager里面用发广播的模式 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1763787216a3270186.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论