编写按键驱动以及在framework层上报按键事件

平台信息:
内核:linux3.10 
系统:android6.0
平台:RK3288

前言:本文主要实现的功能是在android系统中添加一个按键,在驱动层使用定时器,每隔1秒钟向上层发送按键实现,framework层继续上报按键事件。

驱动的源码:

key.c

  1 /*1. 头文件 */
  2 #include <linux/module.h>
  3 #include <linux/kernel.h>
  4 #include <linux/init.h>
  5 #include <linux/platform_device.h>
  6 #include <linux/fb.h>
  7 #include <linux/backlight.h>
  8 #include <linux/err.h>
  9 #include <linux/pwm.h>
 10 #include <linux/slab.h>
 11 #include <linux/miscdevice.h>
 12 #include <linux/delay.h>
 13 #include <linux/gpio.h>
 14 #include <linux/timer.h>  /*timer*/
 15 #include <asm/uaccess.h>  /*jiffies*/
 16 #include <linux/delay.h>
 17 #include <linux/interrupt.h>
 18 #include <linux/workqueue.h>
 19 #include <linux/input.h>
 20
 21 struct input_dev *input = NULL;
 22
 23 static struct timer_list timer1;
 24
 25 void timer1_function(unsigned long arg)
 26 {
 27     printk("timer1_function\r\n");
 28
 29     mod_timer(&timer1,jiffies+HZ);
 30     input_report_key(input, KEY_ZZB, 1);
 31     input_sync(input);
 32     input_report_key(input, KEY_ZZB, 0);
 33 }
 34
 35
 36
 37 static int key_event_probe(struct platform_device *pdev)
 38 {
 39     int ret = -1;
 40     struct device *dev = &pdev->dev;
 41     char *str_temp;
 42
 43     printk("----------%s---------\n",__func__);
 44
 45     input = devm_input_allocate_device(dev);
 46     if (!input){
 47         ret = -ENOMEM;
 48         return ret;
 49     }
 50
 51     input->name = "zzb-key";    /* pdev->name; */
 52     input->phys = "zzb-key";
 53     input->dev.parent = dev;
 54
 55     input->id.bustype = BUS_HOST;
 56     input->id.vendor = 0x0001;
 57     input->id.product = 0x0001;
 58     input->id.version = 0x0100;
 59
 60     _set_bit(EV_KEY,input->keybit);
 61     input_set_capability(input,EV_KEY,KEY_ZZB);
 62
 63     ret = input_register_device(input);
 64     if (ret){
 65         printk("Error input_register_device\r\n");
 66         ret = -ENOMEM;
 67         goto err;
 68     }
 69
 70     init_timer(&timer1);
 71     timer1.function = timer1_function;
 72     add_timer(&timer1);
 73     mod_timer(&timer1,jiffies+HZ);
 74
 75     return 0;
 76
 77 err:
 78     return ret;
 79
 80 }
 81 static int key_event_remove(struct platform_device *pdev)
 82 {
 83     printk("----------%s---------\n",__func__);
 84     input_unregister_device(input);
 85     del_timer(&timer1);
 86 }
 87
 88
 89 static const struct of_device_id rk_printer_event_match[] = {
 90     { .compatible = "zzb,key", .data = NULL},
 91     {},
 92 };
 93
 94
 95 static struct platform_driver key_device_driver = {
 96     .probe        = key_event_probe,
 97     .remove        = key_event_remove,
 98     .driver        = {
 99         .name    = "zzb,key",
100         .owner    = THIS_MODULE,
101         .of_match_table = rk_printer_event_match,
102     }
103 };
104
105
106 module_platform_driver(key_device_driver);
107
108 /*5.模块的许可声明*/
109 MODULE_LICENSE("GPL");

Makefile

 1 ifeq ($(KERNELRELEASE),)
 2 KERNELDIR ?=/home/zhuangzb/project/E800/rk3288-e810-android6.0/kernel #内核路径
 3 PWD :=$(shell pwd)   #当前路径
 4
 5 modules:
 6     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
 7     #cp hello.ko /opt/fs210/filesystem/drivers/ -f
 8 modules_install:
 9     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
10 clean:
11     rm -rf *.o *~core *.ko *.mod.c .tmp_versions Module.symvers modules.order
12 else
13         obj-m :=key.o        #生成hello.ko
14 endif

编译生成key.ko文件

装载驱动key.ko

 

驱动已经成功将键值上报上来了。

将键值在framework层上报。代码的改动如下:

 1 diff --git a/device/rockchip/common/device.mk b/device/rockchip/common/device.mk
 2 index d80f644..dc5c454 100755
 3 --- a/device/rockchip/common/device.mk
 4 +++ b/device/rockchip/common/device.mk
 5 @@ -88,6 +88,7 @@ PRODUCT_COPY_FILES +=  6      device/rockchip/common/media_profiles_default.xml:system/etc/media_profiles_default.xml  7      device/rockchip/common/rk29-keypad.kl:system/usr/keylayout/rk29-keypad.kl  8      device/rockchip/common/camera-input.kl:system/usr/keylayout/camera-input.kl  9 +    device/rockchip/common/zzbkey-input.kl:system/usr/keylayout/zzbkey-input.kl 10      device/rockchip/common/printer-event.kl:system/usr/keylayout/printer-event.kl 11      device/rockchip/common/20050030_pwm.kl:system/usr/keylayout/20050030_pwm.kl 12      device/rockchip/common/ff680000_pwm.kl:system/usr/keylayout/ff680000_pwm.kl 13 diff --git a/frameworks/base/api/current.txt b/frameworks/base/api/current.txt
14 index 20e3b3e..313e909 100755
15 --- a/frameworks/base/api/current.txt
16 +++ b/frameworks/base/api/current.txt
17 @@ -35217,6 +35217,7 @@ package android.view {
18      field public static final int KEYCODE_CALL = 5; // 0x5
19      field public static final int KEYCODE_CAMERA = 27; // 0x1b
20      field public static final int KEYCODE_CAMERA_ESD = 295; // 0x127
21 +    field public static final int KEYCODE_ZZB_KEY = 512; // 0x127
22      field public static final int KEYCODE_CAPS_LOCK = 115; // 0x73
23      field public static final int KEYCODE_CAPTIONS = 175; // 0xaf
24      field public static final int KEYCODE_CHANNEL_DOWN = 167; // 0xa7
25 diff --git a/frameworks/base/api/system-current.txt b/frameworks/base/api/system-current.txt
26 index 6d939df..8b3a438 100755
27 --- a/frameworks/base/api/system-current.txt
28 +++ b/frameworks/base/api/system-current.txt
29 @@ -37509,6 +37509,7 @@ package android.view {
30      field public static final int KEYCODE_CALL = 5; // 0x5
31      field public static final int KEYCODE_CAMERA = 27; // 0x1b
32      field public static final int KEYCODE_CAMERA_ESD = 295; // 0x127
33 +    field public static final int KEYCODE_ZZB_KEY = 512; // 0x127
34      field public static final int KEYCODE_CAPS_LOCK = 115; // 0x73
35      field public static final int KEYCODE_CAPTIONS = 175; // 0xaf
36      field public static final int KEYCODE_CHANNEL_DOWN = 167; // 0xa7
37 diff --git a/frameworks/base/core/java/android/view/KeyEvent.java b/frameworks/base/core/java/android/view/KeyEvent.java
38 index 94f1e17..9689448 100755
39 --- a/frameworks/base/core/java/android/view/KeyEvent.java
40 +++ b/frameworks/base/core/java/android/view/KeyEvent.java
41 @@ -798,6 +798,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
42  //$_rbox_$_modify_$ end
43
44      public static final int KEYCODE_CAMERA_ESD = 295;
45 +    public static final int KEYCODE_ZZB_KEY = 512;
46      //private static final int LAST_KEYCODE = KEYCODE_CAMERA_ESD;
47    public static final int KEYCODE_PRN_COVEROPEN = 497;
48         public static final int KEYCODE_PRN_COVERCLOSE = 498;
49 @@ -1853,6 +1854,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
50              case KeyEvent.KEYCODE_BRIGHTNESS_UP:
51              case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK:
52              case KeyEvent.KEYCODE_CAMERA_ESD:
53 +            case KeyEvent.KEYCODE_ZZB_KEY:
54        case KeyEvent.KEYCODE_PRN_COVEROPEN:
55                         case KeyEvent.KEYCODE_PRN_COVERCLOSE:
56                         case KeyEvent.KEYCODE_PRN_TEMPOUT:
57 diff --git a/frameworks/base/core/res/res/values/attrs.xml b/frameworks/base/core/res/res/values/attrs.xml
58 index 0a685e8..4709151 100755
59 --- a/frameworks/base/core/res/res/values/attrs.xml
60 +++ b/frameworks/base/core/res/res/values/attrs.xml
61 @@ -1829,6 +1829,7 @@ i
62          <enum name="KEYCODE_TV_MEDIA_PAUSE" value="294" />
63  <!--$_rbox_$_modify_$_end-->
64          <enum name="KEYCODE_CAMERA_ESD" value="295" />
65 +        <enum name="KEYCODE_ZZB_KEY" value="512" />
66          <enum name="KEYCODE_PRN_COVEROPEN" value="497" />
67          <enum name="KEYCODE_PRN_COVERCLOSE" value="498" />
68          <enum name="KEYCODE_PRN_TEMPOUT" value="499" />
69 diff --git a/frameworks/native/include/android/keycodes.h b/frameworks/native/include/android/keycodes.h
70 index 262de9f..5b5a3b5 100755
71 --- a/frameworks/native/include/android/keycodes.h
72 +++ b/frameworks/native/include/android/keycodes.h
73 @@ -730,6 +730,7 @@ enum {
74      AKEYCODE_TV_KEYMOUSE_DOWN = 283,
75      AKEYCODE_TV_KEYMOUSE_MODE_SWITCH = 284,
76      AKEYCODE_CAMERA_ESD = 295,
77 +    AKEYCODE_ZZB_KEY = 512,
78         AKEYCODE_PRN_COVEROPEN    = 497,
79      AKEYCODE_PRN_COVERCLOSE   = 498,
80      AKEYCODE_PRN_TEMPOUT   = 499,
81 diff --git a/frameworks/native/include/input/InputEventLabels.h b/frameworks/native/include/input/InputEventLabels.h
82 index 8a47e31..0ce216b 100755
83 --- a/frameworks/native/include/input/InputEventLabels.h
84 +++ b/frameworks/native/include/input/InputEventLabels.h
85 @@ -304,6 +304,7 @@ static const InputEventLabel KEYCODES[] = {
86      DEFINE_KEYCODE(TV_KEYMOUSE_DOWN),
87      DEFINE_KEYCODE(TV_KEYMOUSE_MODE_SWITCH),
88      DEFINE_KEYCODE(CAMERA_ESD),
89 +    DEFINE_KEYCODE(ZZB_KEY),
90      DEFINE_KEYCODE(HELP),
91      DEFINE_KEYCODE(NAVIGATE_PREVIOUS),
92      DEFINE_KEYCODE(NAVIGATE_NEXT),
93 [email protected]:~/project/E800/rk3288-e810-android6.0$ 

原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8297625.html

时间: 2024-11-11 21:43:44

编写按键驱动以及在framework层上报按键事件的相关文章

11.按键驱动之定时器防抖(详解)

本节目标: 通过定时器来防止按键抖动,测试程序是使用上节的:阻塞操作的测试程序 1.如下图所示,在没有定时器防抖情况下,按键没有稳定之前会多次进入中断,使得输出多个相同信息出来 2.按键波形图,如下所示: 3.如何消去按键抖动 通过定时器延时10ms,然后每当按键进入中断时就更新定时器延时10ms,若延时10ms到了说明已经过了抖动范围,然后再打印按键电平信息 4.定时器结构体和函数介绍 我们先来看看两个全局变量: jiffies: 是系统时钟,全局变量,默认每隔10ms加1 HZ:是每S的频率

Android Framework层Power键关机流程(一,Power长按键操作处理)

一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManager开始分析,在分析前我这里打印了该方法的堆栈调用信息.大家可以参考一下. public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) { ...... android.uti

ARM Linux 驱动Input子系统之按键驱动测试

上一篇已经谈过,在现内核的中引入设备树之后对于内核驱动的编写,主要集中在硬件接口的配置上了即xxxx.dts文件的编写. 在自己的开发板上移植按键驱动: 1.根据开发板的原理图 确定按键的硬件接口为:GPIO2_2.GPIO2_3.GPIO2_5.GPIO0_30. 修改dts文件使其与原理图的按键接口一致. gpio_buttons: [email protected]0 { compatible = "gpio-keys"; #address-cells = <1>;

13.Linux键盘按键驱动 (详解)

版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标: 实现键盘驱动,让开发板的4个按键代表键盘中的L.S.空格键.回车键 1.先来介绍以下几个结构体使用和函数,下面代码中会用到 1)input_dev驱动设备结构体中常用成员如下: struct input_dev { void *private; const char *name; //设备名字 const char *ph

OSAL之按键驱动

本博文根据协议栈1.3.2,尊重原创,注明出处,欢迎转载 学习按键驱动的主要有两大块: 第一:按键引脚设置: 第二:按键事件的触发检测与轮询,以及按键消息的发送 先说明第一大块,按键引脚设置, 超出cc2540片子从机的按键两个按键,按键是共地.所以它的触发方式是下降沿触发按键中断,同时程序对按键按下这个动作检测是中断方式检测,一旦有按键按下,触发一个按键轮询函数执行,同时把对按键的检测方式换成轮询模式.所以对按键引脚设置的内容也就出来了.主要一下几个方面: 1.设置按键映射到的物理引脚GPIO

入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖

文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键,打印键值: 目录 概要 poll机制 异步通知 同步互斥阻塞 定时器防抖 概要: 查询方式: 12-3 缺点:占用CPU99%的资源.中断方式:12-4 缺点:调用read函数后如果没有按键按下,该函数永远不会结束,一直在等待按键按下. 优点:使用到了休眠机制,占用cpu资源极少.poll机制: 1

第三十四天:按键驱动与蜂鸣器驱动以及MMU

编写按键驱动的过程和编写LED灯的驱动类似.区别在于按键是在底板上的.要从底板的电路图开始看.   使用key为关键字查找电路图: 可以得知的信息:按键松开时候XEINT26为高电平.按下时候为底电平.所以要判断按键是否被按下,就要检测XEINT26的状态. 使用XEINT26为关键字,在核心板上查看其定义.找到下图: XEINT26在核心板上链接到GPX3_2上.然后就是去datasheet中查找GPX3_2的说明了. 按键为检测,GPX3CON置0,GPX3DAT置1,表示按键被按下.代码如

Android源码剖析之Framework层基础版

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMangerService和ActivityManagerService(注意非控件,而是指一类服务)以及其他一些东西,对底层做一个更为全面的认识.而很早以前,写过一篇文章,来简述Android系统-" Android高级之系统介绍 ",同样今天我们在讲Framework层时也会再对系统做一个回顾

Linux嵌入式学习-烟雾传感器驱动-字符设备驱动-按键驱动

MQ-2烟雾气敏传感器模块在X210v3开发板上的驱动. 现在需要一个MQ-2烟雾气敏传感器模块的驱动.其检测烟雾超过一定的标准后,会返回一个不同的电平,和按键驱动差不多. 但是在编写驱动的时候,需要用GPH2_3号引脚.但是在内核中先ioremap地址然后配置,发现无法控制gpio,也无法进入中断. 后来发现,如果需要使用gpio,需要先申请,然后才能使用. 具体程序如下: #include <linux/module.h> #include <linux/init.h> #in