您的位置:首页 > 其它

Wince BSP从5.0移植到6.0(三)

2010-03-15 15:52 218 查看
转载请注明出处

作者:小马

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



1
在platform.bib里把原来注释掉的下面两行置为有效.
k.touch.dll         $(_FLATRELEASEDIR)/DeviceEmulator_touch.dll  NK SHK

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

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


2
到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);

 

 

   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上问了,未果.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: