改善6410 触摸屏驱动(作者gooogleman)

改善6410 触摸屏驱动

// Topic:改善6410 触摸屏驱动


// 作者:wogoyixikexie@gliet.gooogleman

// 论坛账号:gooogleman (经常在CSDN、http://www.gooogleman.com/forum.php出没)

// 版权:桂林电子科技大学一系科协wogoyixikexie@gliet.gooogleman

// 平台:wince6.0.0 real6410 BSP (real6410开发板)

// 发布日期:2010-09-11

// 最后修改:

// 注意事项:未经作者同意,商业网站不能转载,并且不得在转载的时候擅自修改、删除文章的任何部分

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

很多世面上的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[TSP_SAMPLE_NUM], y[TSP_SAMPLE_NUM];

         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.02  make 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!

原文地址:https://www.cnblogs.com/gooogleman/p/1823887.html