ft5x06的virtual key的实现

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值