编写按键驱动以及在framework层上报按键事件
平台信息:
内核:linux3.10
系统:android6.0
平台:RK3288
前言:本文主要实现的功能是在android系统中添加一个按键,在驱动层使用定时器,每隔1秒钟向上层发送按键实现,framework层继续上报按键事件。
驱动的源码:
key.c
/*1. 头文件 */
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/backlight.h>
#include <linux/err.h>
#include <linux/pwm.h>
#include <linux/slab.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/timer.h> /*timer*/
#include <asm/uaccess.h> /*jiffies*/
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/input.h> struct input_dev *input = NULL; static struct timer_list timer1; void timer1_function(unsigned long arg)
{
printk("timer1_function\r\n"); mod_timer(&timer1,jiffies+HZ);
input_report_key(input, KEY_ZZB, );
input_sync(input);
input_report_key(input, KEY_ZZB, );
} static int key_event_probe(struct platform_device *pdev)
{
int ret = -;
struct device *dev = &pdev->dev;
char *str_temp; printk("----------%s---------\n",__func__); input = devm_input_allocate_device(dev);
if (!input){
ret = -ENOMEM;
return ret;
} input->name = "zzb-key"; /* pdev->name; */
input->phys = "zzb-key";
input->dev.parent = dev; input->id.bustype = BUS_HOST;
input->id.vendor = 0x0001;
input->id.product = 0x0001;
input->id.version = 0x0100; _set_bit(EV_KEY,input->keybit);
input_set_capability(input,EV_KEY,KEY_ZZB); ret = input_register_device(input);
if (ret){
printk("Error input_register_device\r\n");
ret = -ENOMEM;
goto err;
} init_timer(&timer1);
timer1.function = timer1_function;
add_timer(&timer1);
mod_timer(&timer1,jiffies+HZ); return ; err:
return ret; }
static int key_event_remove(struct platform_device *pdev)
{
printk("----------%s---------\n",__func__);
input_unregister_device(input);
del_timer(&timer1);
} static const struct of_device_id rk_printer_event_match[] = {
{ .compatible = "zzb,key", .data = NULL},
{},
}; static struct platform_driver key_device_driver = {
.probe = key_event_probe,
.remove = key_event_remove,
.driver = {
.name = "zzb,key",
.owner = THIS_MODULE,
.of_match_table = rk_printer_event_match,
}
}; module_platform_driver(key_device_driver); /*5.模块的许可声明*/
MODULE_LICENSE("GPL");
Makefile
ifeq ($(KERNELRELEASE),)
KERNELDIR ?=/home/zhuangzb/project/E800/rk3288-e810-android6./kernel #内核路径
PWD :=$(shell pwd) #当前路径 modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
#cp hello.ko /opt/fs210/filesystem/drivers/ -f
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~core *.ko *.mod.c .tmp_versions Module.symvers modules.order
else
obj-m :=key.o #生成hello.ko
endif
编译生成key.ko文件
装载驱动key.ko
驱动已经成功将键值上报上来了。
将键值在framework层上报。代码的改动如下:
diff --git a/device/rockchip/common/device.mk b/device/rockchip/common/device.mk
index d80f644..dc5c454
--- a/device/rockchip/common/device.mk
+++ b/device/rockchip/common/device.mk
@@ -, +, @@ PRODUCT_COPY_FILES += \
device/rockchip/common/media_profiles_default.xml:system/etc/media_profiles_default.xml \
device/rockchip/common/rk29-keypad.kl:system/usr/keylayout/rk29-keypad.kl \
device/rockchip/common/camera-input.kl:system/usr/keylayout/camera-input.kl \
+ device/rockchip/common/zzbkey-input.kl:system/usr/keylayout/zzbkey-input.kl \
device/rockchip/common/printer-event.kl:system/usr/keylayout/printer-event.kl \
device/rockchip/common/20050030_pwm.kl:system/usr/keylayout/20050030_pwm.kl \
device/rockchip/common/ff680000_pwm.kl:system/usr/keylayout/ff680000_pwm.kl \
diff --git a/frameworks/base/api/current.txt b/frameworks/base/api/current.txt
index 20e3b3e..313e909
--- a/frameworks/base/api/current.txt
+++ b/frameworks/base/api/current.txt
@@ -, +, @@ package android.view {
field public static final int KEYCODE_CALL = ; // 0x5
field public static final int KEYCODE_CAMERA = ; // 0x1b
field public static final int KEYCODE_CAMERA_ESD = ; // 0x127
+ field public static final int KEYCODE_ZZB_KEY = ; // 0x127
field public static final int KEYCODE_CAPS_LOCK = ; // 0x73
field public static final int KEYCODE_CAPTIONS = ; // 0xaf
field public static final int KEYCODE_CHANNEL_DOWN = ; // 0xa7
diff --git a/frameworks/base/api/system-current.txt b/frameworks/base/api/system-current.txt
index 6d939df..8b3a438
--- a/frameworks/base/api/system-current.txt
+++ b/frameworks/base/api/system-current.txt
@@ -, +, @@ package android.view {
field public static final int KEYCODE_CALL = ; // 0x5
field public static final int KEYCODE_CAMERA = ; // 0x1b
field public static final int KEYCODE_CAMERA_ESD = ; // 0x127
+ field public static final int KEYCODE_ZZB_KEY = ; // 0x127
field public static final int KEYCODE_CAPS_LOCK = ; // 0x73
field public static final int KEYCODE_CAPTIONS = ; // 0xaf
field public static final int KEYCODE_CHANNEL_DOWN = ; // 0xa7
diff --git a/frameworks/base/core/java/android/view/KeyEvent.java b/frameworks/base/core/java/android/view/KeyEvent.java
index 94f1e17..
--- a/frameworks/base/core/java/android/view/KeyEvent.java
+++ b/frameworks/base/core/java/android/view/KeyEvent.java
@@ -, +, @@ public class KeyEvent extends InputEvent implements Parcelable {
//$_rbox_$_modify_$ end public static final int KEYCODE_CAMERA_ESD = ;
+ public static final int KEYCODE_ZZB_KEY = ;
//private static final int LAST_KEYCODE = KEYCODE_CAMERA_ESD;
public static final int KEYCODE_PRN_COVEROPEN = ;
public static final int KEYCODE_PRN_COVERCLOSE = ;
@@ -, +, @@ public class KeyEvent extends InputEvent implements Parcelable {
case KeyEvent.KEYCODE_BRIGHTNESS_UP:
case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK:
case KeyEvent.KEYCODE_CAMERA_ESD:
+ case KeyEvent.KEYCODE_ZZB_KEY:
case KeyEvent.KEYCODE_PRN_COVEROPEN:
case KeyEvent.KEYCODE_PRN_COVERCLOSE:
case KeyEvent.KEYCODE_PRN_TEMPOUT:
diff --git a/frameworks/base/core/res/res/values/attrs.xml b/frameworks/base/core/res/res/values/attrs.xml
index 0a685e8..
--- a/frameworks/base/core/res/res/values/attrs.xml
+++ b/frameworks/base/core/res/res/values/attrs.xml
@@ -, +, @@ i
<enum name="KEYCODE_TV_MEDIA_PAUSE" value="" />
<!--$_rbox_$_modify_$_end-->
<enum name="KEYCODE_CAMERA_ESD" value="" />
+ <enum name="KEYCODE_ZZB_KEY" value="" />
<enum name="KEYCODE_PRN_COVEROPEN" value="" />
<enum name="KEYCODE_PRN_COVERCLOSE" value="" />
<enum name="KEYCODE_PRN_TEMPOUT" value="" />
diff --git a/frameworks/native/include/android/keycodes.h b/frameworks/native/include/android/keycodes.h
index 262de9f..5b5a3b5
--- a/frameworks/native/include/android/keycodes.h
+++ b/frameworks/native/include/android/keycodes.h
@@ -, +, @@ enum {
AKEYCODE_TV_KEYMOUSE_DOWN = ,
AKEYCODE_TV_KEYMOUSE_MODE_SWITCH = ,
AKEYCODE_CAMERA_ESD = ,
+ AKEYCODE_ZZB_KEY = ,
AKEYCODE_PRN_COVEROPEN = ,
AKEYCODE_PRN_COVERCLOSE = ,
AKEYCODE_PRN_TEMPOUT = ,
diff --git a/frameworks/native/include/input/InputEventLabels.h b/frameworks/native/include/input/InputEventLabels.h
index 8a47e31..0ce216b
--- a/frameworks/native/include/input/InputEventLabels.h
+++ b/frameworks/native/include/input/InputEventLabels.h
@@ -, +, @@ static const InputEventLabel KEYCODES[] = {
DEFINE_KEYCODE(TV_KEYMOUSE_DOWN),
DEFINE_KEYCODE(TV_KEYMOUSE_MODE_SWITCH),
DEFINE_KEYCODE(CAMERA_ESD),
+ DEFINE_KEYCODE(ZZB_KEY),
DEFINE_KEYCODE(HELP),
DEFINE_KEYCODE(NAVIGATE_PREVIOUS),
DEFINE_KEYCODE(NAVIGATE_NEXT),
zhuangzb@UYFSanbu02:~/project/E800/rk3288-e810-android6.$
编写按键驱动以及在framework层上报按键事件的更多相关文章
- input子系统学习笔记六 按键驱动实例分析下【转】
转自:http://blog.chinaunix.net/uid-20776117-id-3212095.html 本文接着input子系统学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例! i ...
- Linux驱动之按键驱动编写(中断方式)
在Linux驱动之按键驱动编写(查询方式)已经写了一个查询方式的按键驱动,但是查询方式太占用CPU,接下来利用中断方式编写一个驱动程序,使得CPU占有率降低,在按键空闲时调用read系统调用的进程可以 ...
- Linux驱动之按键驱动编写(查询方式)
在Linux驱动之LED驱动编写已经详细介绍了一个驱动的编写过程,接着来写一个按键驱动程序,主要是在file_operations结构中添加了一个read函数.还是分以下几步说明 1.查看原理图,确定 ...
- Android Framework层Power键关机流程(一,Power长按键操作处理)
一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...
- 13.Linux键盘按键驱动 (详解)
在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标: 实现键盘驱动,让开发板的4个按键代表键盘中的L.S.空格键.回车键 1.先来介 ...
- Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)
在Android 2.3(Gingerbread) 系统的时候,我写过一篇关于“Android 震动马达系统“的文章,当时的Linux内核还是2.6版本的.写那篇文章的目的,是想彻底的了解从硬件到驱动 ...
- ARM Linux 驱动Input子系统之按键驱动测试
上一篇已经谈过,在现内核的中引入设备树之后对于内核驱动的编写,主要集中在硬件接口的配置上了即xxxx.dts文件的编写. 在自己的开发板上移植按键驱动: 1.根据开发板的原理图 确定按键的硬件接口为: ...
- 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖
文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...
- Android源码剖析之Framework层升级版(窗口、系统启动)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...
随机推荐
- Careercup | Chapter 3
3.1 Describe how you could use a single array to implement three stacks. Flexible Divisions的方案,当某个栈满 ...
- CDOJ_24 八球胜负
8球是一种台球竞赛的规则.台面上有7个红球.7个黄球以及一个黑球,当然还有一个白球.对于本题,我们使用如下的简化规则:红.黄两名选手轮 流用白球击打各自颜色的球,如果将该颜色的7个球全部打进,则这名选 ...
- window下安装tensowflow
tensorflow0.12版本支持windows,但是需要python3.5.x.而我的本机只安装了Anaconda2.7版本.因此我们可以在Anaconda中新增Python3.5的环境. 首先, ...
- 【spring boot】在Spring mvc中controller中可以拿到对象信息,但是返回给前台却是什么也没有,解决方案
如图所示: 最后: 问题解决: 这个原因是因为,User类并未给字段提供get/set方法,所以给前台传递过去的值是空的. 解决方案: 为User类添lombok的注解@Data,为实体类提供get/ ...
- libevent和libev的区别对比
参考了这篇文章: http://www.cnblogs.com/Lifehacker/p/whats_the_difference_between_libevent_and_libev_chinese ...
- 转:android studio入门合集
http://blog.csdn.net/column/details/zsl-androidstudio.html
- Spring源代码由浅入深系列三 refresh
Spring中的refresh是一个相当重要的方法. 它完毕IOC的第一个阶段,将xml中的bean转化为beanDefinition.具体说明如上图所看到的. 在上图中,创建obtainFreshB ...
- [Hibernate开发之路](3)基础配置
一 JDBC链接 通常你希望SessionFactory来为你创建和缓存(pool)JDBC连接. 假设你採用这样的方式, 仅仅须要例如以下例所看到的那样,打开一个Session: Session s ...
- mysql insert into 时报1062错误
插入数据库时报1062错误,并没有错误详解 而网上的原因大多是主键重复,找了半天并没有解决办法 最后发现是表设置了联合唯一 ,插入的数据和之前的一样 >_< 太真实了
- WPF 的 MVVM
Model——View——ViewModel http://www.cnblogs.com/fdyang/p/3877309.html