首先是在Porting Tp驱动的时候要注意几个重要的的几个文件
(1)配置文件的设置
ProjectConfig.mk //mediatek/config/项目名/ProjectConfig.mk
主要配置的是所要porting tp 驱动的文件名 如CUSTOM_KERNEL_TOUCHPANEL = xx
单款tp的话跟一个文件驱动就行了,如果做的多款tp的话就跟多个文件驱动名就行,多款之间以空格分开
如XXX项目中多款tp驱动的兼容定义如下:
CUSTOM_KERNEL_TOUCHPANEL = tma568 st_fts ft5336 bt532
还有就是tp的中断管脚及时钟管脚的配置了,这个可以通过硬件设计的pcb电路图通过mtk提供的dws工具来配置
工具位置: mediatek/dct/DrvGen.exe
打开文件配置: mediatek/custom/Projectname/kernel/dct/dct/codegen.dws
(2)驱动源码文件及位置
一般驱动都是ic厂商写好提供驱动源码包给我们然后添加到我们所做的项目中,根据不同平台来修改部分的ic厂商给我们的驱动代码,比如高通平台移植到mtk平台,以及mtk平台不同型号芯片的移植。
驱动文件一般可能放在两个位置:
/mediatek/custom/common/kernel/touchpanel/驱动文件
或
/mediatek/custom/项目名/kernel/touchpanel/驱动文件
问题及总结
在调试Cypress Tp时由于这款tp的驱动是依照高通平台而写的驱动所以移植到mtk平台时遇到很多问题,下面列出几个在调试中遇到的问题及解决办法:
1)在调试时从log上看在i2c通信的时候一直报一个通信速度过快,但从其他兼容的tp上看i2c的通信都没有出现过这样的问题,最终判断可能是Cypress 的硬件不支持那样的i2c通信的速率.
解决办法:在i2c读写的时候通过设置改变i2c读写主系统时钟来解决该问题,从mtk6589文档上写关于i2c的默认速率是i2c_msg.timing=400 ,所以在i2c的读写数据时将i2c_msg.timing=100后解决此问题。
2)Tp调试时出现一个中断只来一次的问题,在调试过成中发现在只有在每次开机启动时才产生一次中断,也就是在刚初始化完毕后来了一次中断此后就没有再报有tp中断。
问题原因:通过和其他Tp驱动工程师交流找到了问题的所在,配置中断时没有配置好,mtk关于Tp中断的配置方面有两种方式,一个是中断产生处理由硬件自动开启关闭中断,另一个方式是需要在中断处理时软件手动的去开启和关闭中断。而我们采用的是手动去开启和关闭中断,但是在中断处理函数中却没有对开启和关闭中断做处理导致出现这样的问题,通过下面函数实现硬件或软件方式来处理中断。
mt65xx_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_EN, CUST_EINT_TOUCH_PANEL_POLARITY, eint_interrupt_handler, 1); //最后一个参数决定通过那种方式来处理中断 如果是1表示硬件在处理中断时自动开启和关闭中断,如果是0表示需要在中断处理函数中手动软件去开启和关闭中断。
解决办法: 将mt65xx_eint_registration函数最后一个参数设置为1让硬件自动开启和关闭中断。
3)TP能够正常报点,打开设置中的显示报点坐标也可以清晰的看到所触摸的点,但是屏幕始终没有响应点击。
问题原因:通过进入手机终端输入命令getevent发现有两个同名的tp设备被注册,并有两个event事件同时报点,通过检查驱动代码发现在驱动的prob函数对该设备进行了注册,然后再将注册的值反馈出去“tpd->dev = md->input;”但从mtk的设计上看在mtk_tpd.c中就已经对tp进行了注册,所以进入手机终端看会有两个相同的注册设备以及相同的报点事件导致报点不能被识别。导致这样的原因主要受到高通平台的驱动思维的影响。
解决办法:由于不对驱动代码有太大的改动而导致驱动不稳采用了一种比较折中的办法,将tpd->dev = md->input;这句屏蔽掉,并且改了一下注册驱动的名称,最后从手机终端看会有两个注册的tp设备,但报点只有一个满足了要求,上层也响应了点击事件。
4)TP 固件升级出现问题,在升级过程中一直读取设备信息失败,读取的数据一直报错不符合要求。
问题原因:在升级固件时写数据后会同时产生一个中断事件,而中断事件在处理时会去对设备的数据进行读取,从ic厂商给的数据手册上看,在读取设备hid信息时是可被中断打断的,但是从读取的结果来看不与相符,当中断读取信息完成后如果再次去读取时,读取的数据会变为空,所以在设备读取信息是一直报错,读取不到数据。
解决办法:在中断对于特殊情况写命令后对中断里数据进行限制性读,也就是在发送写命令读取设备信息时让中断里不读取数据,从而解决了该问题,成功的升级固件。