Wince BSP从5.0移植到6.0(三)

转载至:http://blog.csdn.net/pony_maggie/article/details/5382094

作者:小马


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

 

1

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

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

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

 

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

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

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

 

3

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

 

3.1 采样频率相关

 

  1. #define ADCPRS             200//改为:  
  2. #define ADCPRS             21  


找到下面这个全局变量

PRIVATE INT TSP_CurRate= TSP_SAMPLE_RATE_HIGH;

改为

  1. PRIVATE INT TSP_CurRate= 0;  

 

找到#define TIMER3_DIVIDER                  2

改为

  1. #define TIMER3_DIVIDER                  4  

 

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

 

  1. PRIVATE VOID  
  2.   
  3. TSP_PowerOn(VOID)  
  4.   
  5. {  
  6.   
  7.    RETAILMSG(1,(TEXT("::: TSP_PowerOn()/r/n")));  
  8.   
  9.    
  10.   
  11.    /* Use TSXM, TSXP, TSYM, TSYP   Clear GPG15, 14, 13, 12     */  
  12.   
  13.     v_pIOPregs->GPGCON&= ~((0x03 << 30)|(0x03 << 28)|(0x03 << 26)|(0x03<< 24));  
  14.   
  15.    v_pIOPregs->GPGCON |= ((0x3 << 30) | (0x3 << 28) | (0x3 << 26) | (0x3<< 24));  
  16.   
  17.     v_pIOPregs->GPGUP|= ((0x01 << 15)|(0x01 << 14)|(0x01 << 13)|(0x01<<12));   
  18.   
  19.    v_pADCregs->ADCDLY = 30000;   
  20.   
  21.     v_pADCregs->ADCCON  = (1<<14)|(ADCPRS<<6)|(7<<3);     
  22.   
  23.    v_pADCregs->ADCTSC =   (0      <<  8) | (1     <<  7) |   
  24.   
  25.                             (1      << 6) | (0      <<  5) |  
  26.   
  27.                             (1      << 4) | (0      <<  3) |                             (0      << 2) |  (3      << 0);  
  28.   
  29.    
  30.   
  31.    
  32.   
  33.    v_pINTregs->INTSUBMSK &= ~(1<<IRQ_SUB_TC);  
  34.   
  35.    
  36.   
  37.    v_pPWMregs->TCFG1 &= ~(0xf << 12);     /* Timer3's Divider Value*/  
  38.   
  39.    v_pPWMregs->TCFG1 |=  (1   << 12);     /* 1/4      */  
  40.   
  41.    v_pPWMregs->TCNTB3  =(10 * (g_s3c2410_pclk / (24+1) / TIMER3_DIVIDER )) / 1000;   /* InterruptFrequency*/  
  42.   
  43.     v_pPWMregs->TCMPB3= 0;       
  44.   
  45. }  


 

3. 2 获取触点位置相关.

 

找到下面几个宏定义:

 

  1. #define TSP_MINX                        85  
  2.   
  3. #define TSP_MINY                        105  
  4.   
  5. #define TSP_MAXX                        965  
  6.   
  7. #define TSP_MAXY                    980  


改为如下的值:

  1. #define TSP_MINX                        88  
  2.   
  3. #define TSP_MINY                        84  
  4.   
  5. #define TSP_MAXX                        952  
  6.   
  7. #define TSP_MAXY                        996  

上面几个是边界点,影响不是很大, 不过我还是按照原BSP的值做了修改.

 

TSP_TransXY和TSP_GetXY这两个函数是重点. 这两个函数决定了当你按下触摸屏时,系统获取的位置. 这两个函数如果没有写好,会出现类似你点了左边,右边有反应,或者你点了左上角,右下角有反应. 这两个函数的实现也和屏幕的分辨率有关.

TSP_TransXY的实现如下:

  1. PRIVATE void  
  2.   
  3. TSP_TransXY(INT *px, INT *py)  
  4.   
  5. {  
  6.   
  7.    
  8.   
  9. *px = (*px >= TSP_MAXX) ? (TSP_MAXX) : *px;  
  10.   
  11. *py = (*py >= TSP_MAXY) ? (TSP_MAXY) : *py;  
  12.   
  13.    
  14.   
  15. *px = (*px - TSP_MINX);  
  16.   
  17. *py = (*py - TSP_MINY);  
  18.   
  19.    
  20.   
  21. *px = (*px >= 0) ? *px : 0;  
  22.   
  23. *py = (*py >= 0) ? *py : 0;  
  24.   
  25.    
  26.   
  27. *px = *px * TSP_LCDY / (TSP_MAXX - TSP_MINX);  
  28.   
  29. *py = *py * TSP_LCDX / (TSP_MAXY - TSP_MINY);  
  30.   
  31.    
  32.   
  33. *px = (*px >= TSP_LCDY)? (TSP_LCDY - 1) : *px;  
  34.   
  35. *py = (*py >= TSP_LCDX)? (TSP_LCDX - 1) : *py;  
  36.   
  37.    
  38.   
  39. *px = TSP_LCDY - *px - 1;  
  40.   
  41. *py = TSP_LCDX - *py - 1;  
  42.   
  43. }  
  44.   
  45.    

 

其中,

TSP_LCDX= (LCD_YSIZE_TFT * 4);//240*4

TSP_LCDY= (LCD_XSIZE_TFT * 4);//320*4

在TSP_GetXY函数里找到下面两行:

  1. x= (0x3ff & v_pADCregs->ADCDAT1);  
  2.   
  3. y= 0x3ff - (0x3ff & v_pADCregs->ADCDAT0);  

 

改为:

  1. y= (0x3ff & v_pADCregs->ADCDAT1);  
  2.   
  3. x= (0x3ff & v_pADCregs->ADCDAT0);  

 

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

正常情况下,长按才是右击, 我的短按也会弹出快捷菜单. Csdn上问了,未果


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值