接下来我们来看看具体的DDSI函数.
1.DdsiTouchPanelAttach和DdsiTouchPanelDetach
DLL entry进入或结束执行,这里不需要任何工作,直接返回0
2.DdsiTouchPanelEnable
DdsiTouchPanelEnable使能触摸屏并进行相应的初始化工作.
首先调用TSP_VirtualAlloc给寄存器(GPIO,ADC,INTR,PWM)分配虚拟地址空间.调用TSP_RegAlloc,而TSP_RegAlloc则调用VirtualAlloc和VirtualCopy进行分配虚拟地址.
TSP_VirtualAlloc:
TSP_RegAlloc:
然和调用KernelIoControl来申请ADC和TIMER3的逻辑中断号,获得CPU的时钟,从而计算出给Timer3的分频值.
最后调用TSP_PowerOn来初始化GPIO,ADC,INTR,TIMER3寄存器.
关于具体寄存器引脚的含义可以参考s3c2410的datasheet.
TSP_PowerOn:
DdsiTouchPanelEnable:
3.DdsiTouchPanelDisable
对应的就有DdsiTouchPanelDisable函数,将DdsiTouchPanelEnable申请的资源进行释放.屏蔽中断.
4.DdsiTouchPanelSetMode
DdsiTouchPanelSetMode用来设置触摸屏的采样率周期.函数传入TPSM_SAMPLERATE_LOW_ID或TPSM_SAMPLERATE_HIGH_ID来进行相应的设置.这里只有一个采样率周期,所以函数不做实际工作.
5.DdsiTouchPanelPowerHandler
DdsiTouchPanelPowerHandler用来通知驱动系统正进入或离开挂起状态.
参数bOff为TRUE表明系统正在关闭, FALSE表明系统正在开启.
该函数调用TSP_PowerOff和TSP_PowerOn来处理关闭或开启状态.
TSP_PowerOn前面已经看到了,TSP_PowerOff如下,屏蔽了INT_TC触摸屏中断(这里定义为IRQ_SUB_TC):
TSP_PowerOff:
DdsiTouchPanelPowerHandler:
6.DdsiTouchPanelGetDeviceCaps
DdsiTouchPanelGetDeviceCaps用来查询触摸屏设备的性能参数.
iIndex可能为以下3个参数:
TPDC_SAMPLE_RATE_ID: 返回采样周期,这里TSP_SAMPLE_RATE_LOW,TSP_SAMPLE_RATE_HIGH,TSP_CurRate都为100,即一直使用同一个采样周期.
TPDC_CALIBRATION_POINT_ID:返回需要校准点的XY坐标.校准点坐标索引在PointNumber(lpOutput传递的结构成员).调用TSP_CalibrationPointGet来获得.这5个点分别位于四个角和中间,也就是我们调用触摸屏校准程序时会调用到的函数.
TPDC_CALIBRATION_POINT_COUNT_ID:返回用来校准触摸屏的校准点数目.这里的数目设置为5.
lpOutput传递iIndex值对应的结构.
TPDC_SAMPLE_RATE_ID | Pointer to a TPDC_SAMPLE_RATE structure. |
TPDC_CALIBRATION_POINT_ID | Pointer to a TPDC_CALIBRATION_POINT structure. |
TPDC_CALIBRATION_POINT_COUNT_ID | Pointer to a TPDC_CALIBRATION_POINT_COUNT structure. |
用来计算校准触摸屏时的5个校准点的位置:
DdsiTouchPanelGetDeviceCaps:
7.DdsiTouchPanelGetPoint
返回最近查询点的信息,如坐标等.这个函数被TouchPanelpISR调用,而TouchPanelpISR就是触摸屏中断IST.在TouchPanelEnable中会进行中断线程IST的创建.TouchPanelpISR会等待hTouchPanelEvent事件的发生.hTouchPanelEvent关联了两个中断,触摸屏中断(INT_TC)和TIMER3中断.即触点中断和触点变化中断.当中断发生时,TouchPanelpISR调用DdsiTouchPanelGetPoint来获得采样点信息.
详情可参考tchmain.c(/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/TOUCH/TCHMAIN)
代码及注释如下:
TSP_GetXY:
TSP_GetXY从触摸屏的ADC寄存器读取触摸点数据,读4次计算平均值.
TSP_TransXY:
读到的坐标数据最终交由MDD层的函数进行诸如最小二乘法的数学运算,这里就不仔细分析了,有兴趣可以参考tchmdd.lib和tch_cal.lib里的代码(/WINCE500/PUBLIC/COMMON/OAK/DRIVERS).