当前位置: 首页 > news >正文

编写按键驱动以及在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 zhuangzb@UYFSanbu02:~/project/E800/rk3288-e810-android6.0$ 

 

相关文章:

  • sed工具
  • 【.Net边角料系列】1-单例模式(我真不是你想的那样)
  • 【CodeForces】713 C. Sonya and Problem Wihtout a Legend
  • Python处理CSV,Excel,PDF和图片
  • 如何保障研发质量不踩坑?阿里技术专家教你几招
  • 小型公司案例 -- 局域网故障排查
  • Future 模式简介
  • 【24】线程池
  • 内存优化问题
  • NPM测试模块之rewire教程
  • 解决PHP编译cURL的reinstall the libcurl问题
  • 关于selenium webdriver chromedriver下载的问题
  • php多进程实现
  • hihoCoder 1513 小Hi的烦恼
  • 生鲜电商大乱斗,谁生在了终点线?
  • 30秒的PHP代码片段(1)数组 - Array
  • chrome扩展demo1-小时钟
  • Docker入门(二) - Dockerfile
  • ECMAScript入门(七)--Module语法
  • Golang-长连接-状态推送
  • gops —— Go 程序诊断分析工具
  • Java比较器对数组,集合排序
  • JWT究竟是什么呢?
  • Making An Indicator With Pure CSS
  • mysql 数据库四种事务隔离级别
  • 前嗅ForeSpider教程:创建模板
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 7行Python代码的人脸识别
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #宝哥教你#查看jquery绑定的事件函数
  • (2015)JS ES6 必知的十个 特性
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (十八)三元表达式和列表解析
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)一些感悟
  • *Django中的Ajax 纯js的书写样式1
  • .Net - 类的介绍
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /run/containerd/containerd.sock connect: connection refused
  • @Resource和@Autowired的区别
  • [20161101]rman备份与数据文件变化7.txt
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [BJDCTF2020]The mystery of ip
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C++]STL之map
  • [CSS]CSS 字体属性
  • [HTML]HTML5实现可编辑表格