//=====================================================================
//TITLE:
// 在TCC89x使用AK4183触摸屏驱动
//AUTHOR:
// norains
//DATE:
// Monday 18October-2010
//Environment:
// TCC8900
// Windows CE 6.0
//=====================================================================
Telechips从TCC79x进化到TCC89x后,触摸屏驱动有了很大的改变,最明显的是可以直接使用GPIO来检测触摸屏触摸了。不过,可能是为了向后兼容,之前的TSC2003和AK4183也是可以用,不过却要进行一些设置。
DRIVERS文件夹有两个触摸屏的驱动,分别是Touch1和Touch2,后者是新的GPIO方式,而前者则是老旧的,适用于TSC2003和AK4183。现在就跟我一起来,让AK4183也能在TCC89x平台上重焕光彩吧!
1. ./Src/DRIVERS/dirs
该文件定义的是编译的驱动的文件夹。这里我们需要将Touch2改为Touch1。
2. ./Src/DRIVERS/Touch1/sources
该文件定义了需要进行编译的源文件,不知道为什么,默认没有将tca_ak4183tchctl.c给包含进去,所以我们必须手动添加,如:
SOURCES= /
tchmain.cpp /
tchbasic.cpp /
TouchPanel.cpp /
tcc_touch.c /
tca_tchcontrol.c /
tca_tchhwctl.c /
tca_tsc2003tchctl.c /
tca_ak4183tchctl.c /
3. ./Src/DRIVERS/Touch1/tca_tchhwctl.h
该文件主要是用来定义宏,以此来确定是使用TSC2003还是AK4183。因为我们这里使用的是AK4183,所以为了简单起见,我们直接在开头定义一个CONFIG_TOUCHSCREEN_TCC_AK4183宏,如:
#define CONFIG_TOUCHSCREEN_TCC_AK4183 #ifdef CONFIG_TOUCHSCREEN_TCC_AK4183 #define _TOUCH_AK4183_ #endif
4. ./Src/DRIVERS/Touch1/tcc_touch.c
这个文件主要是控制触摸屏的行为,不过原代码却有个bug。在tea_tch_readi2c函数中,居然调用tca_tsc2003_setreadcmd来获取AK4183的命令。这样的直接结果是,因为命令不匹配,所以AK4183的中断会一直没有恢复到HIGH,以致TCC89x一直在读取触摸屏数据。为了修正这个BUG,我们根据宏来做相应的处理,如:
short tea_tch_readi2c(int channel) { //…前略 #if defined(_TOUCH_AK4183_) sendParam.nWriteByte = 2; tca_ak4183_setreadcmd(channel, nBfrTXD); #else sendParam.nWriteByte = 1; tca_tsc2003_setreadcmd(channel, nBfrTXD); #endif //…后略 }
其实只是在原来的代码tca_tsc2003_setreadcmd前面增加宏判断以确认是调用哪个函数而已。
5. ./Src/DRIVERS/Touch1/TouchPanel.cpp
因为AK4183默认是接在I2C0上的,而代码中的通道是通过注册表获取的,但注册表指示的却是通道1,这个通道只能和TSC2003相匹配,却无法用到AK4183中,所以我们强制将通道设为0,如:
LONG DdsiTouchPanelAttach(VOID) { //…略 #ifdef _TOUCH_AK4183_ gI2CChNum = 0; #endif RETAILMSG(1, (TEXT("Touchpanel DRV :LCD Size = %dX%d,I2C Channel Num(%d)/r/n"),m_nScreenWidth,m_nScreenHeight,gI2CChNum)); return 1; }
当一切设置完毕,重新编译触摸屏驱动,则它会生成一个touch.dll文件,而这个无论是用GPIO方式,还是芯片模式,都是一样的。编译完毕,就可以下载到开发板去试试了。