goooogleman 发表于 2010-9-27 10:27:44

改善6410 触摸屏驱动(wince)

效果:不抖动,不跳点,平滑,灵敏度还过得去。4.3 寸的OK,七寸的没有时间搞,有空的GGMM的搞搞吧。
这里上传图不方便,原文放博客了http://blog.csdn.net/gooogleman/archive/2010/09/11/5877407.aspx

很多世面上的6410 开发板触摸屏效果都不尽人意,友坚的做了这么久了,也没有解决掉,后来客户问起来就说是硬件问题了。的确,细心地朋友会发现,友坚的触摸屏居然有压屏现象:就是按住当前点,但是压力会传递到另外一个点上,这个就是触摸屏质量问题了。飞凌TE6410和华天正real6410的没有压屏,但是也存在抖动和反应迟钝问题。具体表现为:首先是打开软键盘,按下键盘按钮的时候,你会发现软键盘按钮很难弹起来,嘿嘿,黑好一阵子才消失,这应该是采样函数太久导致的;其次就是双击一个图标,有时候需要很大力才能打开,我估计是中断没有产生造成的,这个得好好分析,因为有时候并不需要那么大力气就能打开,这个是明天的工作了。

我手里正好有个real6410 板子,都具备了上述两种现象。因为前段时间整过2440 的触摸屏,所以我一下子就找到了第一个问题所在:在real6410 开发板的touch驱动的TSP_GetXY(int *px, int *py)函数,我找到了原因所在——我晕,在里面居然用了延时不算,还加了两个sleep(1),你说能不慢嘛!飞凌OK2440的触摸屏效果是不错的,于是我比较这两个函数,发现OK2440 的驱动写的精简合理,于是我就照着弄起来。去掉延时,去掉sleep(如果不去会导致触摸屏采样数据严重失准),把代码改成如下之后,触摸屏软键盘的弹起慢问题解决。

static BOOL

TSP_GetXY(int *px, int *py)

{

    //int i,j,k;

    //int temp;

    //int x, y;

         INT i;

    INT dx, dy;

         INT x, y;

         INT xsum, ysum;

    //int TimeOut = 100;// about 100ms

    EnterCriticalSection(&g_csTouchADC);

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

    {

            

                   //#define ADCTSC_AUTO_ADC         (UD_SEN_DOWN    |YM_SEN_EN|YP_SEN_DIS|XM_SEN_DIS|XP_SEN_DIS|PULL_UP_DIS|AUTO_PST_EN|XY_PST_NOP)

      g_pADCReg->ADCTSC = ADCTSC_AUTO_ADC;    // Auto Conversion

                   // add @2010.09.02

                   //g_pADCReg->ADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0);                        

      g_pADCReg->ADCCON |= ENABLE_START_EN;    // ADC Conversion Start

                   //A/D conversion starts by enable.

                   //If READ_START is enabled, this value is not valid.

                   //0 = No operation 1 = A/D conversion starts and this bit is cleared after the start-up.

                   //

      while (g_pADCReg->ADCCON & ENABLE_START_EN);// wait and do nothing

               //Sleep(1);

      //{   // Wait for Start Bit Cleared

      //    if(TimeOut-- < 0)

      //    {

      //      RETAILMSG(ZONE_ERROR,(TEXT("ADC cannot start\n")));

      //      goto ADCfails;

      //    }      

            //Sleep(1); // mask @2010.06.02

      //}

      //TimeOut = 100;// about 100ms

      //End of conversion flag(Read only)

                   //0 = A/D conversion in process --1 = End of A/D conversion

                  

      while (!(g_pADCReg->ADCCON & ECFLG_END)); // if A/D conversion in process and do nothing

               //Sleep(1);

      //{    // Wait for ADC Conversion Ended

      //    if(TimeOut-- < 0)

      //    {

      //      RETAILMSG(ZONE_ERROR,(TEXT("ADC Conversion cannot be done\n")));

      //      goto ADCfails;

      //    }      

            //Sleep(1); // mask @2010.06.02

      //}

      x = D_XPDATA_MASK(g_pADCReg->ADCDAT0);

      y = D_YPDATA_MASK(g_pADCReg->ADCDAT1);

                   xsum += x;

                   ysum += y;

                  

    }

    LeaveCriticalSection(&g_csTouchADC);

         *px = xsum / TSP_SAMPLE_NUM;

         *py = ysum / TSP_SAMPLE_NUM;

         //-----------------------------------------------------------------------

         RETAILMSG(TRUE,(TEXT("touch :*px= %d\r\n"),*px));

         RETAILMSG(TRUE,(TEXT("touch :*py= %d\r\n"),*py));

         //----------------------- add @2010.09.02make interrupt stop---------------

         

         g_pADCReg->ADCTSC = (1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<< 4)|(0<<3)|(0<<2)|(3);                                 

    dx = (*px > x) ? (*px - x) : (x - *px);

         dy = (*py > y) ? (*py - y) : (y - *py);

         //-----------------------------------------------------------------------

         RETAILMSG(TRUE,(TEXT("touch :dx= %d\r\n"),dx));

         RETAILMSG(TRUE,(TEXT("touch :dy= %d\r\n"),dy));

         

         return ((dx > TSP_INVALIDLIMIT || dy > TSP_INVALIDLIMIT) ? FALSE : TRUE);

         

}

——为了保留原始足迹,所以很多语句只是屏蔽了,请大家仔细点看。

虽然这个采样函数问题得到解决,但是触摸屏的下一个问题得解决。为什么会有时候很大力才会产生中断呢?这个话题明天再来说吧吧。嘿嘿

                                                                                                       ——gooogleman @2010.09.02

——续 @2010-9-3

刚才仔细看了打印信息,发现其实已经产生中断,但是双击就是打不开图标,到底为什么没有打开图标呢?需要啥条件?我初步猜测是抖动造成的,因为抖动导致两次采样的差异过大,所以系统认为不是双击。到底是不是,让我继续看。

——续@2010-9-8

后来我发现,之所以real6410 会抖动,是因为没有加入一些数据处理算法,DETAIL_SAMPLING 这个宏没有定义。嘿嘿,我加入定义,O(∩_∩)O哈哈哈~居然效果很好,一点都不抖动了,不过感觉还是不灵敏。咋回事呢?去掉sleep灵敏度有所提高,还是不够灵敏,说明是算法效率不够快,这个算法看上去很简单了,看上去没有改进的可能性了,那我再把ADC 延迟减小吧。

#define TSP_ADC_DELAY   (300)// 40000 ——》300 chang gooogleman @2010.09.04

就这样,触摸屏就很好用了,操控性很好,灵敏度也不错了——说实在的,我还是觉得不满意,还是稍微有点不灵敏,我现在想唯一的的办法就是减少采样次数了,不过这样是否会抖动也难说,有空再整整吧(刚才试验改成4次抖动得很,导致右键也不出来了,貌似灵敏度也是不咋的,看来灵敏度是再难提高了!)。

最后在这里说明一下这个触摸屏要注意的事情:

一、            千万别在驱动关键部分放延时,sleep之类的东西,这个驱动入门书籍都有提到。去年我拿到idea6410的时候曾经多次向友坚反应这个问题,这样的触摸效果也拿出来卖,实在有点雷人,今年五月份idea6410貌似效果还是没有改进,当时问友坚,他们的答复是硬件问题,布线不良,带宽等因素,目前我用real6410试验,手里没有idea6410,所以无法验证了(不过我对比real6410 和idea6410的触摸屏驱动几乎一摸一样的)。

二、            关于 TSP_ADC_DELAY         的取值我试验过不能低于300,低于这个数字触摸屏就有点抖动了。

三、            目前我只是在real6410 4.3 寸LCD套餐上试验过,这几天我会在real6410 7寸LCD上试验,下周再在TE6410/OK6410 4.3 /7 寸LCD上试验,到时候再来报告结果。

——2010-9-11 拿到real6410 的7寸LCD 装上去,很不幸,在4.3 寸LCD 跑的很欢快的触摸屏驱动到了 七 寸LCD上变得很不堪:照样存在抖动,并且导致LCD右上角的区域无法响应触摸了!不过我觉得七寸不用修改那么多,只要把采样点加多点就OK了,有空再调试吧。This is it!



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gooogleman/archive/2010/09/11/5877407.aspx

llf021421 发表于 2010-9-28 09:36:09

我顶,我学习了!谢谢!

yulutong 发表于 2010-9-30 12:38:44

回复【楼主位】goooogleman 谷歌男
-----------------------------------------------------------------------

帮我推荐本学习wince的书好嘛?
不研究底层驱动,最好带H264等编码和网络。
9261开发板用的ce5.0,0k6410用的是ce6.0,能买本5.0,6.0都兼顾到的好处。
谢谢楼主了。

令问wince有无边框的视频播放器么?

goooogleman 发表于 2010-10-4 20:33:03

没有做过播放器,只会一点基础的驱动。
http://blog.csdn.net/gooogleman/archive/2008/11/11/3266887.aspx
书籍看看这个吧

yulutong 发表于 2010-10-6 08:07:08

楼主这是08年你推荐的书,最近你没有买wince的书么?

yulutong 发表于 2010-10-7 08:11:12

回复【3楼】goooogleman 谷歌男
-----------------------------------------------------------------------

中毒了,昨天在宁波书城买了4本。
Windows CE 工程实践完全解析    --李大为
Windows CE嵌入式开发标准教程--华清远见
Windows CE 使用开发技术(第二版)--张冬泉等
Windows CE 实验与实践--基于s3c2410   周立功

另外看想找本基于ATMEL ARM9的书没找到,都是抄来抄去2410,郁闷。

tigerchen 发表于 2010-10-7 09:50:04

呵呵,多谢分享

goooogleman 发表于 2010-10-21 12:30:40

回复【4楼】yulutong 土土狗
楼主这是08年你推荐的书,最近你没有买wince的书么?
-----------------------------------------------------------------------

没有买过了,因为我发现那些书不如自己看源码,看微软自带帮助好。
中文书入门才需要的。

awgn 发表于 2010-11-22 00:08:48

gooogleman,七寸触摸屏存在抖动,D右上角的区域无法响应触摸等问题解决了吗?我也遇到这个情况,google后发现很多人都遇到了。

steven_sd 发表于 2010-11-23 14:51:45

MARK

llf021421 发表于 2010-11-23 20:43:18

七寸触摸屏换ads7946芯片的压力测试功能可以完美解决抖动

llf021421 发表于 2010-11-23 20:49:30

D右上角无法响应触摸,我也遇到过,我的解决办法:去掉触摸屏四根信号线的滤波电容,或者换200~400pf之间的电容。

goooogleman 发表于 2010-11-25 09:43:58

回复【11楼】llf021421 马中马
d右上角无法响应触摸,我也遇到过,我的解决办法:去掉触摸屏四根信号线的滤波电容,或者换200~400pf之间的电容。
-----------------------------------------------------------------------

不错,不错,3Q,我试试,有个客户正好要我调试 七寸的触摸屏呢,所以我就一直在等这个任务。
哈哈哈,人要加上电容,现在去掉反而OK了。
另外2440 wince触摸屏驱动去抖动,去跳点的文章我也写好了,经过验证的。
CSDN 的博客出毛病了,发不了,我发在我的博客园博客了。
在这里,测试LCD 是3.5 寸的PDA。
http://www.cnblogs.com/gooogleman/archive/2010/11/18/1881017.html

greateast 发表于 2011-7-11 11:37:29

这个要好好学习。

swustlx86 发表于 2011-11-24 15:39:39

MARK

theddous 发表于 2012-1-14 16:31:48

mark
页: [1]
查看完整版本: 改善6410 触摸屏驱动(wince)