在将touchp的驱动移植到wince5下的时候遇到了一些问题。由于没有这块板子的现成的bsp包,只有一个touchp.cpp的文件(我的前任也还真够苟蛋的)。不过想想这也已经不错了,只有对照电路图和代码慢慢研究了。
我们这块板子的touchp是接在spi上的。TOUCH PANEL是SPI数据接口,板子有SPI接口,但是TOUCH PANEL是SPI DEVICE,要求以外部中断交互数据。
Pin 13, 设置为:data clk--spiclk0
Pin 14, 设置为:data out--spimosi0
Pin 15, 设置为:data in--spimiso0
Pin 16, 设置为:data cs--nss0
Pin 8, 中断请求: eint1
当然首先要配置上述3个pin的对应io为该function。中断也要配置好。接下来就是设置SPCON0和SPPIN0,其中设置SPCON0为master模式。touch的驱动(pdd)层要为上层(mdd层)提供几个ddsi接口:
DdsiTouchPanelGetDeviceCaps
DdsiTouchPanelSetMode
DdsiTouchPanelEnable
DdsiTouchPanelDisable
DdsiTouchPanelAttach
DdsiTouchPanelDetach
DdsiTouchPanelGetPoint
DdsiTouchPanelPowerHandler
上述的eint1为pen down的中断,将电平拉高,在下跳沿的时候触发中断。除此之外还要配置一个timer中断(本驱动中用到了timer1--10ms),它的作用是:当该中断触发的时候真正的去读SPRDAT0中的值。这两个中断在被done之前都要检查pen是否up了。第一个中断(pendown中断)如果done之前pen已经up了,则屏蔽掉timer1中断位,如果没有则启动timer1中断。一般情况下在你还没有up的时候第一个中断已经done了。
pen down的中断没有进行实质的操作,读取数据都是在timer的中断处理中进行的。这个还是比较麻烦的。大致看了下:x和y的数值都要取3次,然后进行比对,看偏差有多大,太大就淘汰了。然后在进行校正。至于对SPSTA0的读取操作,2440的用户手册上写的很清楚。
上述的两个中断处理都是在DdsiTouchPanelGetPoint中实现的,因为在mdd层的ist中如果SYSINT相关的事件到来就会直接去调用DdsiTouchPanelGetPoint。
由于两个中断都会调用一个事件,所以,在处理中断的时候要用到PDRIVER_GLOBALS这个结构体中的关于touchp的touchIrq和timerIrq,这两个值要在platform\common\src\arm\samsung\s3c2440a\intr\intr.c中的OEMInterruptHandler函数中对实际的IRQ处理的时候设置。PDRIVER_GLOBALS的变量直接映射到DRIVER_GLOBALS_PHYSICAL_MEMORY_START这个地址,所以可以直接对其进行赋值和读取操作。
在处理这个问题的时候我真是太土了,首先EINT1的中断配是配了,只是没有拉高。在拉高了之后竟然没有更改中断的触发方式,很明显应该是上升沿或者是下降沿触发的中断。害得我8月15的晚上(昨天)还要加班,还好今天搞定了。果然16的月亮比15的圆啊!