|
embedsky_lhh 发表于 2012-11-26 17:09
你多贴点代码方便大家回复,你不把注册input设备和上报的都贴上来,大家怎么看也很难看出问题的根本原因。
初始化
/* input初始化参数设定 */
input_dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);
input_dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] = BIT(BTN_TOUCH);
input_set_abs_params(input_dev, ABS_X, 0, SCREEN_MAX_X, 0, 0);
input_set_abs_params(input_dev, ABS_Y, 0, SCREEN_MAX_Y, 0, 0);
input_set_abs_params(input_dev, ABS_PRESSURE, 0, 1, 0, 0);
/* 支持多点触摸 */
#ifdef CFG_MULTI_TOUCH
//input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 1, 0, 0);
input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0);
input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);
input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 1, 0, 0);
input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, CFG_MAX_POINT_NUM, 0, 0);
#endif
读取数据:
/* 取个数最小值 */
nTouchPointNum = (nTouchPointNum > CFG_MAX_POINT_NUM)? CFG_MAX_POINT_NUM : nTouchPointNum;
if(nTouchPointNum > 0)
{
for(nIndex = 0; nIndex < nTouchPointNum; nIndex++)
{
int nPointBase = 3 + 6*nIndex;
nTouchPointID = (u8TSRegsData[nPointBase + 2] >> 4) & 0x0F; /* 获取触点ID */
if(nTouchPointID >= 0 && nTouchPointID < CFG_MAX_POINT_NUM)
{
/* 计算x和y,得出的值为1280X768的分辨率所对应的值 */
nPointX = ((u8TSRegsData[nPointBase + 2] & 0x0F) << 8) | u8TSRegsData[nPointBase + 3];
nPointY = ((u8TSRegsData[nPointBase + 0] & 0x0F) << 8) | u8TSRegsData[nPointBase + 1];
/* 比例转换 */
nPointX = nPointX*SCREEN_MAX_X/1280;
nPointY = nPointY*SCREEN_MAX_Y/768;
/* 获取事件类型 */
nTouchEvent = (u8TSRegsData[nPointBase + 0] >> 6) & 0x03;
/* 压力值 */
nPointPressure = (u8TSRegsData[nPointBase + 4]) & 0x3F;
#ifdef FT5X06_DEBUG
printk("---nPosition x: %d\ty: %d---\n", nPointX, nPointY);
printk("---Event type: %d---\n", nTouchEvent);
printk("---Pressure : %d---\n", nPointPressure);
#endif
if(nPointX > SCREEN_MAX_X || nPointY > SCREEN_MAX_Y)
{
continue;
}
/* 上传触点参数 */
input_report_abs(data->input_dev, ABS_MT_POSITION_X, nPointX);
input_report_abs(data->input_dev, ABS_MT_POSITION_Y, nPointY);
input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, 1);
//input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, nPointPressure);
input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, nTouchPointID);
input_mt_sync(data->input_dev);
#ifdef FT5X06_DEBUG
printk("--- 单点同步,触点ID: %d---\n", nTouchPointID);
#endif
}
}
}
else
{
input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, 0);
//input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, 0);
input_mt_sync(data->input_dev);
#ifdef FT5X06_DEBUG
printk("---触点up---\n");
#endif
}
/* 同步多点值 */
input_sync(data->input_dev);
#ifdef FT5X06_DEBUG
printk("---多点同步---\n", nTouchPointID);
#endif |
|