您的位置:首页 > 其它

Wince BSP从5.0移植到6.0(三)

2012-02-28 11:37 501 查看
转载至:http://blog.csdn.net/pony_maggie/article/details/5382094

作者:小马

第三部分是关于触摸屏驱动的移植

 

1

在platform.bib里把原来注释掉的下面两行置为有效.

k.touch.dll         $(_FLATRELEASEDIR)/DeviceEmulator_touch.dll  NK SHK  
  
 touch.dll           $(_FLATRELEASEDIR)/DeviceEmulator_touch.dll  NK SH  

这两个就是触摸屏驱动的动态库文件.
 



到platform.reg下找到[HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH]项,改为如下

"CalibrationData"="499,69971,175 67,1243 899,1219 899,167 "  

这个是校准值. 如果你重新做了校准,新的值会保存在这个数据里.  这组数字并不是像素值, 而是AD采样值,因为这块板子所配的触摸屏是基于电阻式的, 利用四线产生屏幕偏置电压, 然后AD采样,电压值转化为坐标值.

 

3

到驱动目录下找到s3c2410x_touch.cpp文件. 在这个文件下,对于触摸屏驱动,主要就是有两个地方需要修改, 一个是采样频率的修改, 还有就是获取触点位置方法的修改.这两处都是硬件相关的,所以必须移植. 比如原来的BSP是用定时器1控制采样频率, 而6.0的BSP用的是timer3,而且采样频率也是不一样的.

 

3.1 采样频率相关

 

#define ADCPRS             200//改为:  
#define ADCPRS             21  

找到下面这个全局变量

PRIVATE INT TSP_CurRate= TSP_SAMPLE_RATE_HIGH;

改为

PRIVATE INT TSP_CurRate= 0;  

 

找到#define TIMER3_DIVIDER                  2
改为

#define TIMER3_DIVIDER                  4  

 
找到TSP_PowerOn函数,改为实现如下:

 

PRIVATE VOID  
  
TSP_PowerOn(VOID)  
  
{  
  
   RETAILMSG(1,(TEXT("::: TSP_PowerOn()/r/n")));  
  
   
  
   /* Use TSXM, TSXP, TSYM, TSYP   Clear GPG15, 14, 13, 12     */  
  
    v_pIOPregs->GPGCON&= ~((0x03 << 30)|(0x03 << 28)|(0x03 << 26)|(0x03<< 24));  
  
   v_pIOPregs->GPGCON |= ((0x3 << 30) | (0x3 << 28) | (0x3 << 26) | (0x3<< 24));  
  
    v_pIOPregs->GPGUP|= ((0x01 << 15)|(0x01 << 14)|(0x01 << 13)|(0x01<<12));   
  
   v_pADCregs->ADCDLY = 30000;   
  
    v_pADCregs->ADCCON  = (1<<14)|(ADCPRS<<6)|(7<<3);     
  
   v_pADCregs->ADCTSC =   (0      <<  8) | (1     <<  7) |   
  
                            (1      << 6) | (0      <<  5) |  
  
                            (1      << 4) | (0      <<  3) |                             (0      << 2) |  (3      << 0);  
  
   
  
   
  
 
4000
  v_pINTregs->INTSUBMSK &= ~(1<<IRQ_SUB_TC);  
  
   
  
   v_pPWMregs->TCFG1 &= ~(0xf << 12);     /* Timer3's Divider Value*/  
  
   v_pPWMregs->TCFG1 |=  (1   << 12);     /* 1/4      */  
  
   v_pPWMregs->TCNTB3  =(10 * (g_s3c2410_pclk / (24+1) / TIMER3_DIVIDER )) / 1000;   /* InterruptFrequency*/  
  
    v_pPWMregs->TCMPB3= 0;       
  
}  

 

3. 2 获取触点位置相关.
 
找到下面几个宏定义:
 

#define TSP_MINX                        85  
  
#define TSP_MINY                        105  
  
#define TSP_MAXX                        965  
  
#define TSP_MAXY                    980  

改为如下的值:

#define TSP_MINX                        88  
  
#define TSP_MINY                        84  
  
#define TSP_MAXX                        952  
  
#define TSP_MAXY                        996  

上面几个是边界点,影响不是很大, 不过我还是按照原BSP的值做了修改.
 
TSP_TransXY和TSP_GetXY这两个函数是重点. 这两个函数决定了当你按下触摸屏时,系统获取的位置. 这两个函数如果没有写好,会出现类似你点了左边,右边有反应,或者你点了左上角,右下角有反应. 这两个函数的实现也和屏幕的分辨率有关.
TSP_TransXY的实现如下:

PRIVATE void  
  
TSP_TransXY(INT *px, INT *py)  
  
{  
  
   
  
*px = (*px >= TSP_MAXX) ? (TSP_MAXX) : *px;  
  
*py = (*py >= TSP_MAXY) ? (TSP_MAXY) : *py;  
  
   
  
*px = (*px - TSP_MINX);  
  
*py = (*py - TSP_MINY);  
  
   
  
*px = (*px >= 0) ? *px : 0;  
  
*py = (*py >= 0) ? *py : 0;  
  
   
  
*px = *px * TSP_LCDY / (TSP_MAXX - TSP_MINX);  
  
*py = *py * TSP_LCDX / (TSP_MAXY - TSP_MINY);  
  
   
  
*px = (*px >= TSP_LCDY)? (TSP_LCDY - 1) : *px;  
  
*py = (*py >= TSP_LCDX)? (TSP_LCDX - 1) : *py;  
  
   
  
*px = TSP_LCDY - *px - 1;  
  
*py = TSP_LCDX - *py - 1;  
  
}  
  
   

 

其中,
TSP_LCDX= (LCD_YSIZE_TFT * 4);//240*4
TSP_LCDY= (LCD_XSIZE_TFT * 4);//320*4
在TSP_GetXY函数里找到下面两行:

x= (0x3ff & v_pADCregs->ADCDAT1);  
  
y= 0x3ff - (0x3ff & v_pADCregs->ADCDAT0);  

 
改为:

y= (0x3ff & v_pADCregs->ADCDAT1);  
  
x= (0x3ff & v_pADCregs->ADCDAT0);  

 
到这里,触摸屏驱动部分基本移植成功, 目前还有个小问题. 左键双击不起作用, 单击没问题. 

正常情况下,长按才是右击, 我的短按也会弹出快捷菜单. Csdn上问了,未果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  wince timer c