您的位置:首页 > 移动开发 > Android开发

input 子系统开发

2016-06-05 21:31 459 查看

一、linux input 子系统

1、输入设备总类繁杂,包括按键,键盘,触摸屏,鼠标,摇杆等等,它们本身都是字符设备,不过内核为了能将这些设备的共性抽象出来,简化驱动的开发,建立了一个Input子系统

二、android 按键事件提交基本过程

1、android 系统在frameworks/base/services/input/  对input子系统进行监听处理。

2、在WindowManagerService 有input收集线程和input分发线程

3、当在linux input 的子系统当中所有的事件提交都会被收集线程收集到,然后有input分发线程发送到各个apk。

三、按键值查看

1、提交到上层的按键宏存在在kernel/include/ 目录下 uapi/linux/input.h 头文件

#define KEY_BACK                 158    
/* AC Back   */  //返回按键

#define KEY_VOLUMEDOWN     114  //音量减

#define KEY_VOLUMEUP            
115 //音量加

#define KEY_HOME                
102  //home 键


四、实现提交音量加事件给android 上层

1、驱动代码 event.c

#include <linux/module.h>

#include <linux/fs.h>

#include <linux/input.h>

#include <linux/delay.h>

#define REPORT_KEY      KEY_VOLUMEUP  //提交音量加按键宏

static struct input_dev *input_device;

//提交按键函数 

static void report_key(unsigned int keyvalue)

{

        input_report_key(input_device, keyvalue, 1);  //提交按下操作

        input_sync(input_device);

        input_report_key(input_device, keyvalue, 0);  //提交弹起操作 (音量加减键为虚拟按键,需要同时提交按下和弹起操作)

        input_sync(input_device);                                 //同步提交完毕

}

static int input_device_open(struct input_dev *dev)

{

        printk("input_device_open \n");

        return 0;

}

static void input_device_close(struct input_dev *dev)

{

        printk("input_device_close \n");

}

static int __init Input_init(void)

{

        int err = 0;

        input_device = input_allocate_device();

        if (!input_device) {

                printk("input_allocate_device failed \n");

                return -1;

        }

        set_bit(EV_KEY, input_device->evbit);   //设置文件按键事件

        set_bit(REPORT_KEY, input_device->keybit);  //设置可以重复提交多次

        clear_bit(0, input_device->keybit);                

        input_device->open = input_device_open;

        input_device->close = input_device_close;
/*注册到input 子系统当中*/

        if(input_register_device(input_device))

        {

                printk(KERN_ERR " Failed to input_register_device\n");

                return -1;

        }

        printk("Input system init ok ...... \n");

        mdelay(10);

        report_key(REPORT_KEY);

        return 0;

}

static void __exit  Input_exit(void)

{

        input_unregister_device(input_device);

        input_free_device(input_device);

        printk("Input system exit ok ...... \n");

}

module_init(Input_init);

module_exit(Input_exit);

MODULE_LICENSE("Dual BSD/GPL");

2、Makefile 文件

CONFIG_CHARDEV ?=m

obj-$(CONFIG_CHARDEV) +=event.o

KERN_DIR =/home/rk3128/rk3128_v4/rk3128_4.4_tb01_new_v3/kernel/

modules:

        $(MAKE) -C $(KERN_DIR) M=$(PWD) modules

clean:

        rm -rf  chartest *.o *~core .depend. *.cmd *.ko *.mod.c .tmp_versions

3、将驱动安装

insmod event.ko 

可以看到android 界面当中弹出音量加操作,和我们按下手机音量加操作是一样的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android input子系统