平台信息:
内核: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. Object 转 String

    做项目中 : map 为Map<String,Object> a.setmoney(new BigDecimal((String)map.get("money"))); ...

  2. 详解Java中的字符串

    字符串常量池详解 在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的. 当你知道字符串的初始化细节后, 再去写String s = "hello"或String s ...

  3. 采集网站特殊文件Meta信息

    采集网站特殊文件Meta信息   元(Meta)信息是描述文件的属性的特殊信息,如文件的所有者.联系方式.机构名.邮件地址等信息.而网站中常常会有共享的文档文件,如PDF.Excel.Word.这些文 ...

  4. 某考试 T3 Try to find out the wrong in the test

    Discription Hint: 对于 100% 的数据, n<=10^6.

  5. android 根据图片名字获取图片id

    public int getResource(String imageName){ Context ctx=getBaseContext(); int resId = getResources().g ...

  6. Android:MVC模式(下)

    在上一篇文章中,我们将 View 类单独出来并完成了设计和编写.这次我们将完成 Model 类,并通过 Controller 将两者连接起来,完成这个计算器程序. 模型(Model)就是程序中封装了数 ...

  7. hadoop安全之hftp

    hftp默认是打开的,同意以浏览器的方式訪问和下载文件,以此方式下,能够读取全部文件,留下了安全隐患. 測试例如以下 /user/hive/warehouse/cdntest.db/selfreado ...

  8. Convert Sorted List to Binary Search Tree——将链表转换为平衡二叉搜索树 &&convert-sorted-array-to-binary-search-tree——将数列转换为bst

    Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in as ...

  9. mvc用UpdateModel报错

    项目中使用UpdateModel时报错:未能更新类型“XXXXXX”的模型. 原因如下:表单Post时,有的参数为空,如a=1&b=2&=3.

  10. 转:DDR原理详解

    首先,我们先了解一下内存的大体结构工作流程,这样会比较容量理解这些参数在其中所起到的作用.这部分的讲述运用DDR3的简化时序图. DDR3的内部是一个存储阵列,将数据“填”进去,你可以它想象成一张表格 ...