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
首先
#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