输入系统的移植

2016-2-18 chenhui 移植

输入系统,就是用来接收并处理用户通过触摸屏、键盘(这两个也是最标准的输入设备)等设备发出的输入信息的系统。


和显示系统一样,输入系统也是由:Linux 驱动、HAL 模块、Framework 层组成的,只是显示系统的 Linux 驱动使用的是 FrameBuffer,而输入系统使用的则是 Linux 内核中的输入子系统。


输入子系统和 FrameBuffer 一样,其本质上都是一个起到框架作用的驱动程序,我们可以往输入子系统中注册一个能产生触摸事件的驱动,然后让这个驱动来操作触摸屏。触摸屏按下后会有一个中断,所以他肯定会监听这个中断,然后在这个中断里通过相关机制算出坐标,并把这个坐标包装成一个输入事件(用户输入了一个值嘛!),并发送到用户空间,然后用户空间就能根据这个坐标值做出响应的反应了。


对于 Android 的移植来说,需要移植两个部分:

  • 输入驱动(最重要的是产生触摸事件即触摸屏的输入驱动)
  • 用户空间的 kl 和 kcm 文件,这指定了 Android 如何识别按键输入驱动上传的键盘码

下面是一个触摸屏输入驱动的骨架源代码:


static struct input_dev *s3c_ts_dev;
static irqreturn_t tc_irq(int irq, void *dev_id);

static int s3c_ts_init(void)
{
	/* 分配一个 input_dev 结构体 */
	s3c_ts_dev = input_allocate_device();

	/* 设置 EV_ABS 位表示他会产生一个绝对位移的事件 */
	set_bit(EV_ABS, s3c_ts_dev->evbit);
	/* 设置 EV_KEY 位表示他会产生一个按键事件,触摸屏也是拿来按的 */
	set_bit(EV_KEY, s3c_ts_dev->evbit);

	/* 按键分很多种,如常见键盘,这里的按键是触摸屏的虚拟按键 */
	set_bit(BTN_TOUCH, s3c_ts_dev->keybit);
	
	/* 设置触摸事件的 X/Y 坐标的最小值和最大值,就是触摸屏的分辨率 */
	input_set_abs_params(s3c_ts_dev, ABS_X, 0, 0x3FF, 0, 0);
	input_set_abs_params(s3c_ts_dev, ABS_Y, 0, 0x3FF, 0, 0);
	
	/* 设置触摸屏的压力方向,即松开和按下 */
	input_set_abs_params(s3c_ts_dev, ABS_PRESSURE, 0, 1, 0, 0);

	/* 注册 */
	input_register_device(s3c_ts_dev);

	// 省略触摸屏初始化操作
	
	/* 我们说过,需要监听触摸屏按下松开的中断,这里作为例子,随便监听个 */
	request_irq(IRQ_TC,tc_irq,IRQF_SAMPLE_RANDOM,"ts",NULL);
	
	return 0;
}

/*
 * 如果触摸屏松开或按下,则到这里来处理
 */
static irqreturn_t tc_irq(int irq, void *dev_id)
{
	int x,y;
		
	/* 得到 XY 坐标,转换的方法涉及到硬件操作,不管他 */
	x = measure_x();	
	y = measure_y();
	
	// 记录 X/Y 坐标
	input_report_abs(s3c_ts_dev, ABS_X, x);
	input_report_abs(s3c_ts_dev, ABS_Y, y);	
	
	if (is_down()){
		// 如果是按下
		
		// 上报按下事件
		input_report_abs(s3c_ts_dev, ABS_PRESSURE, 1);
		input_report_key(s3c_ts_dev, BTN_TOUCH, 1);
		
	}else if (is_up()){
		// 如果是松开
		
		// 上报松开事件 
		input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);
		input_report_key(s3c_ts_dev, BTN_TOUCH, 0);
	}
	
	// 提交两个事件,这样用户层就知道按下和松开以及坐标了
	input_sync(s3c_ts_dev);	

	return IRQ_HANDLED;
}


上面是一个最简单的触摸屏的输入驱动的骨架,他只处理了按下和松开,并没有处理长按和移动,他不一定正确,但基本上展示了触摸屏输入驱动是怎么一回事。

当然,不仅仅是触摸屏需要使用输入驱动,包括鼠标、键盘这一类设备的驱动,也要使用输入驱动来实现,形式和上面这段触摸屏的代码是类似的。


在这个驱动成功注册之后,就会在 /dev/input/ 目录下生成一个相对应的设备文件。生成的文件名有三种:

  • joystick<Number>
  • mouse<Number>
  • mice
  • event<Number>

我们能发现的是,input_sync() 这个方法会把按下和松开以及坐标提交给用户层,然后用户层再进行处理(通过 read 设备文件,不同的事件会读出不同格式的数据)。

这一切都没有什么问题,Android 的输入系统的基础就是这个驱动,首要移植的也就是这个驱动,关键是怎么让用户空间的 HAL 层知道他应该访问 /dev/input/ 目录下哪个设备文件来得到这个驱动提交的信息呢?这和显示系统有点不一样,他不是访问固定的设备文件的,他会扫描 /dev/input/ 目录下所有设备并打开,然后再把他们分辨出来。


然后我们再来看看 kl 文件和 kcm 文件,这两个文件关系到 Android 对键盘的识别,在我们查看一份 Android 源代码的特定产品目录时是一定能够看到这两个文件的,先来看看 kl 文件是怎么回事,下面是 smart210 开发板的 Android 4.0.4 的 kl 文件内容:


key 42    VOLUME_UP         WAKE 
key 58    VOLUME_DOWN       WAKE
key 50    HOME              WAKE_DROPPED
key 26    ENDCALL           WAKE_DROPPED
key 34    BACK              WAKE_DROPPED
key 57    DPAD_LEFT         WAKE_DROPPED
key 49    DPAD_RIGHT        WAKE_DROPPED
key 25    DPAD_UP           WAKE_DROPPED
key 41    DPAD_DOWN         WAKE_DROPPED
key 33    DPAD_CENTER       WAKE_DROPPED
key 10    POWER     	    WAKE


上面每一行都规定了 Android 的一个按键的代码,他是什么意思呢?

先来看看最右边,WAKE 表示这个按钮被按下后要唤醒屏幕,WAKE_DROPED 表示除了按下之外,还要通知应用层。

VOLUME_UP...POWER 这一列是按键名。

key 后面的数字是按键码。和触摸屏驱动上传坐标相似,按键驱动也会上传一个值来表示当前按键,这个值就是按键码(按键按下时也会触发中断,他监听了所有按键的中断,并在中断上传按键码)。比如  34 - BACK 这一行,这表示如果键盘驱动上传一个 34 键盘码,就说明他检测到 BACK 键被按下了,这时候上层软件就要对 BACK 键进行处理。


简单的说,kl 文件定义了 Android 应该如何识别按键驱动上传的键盘码。


然后我们再来看看 kcm 文件,下面这段内容是我从往上复制过来的:


# keycode       display number  base    caps    fn      caps_fn  
                                                          
A               'A'     '2'     'a'     'A'     '#'     0x00  
B               'B'     '2'     'b'     'B'     '<'     0x00  
C               'C'     '2'     'c'     'C'     '9'     0x00E7  
D               'D'     '3'     'd'     'D'     '5'     0x00  
E               'E'     '3'     'e'     'E'     '2'     0x0301  
F               'F'     '3'     'f'     'F'     '6'     0x00A5  
G               'G'     '4'     'g'     'G'     '-'     '_'  
H               'H'     '4'     'h'     'H'     '['     '{'  
I               'I'     '4'     'i'     'I'     '$'     0x0302  
J               'J'     '5'     'j'     'J'     ']'     '}'  
K               'K'     '5'     'k'     'K'     '"'     '~'  
L               'L'     '5'     'l'     'L'     '''     '`'  
M               'M'     '6'     'm'     'M'     '!'     0x00  
N               'N'     '6'     'n'     'N'     '>'     0x0303  
O               'O'     '6'     'o'     'O'     '('     0x00  
P               'P'     '7'     'p'     'P'     ')'     0x00  
Q               'Q'     '7'     'q'     'Q'     '*'     0x0300  
R               'R'     '7'     'r'     'R'     '3'     0x20AC  
S               'S'     '7'     's'     'S'     '4'     0x00DF  
T               'T'     '8'     't'     'T'     '+'     0x00A3  
U               'U'     '8'     'u'     'U'     '&'     0x0308  
V               'V'     '8'     'v'     'V'     '='     '^'  
W               'W'     '9'     'w'     'W'     '1'     0x00  
X               'X'     '9'     'x'     'X'     '8'     0xEF00  
Y               'Y'     '9'     'y'     'Y'     '%'     0x00A1  
Z               'Z'     '9'     'z'     'Z'     '7'     0x00  


上面这段代码是什么意思呢?

首先来看 keycode,这是 Android 在得到按键驱动上传的键盘码后,根据 kl 得到的对应的按键名,除了上面这些之外,还有 HOME 键、BACK 键、 POWER 键等等...

然后是 base 和 cap,我们知道键盘上有一个切换大小写的按键,当切换为大写时,最终会输出 caps 字段的内容,当切换为小写时,会输出 base 的内容。



评论:

robspoow
2018-07-29 03:01
Simvastatin And Regional Anesthesia  Pristiq Versus Prozac Effexor . Gel Price Usa Lopid More Drug_side_effects  http://www.netvibes.com/amoxicillinbuy  - Buy Generic Amoxicillin Nortriptyline Amitriptyline Urinary Retention 1981 propecia generic Grundsatzen sitten- und Unterstutzung zusagte. Generic tadalafil generika / tadalafil tadalis pille 20mg / tadalafil nachnahme. ist B Solutions Skin Care Uci Allergy Fellowship . Toradol Looks Like Aspirin Xs Nighttime Pregnancy Depakote Drug http://www.netvibes.com/lasixonline  - Lasix Sr No Prescription Order. Indigenous Health Hypertension Lisinopril is used to treat hypertension, congestive heart failure and to improve. Ramipril Vs Altace Side Effects Tartrate Online Pharmacy .

发表评论:

Copyright ©2015-2016 freehui All rights reserved