您的位置:首页 > 其它

ft5x06的virtual key的实现

2015-09-30 11:18 429 查看
ft5x06 virtual key的实现

首先

#define FT5x06_KEY_HOME 172 //<Linux key code>:

#define FT5x06_KEY_BACK 158

#define FT5x06_KEY_MENU 139 //这里看/frameworks/base/data/keyboards/Generic.kl里的各个按键的定义来

然后

static ssize_t focalTP_virtual_keys_register(struct kobject *kobj, struct kobj_attribute *attr, char *buf)

{

char *virtual_keys ;

virtual_keys= __stringify(EV_KEY) ":" __stringify(FT5x06_KEY_BACK) ":215:2045:260:250" "\n" \

__stringify(EV_KEY) ":" __stringify(FT5x06_KEY_HOME) ":540:2045:260:250" "\n" \

__stringify(EV_KEY) ":" __stringify(FT5x06_KEY_MENU) ":865:2045:260:250" "\n" ; //每一个虚拟按键有六个参数

/*六个参数

0x01: A version code. Must always be 0x01.

<Linux key code>: The Linux key code of the virtual key.

<centerX>: The X pixel coordinate of the center of the virtual key.

<centerY>: The Y pixel coordinate of the center of the virtual key.

<width>: The width of the virtual key in pixels.

<height>: The height of the virtual key in pixels.

*/

return snprintf(buf, strnlen(virtual_keys, MAX_LEN) + 1 , "%s",virtual_keys);

}

接着

static struct kobj_attribute focalTP_virtual_keys_attr = {

.attr = {

.name = "virtualkeys.ft5x06_ts", //here the ft5x06_ts is the same as input_dev.name

.mode = S_IRWXU | S_IRWXG | S_IROTH,

},

.show = &focalTP_virtual_keys_register,

};

static struct attribute *virtual_key_properties_attrs[] = {

&focalTP_virtual_keys_attr.attr,

NULL

};

static struct attribute_group virtual_key_properties_attr_group = {

.attrs = virtual_key_properties_attrs,

};

struct kobject *focal_virtual_key_properties_kobj;

static void ftxxxx_report_value(struct ftxxxx_ts_data *data)

{

struct ts_event *event = &data->event;

int i;

int uppoint = 0;//已经抬起的点数

static u8 last_touchpoint;

/*protocol B*/

for (i = 0; i < event->touch_point; i++) {//循环处理 缓存中的所有点

input_mt_slot(data->input_dev,event->au8_finger_id[i]);//发送点的ID

if (event->au8_touch_event[i]== 0 || event->au8_touch_event[i] == 2) {//如果点按下

input_mt_report_slot_state(data->input_dev,MT_TOOL_FINGER,true);//手指按下

input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]);

input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]);

input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]);

input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]);

} else {

uppoint++;//没有按下,则表明这个手指已经抬起

input_mt_report_slot_state(data->input_dev,MT_TOOL_FINGER,false);//报告手指抬起

}

}

if((last_touchpoint>0)&&(event->Cur_touchpoint==0))

{

for(i=0;i<CFG_MAX_TOUCH_POINTS;i++)

{

input_mt_slot(data->input_dev,i);

input_mt_report_slot_state(data->input_dev,MT_TOOL_FINGER,false);

}

last_touchpoint=0;

}

if(event->touch_point == uppoint) {

input_report_key(data->input_dev, BTN_TOUCH, 0);//所有手指都抬起了 发送BTN_TOUCH 抬起事件

} else {

input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0);//还有手指没抬起,发送BTN_TOUCH 按下的事件

}

input_sync(data->input_dev);//sync 设备同步

last_touchpoint=event->Cur_touchpoint;

}

最后在probe函数里

set_bit(KEY_BACK, input_dev->keybit);//set_bit()告诉input输入子系统支持哪些事件,哪些按键。

set_bit(KEY_HOME, input_dev->keybit);

set_bit(KEY_APPSELECT, input_dev->keybit);

__set_bit(EV_KEY, input_dev->evbit);

#ifdef VIRTURAL_KEY

focal_virtual_key_properties_kobj = kobject_create_and_add("board_properties", NULL);//添加目录board_properties

if (focal_virtual_key_properties_kobj)

err = sysfs_create_group(focal_virtual_key_properties_kobj, &virtual_key_properties_attr_group);//生成/sys/board_properties/virtualkeys.Ft5x0x_Touch_Screen虚拟按键配置文件

////可以使用 cat /sys/board_properties/virtualkeys.Ft5x0x_Touch_Screen命令来查看配置是否正确

if (!focal_virtual_key_properties_kobj || err)

printk("[Focal][TOUCH_ERR] %s : failed to create novaTP virtual key map! \n", __func__);

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: