——android keyboard原理及系统结构
一、 android用户输入系统
linux内核支持的输入设备包括许多,而在android中通常用到的用户输入设备包括键盘、触摸屏和轨迹球等。下图为android用户输入系统的基本层次结构: 平台API Android系统 硬件和驱动
用户输入设备(键盘、触摸屏和轨迹球) JAVA框架 输入设备管理、事件转换 本地框架 JNI、UI库 Android应用 运动事件/按键事件 二、 android用户输入系统结构
android用户输入系统由上而下可以分为以下几个部分:
1. Android应用程序层,通过重载父类onTouchEvent和onTrackballEvent等函数,
处理触摸屏和轨迹球相关的MotionEvent运动事件;通过重载onKeyDown和onKeyUp等函数,处理键盘相关的KeyEvent按键事件。
2. Java框架层,按事件类型,将按键事件封装成android KeyEvent,将运动事件转
换成MotionEvent,并将KeyEvent和MotionEvent分发给对应的目标对象(view,activity等)处理。
3. 本地框架层,通过设备驱动,读取设备输入事件,若是按键事件,则根据
KeyLayout(按键布局)和KeyCharacterMap(按键字符映射),将按键扫描码转换成对应的按键码标签或对应的显示字符;最后将得到输入事件传给JAVA框架层。
4. 设备驱动层,在/dev/input/目录中,包含各种Event输入设备驱动程序。
下图为android用户输入系统结构:
Java Application onKeyDown onKeyUp WindowManagerService KeyInputQueue NewKeyEvent GenerateMotion Android.view.View KeyEvent onTouchEvent onTraceballEvent MotionEvent Java Framework Native Framework kernel
RawInputEvent EventHubKeyCharacterMap KeyLayout *.kcm *.kl 设备驱动(/dev/input/) 三、 linux内核设备输入系统构架
1. 字符设备驱动程序核心,其属于linux内核文件系统部分。
2. Input驱动核心向字符设备驱动核心注册输入类字符设备,其是字符设备驱动核
心与具体设备驱动的连接桥,其包括event类驱动Evdev、鼠标类驱动mousedev和游戏杆类驱动joydev。
3. 各设备(键盘、触摸屏、轨迹球等)驱动向input驱动核心注册输入设备,且与
Evdev关联;相应的鼠标等设备驱动与mousedev关联,游戏杆等设备驱动与joydev关联。
下图为Event设备驱动的架构图:
文件接口调用(ioctl/poll/read) /dev/input/eventX
游戏杆(joydev) 鼠标(mousedev) 注册 调用 具体Event设置驱动 注册 用户空间 内核空间 Event(evdev) Input驱动核心 硬件操作 调用 字符设备驱动核心 硬件和驱动 用户输入设备(键盘、触摸屏和轨迹球)
四、 keyboard相关代码分析
键盘设备及其驱动等模块的相关初始化流程:
1. linux内核启动初始化,首先会向platform_bus注册sprd_kpad_device;
2. 初始化input驱动核心子系统,向内核注册input类字符设备。 3. 初始化Event类设备模块,向input驱动核心注册evdev_handler。
4. 初始化keyboard驱动模块,向platform_bus注册sprd_kpad_device_driver。 5. 将键盘与其相应驱动关联,并注册按键中断处理函数,向input驱动核心注册键盘输入设备。
6. Input驱动核心将键盘输入设备与evdev_handler关联。
Android系统获取按键消息的流程:
1. linux内核初始化完后进入android系统,创建系统进程,其中ServerThread线程启动所有服务(包括WindowManagerService);
2. WindowManagerService在创建输入事件读取线程和输入事件分发线程后,进入无限循环对系统消息队列的处理;
3. 输入事件读取线程,首先会判断是否已经打开平台所有输入设备;若没有,则
将/dev/input目录下的所有设备打开(其中会创建与设备对应的client),再开始读取设备输入,若没有事件,该线程将被挂起,直到设备产生事件,内核驱动将该线程恢复。读取到输入事件后,通知事件分发线程。
4. 输入事件分发线程,无限循环获取输入事件,若没有事件将挂起一段时间,获
得输入事件后,找到焦点窗口对象,最后封装成消息注入到系统消息队列中。 5. 无限循环处理系统消息队列中的消息,将根据消息的目标对象,调用其相应的
具体消息处理函数进行处理。
底层驱动上传按键消息的流程(SC8800G-KEY):
1. 键盘按下,产生中断,调用已注册的中断处理函数;
2. 读取keyboard相关控制寄存器中按键信息(包括按键状态和按键的行列号); 3. 切换按键状态,从键盘配置表中获取与行列号对应的按键扫描码,并上报输入
事件;
4. 调用与键盘输入设备绑定的evdev_handler的事件处理函数,处理输入事件; 5. 向输入设备相关client事件缓存区注入输入事件。
详细的代码分析
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务