改善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!