在嵌入式系统中较为常用的是四线电阻式触摸屏,通过检测x轴和y轴的电压,来确定触点的位置。一般触摸屏系统结构为:触摸屏->触摸屏控制器->处理器。
wince7下触摸屏的驱动分为pdd层(位于bsp目录中)和mdd层(位于public目录中)。pdd层和mdd层通过ddsi接口函数连接,mdd层和上层通过ddi函数连接。其中mdd层一般无需修改,我们只需修改pdd层的代码。
比如我的bsp目录下触摸屏驱动中的touchscreenpdd.cpp文件中主要有如下函数:
tchpdd_init()
tchpdd_ioctl()
pddtouchist()
pddinitializehardware()
pddtouchpanelenable()
pddtouchpanelgetpoint()
pddcalibrationthread()
pddstartcalibrationthread()
pdddeinitailzehardware()
pddtouchpaneldisable()
其中tchpdd开头的函数就是ddsi函数,pdd开头的函数就是pdd层的函数。mdd层会最先调用tchpdd_init()函数,该函数会将ddsi函数以函数指针的形式传递给mdd层,并调用pdd层的函数进行必要的初始化,如调用pddinitializehardware()来初始化spi,gpio(我的触摸屏控制器使用spi接口),调用pddtouchpanelenable()来创建“触摸屏事件”,创建ist线程等。
ist线程函数pddtouchist()中会有一个while循环,如下图所示:
循环中有一个waitforsingleobject(,)函数。该函数有两个参数,第一个参数是“触摸屏事件”的句柄,第二个参数用来设置等待超时的时间。 ist线程执行到这个函数会等待“触摸屏事件”发生或者超时。当这两种情况之一发生后,线程就会往下执行,并调用 pddtouchpanelgetpoint()函数来读取触点坐标。在“触摸屏事件”发生之前,超时时间会设置为无限等待。只有当“触摸屏事件”发生后(触点按下)才会开始读坐标,并判断是否还是按下状态,如果还是按下状态,那么就会设置超时时间为某一个有限值,这样当 waitforsingleobject等待时间超过这个值后又会去读取坐标。这种机制就能保证我们能读取到触点移动的轨迹。
当然要想使用“触摸屏事件”,必须要有一个触摸屏的中断(当触点按下,这个中断发生),并将这个中断和“触摸屏事件”关联起来,这样中断发生后,才会触发“触摸屏事件”。
还有一种方法:不使用中断,直接采用轮询方式来读取坐标,通过读取坐标值的合法性来决定是否有触点按下。这种方式下,waitforsingleobject的第一个参数就不起作用,且第二个参数必须设为一个有限值,这个值就决定来轮询的频率。
如何在Linux中安装stat
IGBT在电力领域的广泛应用
通过改变常规阶跃折射率的大模场渐变折射率光纤设计
为什么电源设计转用48V?您需要了解什么?
自动驾驶视觉识别系统更容易识别白皮肤的人,黑人:种族歧视
技术干货:WinCE 7.0下的触摸屏驱动
一篇有关足球的可视化作品
Fedora项目团队宣布添加对树莓派2和3的系统支持
新能源汽车整车热管理数据采集系统的介绍
千元新宠魅蓝note5,美中不足依然值得入手
笔记本每日一贴——RAID
新款AirPods Pro售价1899元
理想汽车公布11月交付数据,实现25.8%巨大涨幅
RocketMQ在业务消息场景的优势有哪些呢?
RFID智能仓储管理解决方案
microchip宣布推出全新零漂移器件 进一步扩展其仪表放大器产品组合
条:马斯克15年内将培育恐龙,公牛集团遭反垄断调查
警惕这些“挂羊头卖狗肉”的高科技培训
74ls165应用电路图大全(三款74ls165应用电路)
启动电容和运转电容怎么选型_启动电容和运转电容选型详解