平台信息:
内核: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层上报按键事件的更多相关文章

  1. input子系统学习笔记六 按键驱动实例分析下【转】

    转自:http://blog.chinaunix.net/uid-20776117-id-3212095.html 本文接着input子系统学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例! i ...

  2. Linux驱动之按键驱动编写(中断方式)

    在Linux驱动之按键驱动编写(查询方式)已经写了一个查询方式的按键驱动,但是查询方式太占用CPU,接下来利用中断方式编写一个驱动程序,使得CPU占有率降低,在按键空闲时调用read系统调用的进程可以 ...

  3. Linux驱动之按键驱动编写(查询方式)

    在Linux驱动之LED驱动编写已经详细介绍了一个驱动的编写过程,接着来写一个按键驱动程序,主要是在file_operations结构中添加了一个read函数.还是分以下几步说明 1.查看原理图,确定 ...

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

    一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...

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

    在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标: 实现键盘驱动,让开发板的4个按键代表键盘中的L.S.空格键.回车键 1.先来介 ...

  6. Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> Application)

    在Android 2.3(Gingerbread) 系统的时候,我写过一篇关于“Android 震动马达系统“的文章,当时的Linux内核还是2.6版本的.写那篇文章的目的,是想彻底的了解从硬件到驱动 ...

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

    上一篇已经谈过,在现内核的中引入设备树之后对于内核驱动的编写,主要集中在硬件接口的配置上了即xxxx.dts文件的编写. 在自己的开发板上移植按键驱动: 1.根据开发板的原理图 确定按键的硬件接口为: ...

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

    文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...

  9. Android源码剖析之Framework层升级版(窗口、系统启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...

随机推荐

  1. Codeforces Gym101606 A.Alien Sunset (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017) 寒假第一次组队训练赛,和学长一起训练,题目难度是3颗星,我和猪队友写 ...

  2. 虚拟机centos 同一个tomcat、不同端口访问不同的项目

    在tomcat中复制webapps目录,并重命名:

  3. 洛谷—— P1577 切绳子

    https://www.luogu.org/problemnew/show/P1577 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长? ...

  4. 洛谷—— P1407 工资

    https://www.luogu.org/problemnew/show/P1407 题目描述 有一家世界级大企业,他们经过调查,发现了一个奇特的现象,竟然在自己的公司里,有超过一半的雇员,他们的工 ...

  5. 转载:P2P技术原理及应用(1)

    转帖allen303allen的空间 作 者:金海 廖小飞 摘要:对等网络(P2P)有3种主要的组织结构:分布式哈希表(DHT)结构.树形结构.网状结构.P2P技术已 经延伸到几乎所有的网络应用领域, ...

  6. [java基础] 001 - 记一次堆栈溢出异常(StackOverFlowError)

    上午经理发来一个任务,解决某个接口异常,此接口第一次调用成功返回: {ret=Y, orderResultList=[{itemno=31920190521083622032, sub_msg=成功, ...

  7. Akka简介与Actor模型

    Akka是一个构建在JVM上,基于Actor模型的的并发框架,为构建伸缩性强,有弹性的响应式并发应用提高更好的平台.本文主要是个人对Akka的学习和应用中的一些理解. Actor模型 Akka的核心就 ...

  8. Android---简单的动画

  9. 织梦dedecms 去掉后台登陆验证码的方法

    那么有什么办法解决呢? 那么现在就给大家解决织梦去掉后台登陆验证码.   这里面分两种版本 一个是织梦5.6的程序 那么织梦5.6程序的解决办法是: 在织梦DedeCms5.6版本可以通过下面路径对验 ...

  10. flask的restful api模块flask_restful和认证模块flask_httpauth

    参考: 1.https://zhuanlan.zhihu.com/p/24629177 2.https://github.com/shengulong/LearnPython/blob/master/ ...