天嵌 ARM开发社区

 找回密码
 注册
123
返回列表 发新帖
楼主: heycare

基于2440开发板移植ft5x06系列的电容屏驱动

[复制链接]
 楼主| heycare 发表于 2012-11-24 13:40:18 | 显示全部楼层
embedsky_lhh 发表于 2012-11-24 09:24
你在驱动里边打印下上报的内容,看你在不同点触摸时是否出现不同的上报内容,


--report x position  is  436----

--report y position  is  948----
evbug.c: Event. Dev: input0, Type: 3, Code: 0, Value: 436
evbug.c: Event. Dev: input0, Type: 3, Code: 1, Value: 948
evbug.c: Event. Dev: input0, Type: 0, Code: 0, Value: 0

这是调试信息,显示说已经上报了

但是触摸屏校准程序 光标还是没移动
 楼主| heycare 发表于 2012-11-26 17:00:04 | 显示全部楼层
现在单点触摸已经支持了,在调试多点触摸。遇到的问题是:
多点数据在上报代码:
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);  

...
input_mt_sync(data->input_dev);  
这样的话,input没有接收到按下事件。
但是我在input_mt_sync(data->input_dev); 之前加上了
input_report_abs(data->input_dev, ABS_PRESSURE, 1);
的话,input 子系统就可以接收到按下事件。

我的疑问是ABS_PRESSURE类型不是指的是单点触摸的时候用吗,多点触摸应该用ABS_MT_TOUCH_MAJOR这个啊
embedsky_lhh 发表于 2012-11-26 17:09:52 | 显示全部楼层
你多贴点代码方便大家回复,你不把注册input设备和上报的都贴上来,大家怎么看也很难看出问题的根本原因。
 楼主| heycare 发表于 2012-11-26 17:12:24 | 显示全部楼层
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
embedsky_lhh 发表于 2012-11-26 17:19:50 | 显示全部楼层
你上报玩多点之后用input_sync上报一个BTN_TOUCH事件,点击和弹起都上报,
 楼主| heycare 发表于 2012-11-26 17:42:09 | 显示全部楼层
embedsky_lhh 发表于 2012-11-26 17:19
你上报玩多点之后用input_sync上报一个BTN_TOUCH事件,点击和弹起都上报,

加上去了。但是还是没效果。
我查看了下tslib的源码,从源码里面看,tslib只支持单点的。 并不支持ABS_MT_TOUCH_MAJOR这个宏。
那这么说Qt也实现不了多点触摸了,因为Qt是从tslib来作为中间适配器的。
请问版主,你们有实现Qt的多点触摸过吗?
embedsky_lhh 发表于 2012-11-26 17:44:17 | 显示全部楼层
嗯,如果是linux下,你就可以不要再搞了,除非自己写一套库,我以为你在andorid下调试呢,linux下就单点的,应用的那些库默认都市单点,
 楼主| heycare 发表于 2014-4-24 16:37:06 | 显示全部楼层
1年多后,发现以前真心很菜
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-28 05:24 , Processed in 1.015664 second(s), 16 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表