原创 触摸屏calibraty

2008-1-4 13:18 2948 4 4 分类: 软件与OS

原帖地址:http://publishblog.blogchina.com/blog/tb.b?diaryID=452249 


 


嵌入式系统设计中,触摸屏校正是必可可少的步骤。
三四天的心血啊!为了它圣诞都没耍痛快!

进行触摸屏的校正前,先要知道一点背景知识:
1、触摸屏的驱动:
内核中../drivers/chat/目录下有个文件好象是s2410_ts***
是触摸屏能正常工作的第一层处理:在这里把底层电路传来的信号处理成数字信号
2、qte的触摸屏的驱动
在/..src/embedded/中qmouselinuxtp_qws.cpp中


触摸屏起来以后就要进行校正
为什么要进行校正呢:
因为从设备得到的数据是物理屏的数据,比如s3c2410的触摸屏的ad转换是10位精度,也就是说物理数据从0~1023,在实际的情况中一般是 100~1000之间的数据,而我们的液晶屏是320*240(或者是其他的,这和触摸屏的数据没有任何的关系),所以必须将物理数据转换为屏幕上点的数据.他们之间的转换公式,就必须通过定标的方式来确定.
 所谓的定标,就是在屏幕上依次出现topleft,bottomleft,bottomright,topright和center一共5个点,用户必须依次在这5个点上点击(在触摸屏上点击,触摸屏就放在液晶屏的上方),这样我们得到了物理的点,也得到了对应的实际的点,因此就可以计算出相应的参数, 计算公式是:
 s = 1 << 16;


    a = s * (screen_tl.x() - screen_br.x() ) / (dev_tl.x() - dev_br.x());
    b = 0;
c = s * screen_tl.x() - a * dev_tl.x();


    d = 0;
    e = s * (screen_tl.y() - screen_br.y() ) / (dev_tl.y() - dev_br.y());
    f = s * screen_tl.y() - e * dev_tl.y();


 假设p是物理的数据,那么转换到屏幕上点的公式就是:
 x=(a * p.x() + b * p.y() + c) / s );
    y= (d * p.x() + e * p.y() + f) / s );


 需要注意的是:如果物理的点特别的不合常理,比如左边和右边的y的差值相差太大,说明屏的线性度太差,不会通过测试.


 S3c2410的触摸屏驱动是iPAQ兼容的驱动,编译的时候需要定义2个宏:
QWS_MOUSE_IPAQ,QWS_MOUSE_IPAQ_RAW.同时设定的是
 QWS_MOUSE_PROTO=Tpanel:/dev/h3600_tsraw

 上面列举的参数,会首先从文件/etc/pointercal中读取,这个文件格式就是:
 a b c d e f s
 如果屏的质量稳定,我们可以将测得的数据放在这个文件当中,并取消掉定标的过程,这样就可以每次使用默认的设置,而不需要重新计算了.

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条