Android系统--输入系统(六)模拟输入驱动程序

1. 回顾输入子系统

  • 简单字符设备驱动:应用程序通过调用驱动所实现的函数使能硬件。

  • 输入子系统:由于有多个应用程序使用输入子系统,故肯定使用的是早已规定好驱动接口,我们所需要实现的这是实现硬件相关的操作。

2. 输入子系统特性

  • 有多套open/read/write接口

  • 当应用程序调用这些接口,驱动程序将提供多套实现方法

    • evdev.c(evdev_open/evdev_read/evdev_write),通过这些接口提供原始数据

    • keyboard.c、mousedev.c,得到的是一些加工之后的数据

3. Android的输入系统特性

  • Android系统只使用evdev.c,只处理原始数据

  • 内核具有多个接口,应用程序则通过不同的设备节点,来使用特定节点的驱动接口

  • 硬件相关:根据硬件的状态上报数据(原始数据),我们一般只需要实现该功能

  • 硬件

4. 如何实现Input驱动

  1. 分配/构造:input_device结构体

  2. 注册:input_register_device

  3. 有输入事件产生时,中断程序上报:input_event(dev,type,code,value)

5. 具体输入流程框架

  • APP层

    • 4、 应用程序open /dev/input/event

    • 6、 应用程序read

  • 驱动层(evdev.c)

    • 3、 connect函数被调用:生成一些信息,导致创建设备节点/dev/input/event

    • 5、 evdev_open被调用:根据设备节点与 input_device结构体建立联系

    • 7、 evdev_read被调用:无数据,则休眠

    • 12、evde_read被唤醒,有数据,开始读取数据

  • 硬件相关的驱动层

    • 1、 构造input_device结构体

    • 2、 注册该结构体:input_register_device

    • 9、 中断服务程序被掉用:input_event产生数据,上报数据

    • 10、 放入evdev的buffer

    • 11、 唤醒读进程

  • 硬件层

    • 8、用户按下按键,产生中断

6. 忽略复杂的硬件操作,模拟输入系统的驱动程序

6.1 实现原理

通过另外一个应用程序,打开设备节点,写数据,唤醒读进程。

  • APP open节点

  • 写数据(使用Android系统中有sendevent函数)

6.2 驱动实现

  1. 分配input_device结构

  2. 设置该结构体

  3. 注册该结构体

6.3 具体实现程序

InputEmulator.c

  1. /* 参考drivers\input\keyboard\gpio_keys.c */
  2. #include <linux/module.h>
  3. #include <linux/version.h>
  4. #include <linux/init.h>
  5. #include <linux/fs.h>
  6. #include <linux/input.h>
  7. static struct input_dev *input_emulator_dev;
  8. static int input_emulator_init(void)
  9. {
  10. int i;
  11. /* 1. 分配一个input_dev结构体 */
  12. input_emulator_dev = input_allocate_device();;
  13. /* 2. 设置 */
  14. /* 2.1 能产生哪类事件 */
  15. set_bit(EV_KEY, input_emulator_dev->evbit); //产生按键类似键
  16. set_bit(EV_REP, input_emulator_dev->evbit); //重复上报事件
  17. /* 2.2 能产生所有类型的按键*/
  18. for(i=0;i<BITS_TO_LONGS(KEY_CNT);i++)
  19. input_emulator_dev->keybit[i] = ~0UL;
  20. /*2.3 为Android构建一些设备信息*/
  21. input_emulator_dev->name = "InputEmulatorFromLKQ";
  22. input_emulator_dev->id.bustype = 1;
  23. input_emulator_dev->id.vendor = 0x1234;
  24. input_emulator_dev->id.product=0x5678;
  25. input_emulator_dev->id.version=1;
  26. /* 3. 注册 */
  27. input_register_device(input_emulator_dev);
  28. return 0;
  29. }
  30. static void input_emulator_exit(void)
  31. {
  32. input_unregister_device(input_emulator_dev);
  33. input_free_device(input_emulator_dev);
  34. }
  35. module_init(input_emulator_init);
  36. module_exit(input_emulator_exit);
  37. MODULE_LICENSE("GPL");
Makefile

  1. KERN_DIR = /opt/Tiny4412/KernelSrc/linux-3.0.86
  2. all:
  3. make -C $(KERN_DIR) M=`pwd` modules
  4. clean:
  5. make -C $(KERN_DIR) M=`pwd` modules clean
  6. rm -rf modules.order
  7. obj-m += InputEmulator.o

6.4测试方法

  • insmod InputEmulator.ko

  • 打开开发板任意一个文本输入框

  • 串口输入:

    sendevent /dev/input/event5 1 2 1 // 1 2 1 : EV_KEY, KEY_1, down

    sendevent /dev/input/event5 1 2 0 // 1 2 0 : EV_KEY, KEY_1, up

    sendevent /dev/input/event5 0 0 0 // sync

  • 串口输入:

    sendevent /dev/input/event5 1 3 1

    sendevent /dev/input/event5 1 3 0

    sendevent /dev/input/event5 0 0 0

6.5 实验现象

开发板文本输入框出现1和2两个字符

Android系统--输入系统(六)模拟输入驱动程序的更多相关文章

  1. Android系统--输入系统(十六)APP跟输入系统建立联系_InputChannel和Connection

    Android系统--输入系统(十六)APP跟输入系统建立联系_InputChannel和Connection 0. 核心:socketpair机制 1. 回顾Dispatch处理过程: 1.1 放入 ...

  2. Android系统--输入系统(八)Reader线程_使用EventHub读取事件

    Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...

  3. Android系统--输入系统(九)Reader线程_核心类及配置文件

    Android系统--输入系统(九)Reader线程_核心类及配置文件 1. Reader线程核心类--EventHub 1.1 Reader线程核心结构体 实例化对象:mEventHub--表示多个 ...

  4. Android系统--输入系统(十一)Reader线程_简单处理

    Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...

  5. Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件

    Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件 1. 输入按键 我们知道Android系统的按键分为三类:(1)Global Key;(2)Syste ...

  6. Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理

    Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理 1. 回顾 我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理 ...

  7. Android系统--输入系统(十五)实战_使用GlobalKey一键启动程序

    Android系统--输入系统(十五)实战_使用GlobalKey一键启动程序 1. 一键启动的过程 1.1 对于global key, 系统会根据global_keys.xml发送消息给某个组件 & ...

  8. Android系统--输入系统(五)输入系统框架

    Android系统--输入系统(五)输入系统框架 1. Android设备使用场景: 假设一个Android平板,APP功能.系统功能(开机关机.调节音量).外接设备功能(键盘.触摸屏.USB外接键盘 ...

  9. Android系统--输入系统(七)Reader_Dispatcher线程启动分析

    Android系统--输入系统(七)Reader_Dispatcher线程启动分析 1. Reader/Dispatcher的引入 对于输入系统来说,将会创建两个线程: Reader线程(读取事件) ...

随机推荐

  1. Eclipse插件的各种安装方法

    这篇文章我们总结下安装Eclipse的各种方法,首先一下的步骤都是在版本为“Kepler Service Release 1”的Eclipse下完成的.如果你的Eclipse版本不是"Kep ...

  2. 我在ubuntu桌面系统下进行WEB开发常用的软件

    公司电脑本来是win系统的,不知道怎么突然中毒了,由于比较讨厌杀毒软件,所以之前都被我卸载掉了,所以我干脆重装了一个ubuntu系统 1.IDE    vscode 各种插件,自带Git,markdo ...

  3. 1934: [Shoi2007]Vote 善意的投票

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1174  Solved: 723[Submit][S ...

  4. OpenStack/devstack with Neutron on Ubuntu 14 (2)

    在前面的文章中,已经完成了devstack的安装.下面,我会介绍如何使用neutron 首先创建两个neutron net, vmnet1 和vmnet2 stack@ubuntu:~/devstac ...

  5. 《C++之那些年踩过的坑(二)》

    C++之那些年踩过的坑(二) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. 今天讲一个小点,虽然小,但如果没有 ...

  6. 移植python笔记

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 编译环境:ubuntu-14.04.1 编译器:gcc.arm-hisiv200-linux-gnueabi P ...

  7. oracle配置监听图形界面不出来解决方法

    ROOT用户下,执行 xhost +   然后再切换到oracle用户运行netca DISPLAY 在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或 ...

  8. Python快速入门(1)

    FROM:实验楼 http://python.usyiyi.cn/python_278/tutorial/index.html http://woodpecker.org.cn/abyteofpyth ...

  9. firefox无法使用yslow的解决方案

    首先,Yslow不支持firefox 36及以上版本. 解决方案:使用yslow的书签版本 使用方法:1.访问这里 http://yslow.org/mobile/ 2.把页面最后的那个 Deskto ...

  10. 浩哥解析MyBatis源码(三)——Transaction事务模块

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634151.html 1.回顾 之前介绍了Environment环境类,这其实是一个单例类 ...