概述
本文主要讲述触摸屏上可能用到的虚拟按键menu、home、return,底层驱动的实现和相关实现原理,其中和上层有联系的只是概述。
两种实现方式
对于触摸按键的发送可以分为两种方法:一是android提供的 virtualkey's 架构方法,一种是直接报告key event的方法。
报告keyevent方法
在驱动中添加所支持的按键类型,报告支持事件类型
__set_bit(EV_SYN, input_dev->evbit); //同步事件
__set_bit(EV_KEY, input_dev->evbit); //按键事件
报告支持的按键
__set_bit(KEY_HOME, input_dev->keybit); // home按键
__set_bit(KEY_BACK, input_dev->keybit); // back按键
__set_bit(KEY_MENU, input_dev->keybit); // menu按键
触摸屏上的三个按键对应的坐标
(KEY_BACK) 120:1400
(KEY_HOME) 360:1400
(KEY_MENU) 500:1400
keyevent的报告方法很简单只要报告相应的 key 和设备同步sync就可以了
static void ft5x0x_report_value(struct ft5x0x_ts_data *data)
{
struct ts_event *event = &data->event;
int i;
for (i = 0; i < event->touch_point; i++)
{
if (event->au16_y[i]==1400)
{
if(event->au8_touch_event[i]== 0 || event->au8_touch_event[i] == 2)
{
switch(event->au16_x[i])
{
case 120:
input_report_key(data->input_dev, KEY_BACK, 1);
break;
case 360:
input_report_key(data->input_dev, KEY_HOME, 1);
break;
case 500:
input_report_key(data->input_dev, KEY_MENU, 1);
break;
default: break;
}
}
else
{
switch(event->au16_x[i])
{
case 120:
input_report_key(data->input_dev, KEY_BACK, 0);
break;
case 360:
input_report_key(data->input_dev, KEY_HOME, 0);
break;
case 500:
input_report_key(data->input_dev, KEY_MENU, 0);
break;
default: break;
}
}
input_sync(data->input_dev);
return;
}
}
首先看最外围的for循环,可以看出:上报次数就是触摸屏检测到的点数,当然不会超出触摸屏最大支持的点数。并且每次上报完毕,都会发送一个同步事件 input_sync(),来表示此时上报结束。
里面的if (event->au16_y[i]==1400) 是在判断触摸点的y轴坐标,一般来说虚拟按键的位置都在一排上,因此必定会有一个轴的坐标是相同的,这里明显三个虚拟按键的y轴坐标相同。
这个判断if(event->au8_touch_event[i]== 0 || event->au8_touch_event[i] =