zoukankan      html  css  js  c++  java
  • 改善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!

  • 相关阅读:
    random模块
    time模块
    软件目录开发规范
    基于贝叶斯算法实现简单的分类(java)
    百度语音合成简单案例(将文字转化为相应的语音)
    python3 load Iris.data数据集出现报错key words: b'Iris-setosa'
    python3中报错AttributeError: module 'sys' has no attribute 'setdefaultencoding'
    Kafka的安装是否成功的简单测试命令
    伪分布式hadoop启动后jps查不到namenode的解决办法
    Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=lenovo, access=WRITE, inode="/user/hadoop/spark/people_savemode_test/_temporary/0":hadoop:supergro
  • 原文地址:https://www.cnblogs.com/gooogleman/p/1823887.html
Copyright © 2011-2022 走看看