嵌入式系统触摸屏校准问题(WinCE+Linux)
时间:2010-12-07 来源:caijia20062352
WINCE和LINUX下触摸屏校准问题。
一:WINCE之校屏
WINCE的校屏参数是保存在注册表中的。打开BSP包中的platform.reg,找到如下代码:
view plaincopy to clipboardprint?
IF BSP_NOTOUCH !
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]
"MaxCalError"=dword:7
"CalibrationData"="626,464 1054,823 192,813 190,108 1070,104"
"Order"=dword:1
ENDIF BSP_NOTOUCH !
IF BSP_NOTOUCH !
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]
"MaxCalError"=dword:7
"CalibrationData"="626,464 1054,823 192,813 190,108 1070,104"
"Order"=dword:1
ENDIF BSP_NOTOUCH !
这里的CalibrationData即是校屏数据。由于WINCE开机后触摸偏移太大,根本没法点击进入校屏程序,有两种方法:
方法一:如果您手上有USB鼠标,将USB鼠标插入USB的HOST接口,这时就可以通过鼠标进入校屏界面了。点开始,控制面板,笔针。
方法二:这种方法不适合初学者,适合程序开发人员。首先同步开发板,将校屏应用程序拷到开发板某目录,再通过VS2005,任意打开一个应用程序,将程序入口指向拷备的应用程序,再F5,即运行了该校屏程序。详细步骤这里就不一一列举了。
校完屏后,如果校正的注册表丢失,再重烧系统后,又会出现偏移。批量生产时就更不用说了。那怎么办呢?其实,当您校完屏后,保存的校正数据已经保存起来了。通过remote register editer查看注册表信息,进入如下路径:
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH记录CalibrationData的数据,将platform.reg里的错误数据用该数据替换。注意,files目录下的和release目录下的platform.reg都要修改!更改后再make一下,生成的NK,就是正确的数据了。
二:LINUX之校屏
由于飞凌开发板默认没有校屏,但是引导linux系统后,已经进入shell界面了[QT界面],没有校准的过程。怎么办?通过DNW或者超级终端,进入linux的consloe,查看/etc下有个文件pointercal,删除该文件,reboot,系统将重启,自动进入校准界面。这时就可以校屏了。
如果这时校屏仍然无法成功,即反复的点击那个十字架不停,这是触摸屏驱动的问题,“修改以下代码:
/drivers/char/s3c2410ts.c中将static inline void s3c2410_get_XY(void)函数中的x,y值调换顺序。” 具体地:
static inline void s3c2410_get_XY(void)
{
if (adc_state == 0) {
adc_state = 1;
disable_ts_adc();
x = __raw_readl(S3C2410_ADCDAT1) & 0x3ff;//x:f04 y:f0e by pht.
mode_y_axis();
start_adc_y();
} else if (adc_state == 1) {
adc_state = 0;
disable_ts_adc();
y = __raw_readl(S3C2410_ADCDAT0) & 0x3ff;//y:f04 x:f0e by pht.
DPRINTK("PEN DOWN: x: %08d, y: %08d\n", x, y);
wait_up_int();
tsdev.penStatus = PEN_DOWN;
tsEvent();
}
}
static inline void s3c2410_get_XY(void)
{
if (adc_state == 0) {
adc_state = 1;
disable_ts_adc();
x = __raw_readl(S3C2410_ADCDAT1) & 0x3ff;//x:f04 y:f0e by pht.
mode_y_axis();
start_adc_y();
} else if (adc_state == 1) {
adc_state = 0;
disable_ts_adc();
y = __raw_readl(S3C2410_ADCDAT0) & 0x3ff;//y:f04 x:f0e by pht.
DPRINTK("PEN DOWN: x: %08d, y: %08d\n", x, y);
wait_up_int();
tsdev.penStatus = PEN_DOWN;
tsEvent();
}
}
将上面的代码改为
view plaincopy to clipboardprint?
static inline void s3c2410_get_XY(void)
{
if (adc_state == 0) {
adc_state = 1;
disable_ts_adc();
y = __raw_readl(S3C2410_ADCDAT1) & 0x3ff;//x:f04 y:f0e by pht.
mode_y_axis();
start_adc_y();
} else if (adc_state == 1) {
adc_state = 0;
disable_ts_adc();
x = __raw_readl(S3C2410_ADCDAT0) & 0x3ff;//y:f04 x:f0e by pht.
DPRINTK("PEN DOWN: x: %08d, y: %08d\n", x, y);
wait_up_int();
tsdev.penStatus = PEN_DOWN;
tsEvent();
}
}
static inline void s3c2410_get_XY(void)
{
if (adc_state == 0) {
adc_state = 1;
disable_ts_adc();
y = __raw_readl(S3C2410_ADCDAT1) & 0x3ff;//x:f04 y:f0e by pht.
mode_y_axis();
start_adc_y();
} else if (adc_state == 1) {
adc_state = 0;
disable_ts_adc();
x = __raw_readl(S3C2410_ADCDAT0) & 0x3ff;//y:f04 x:f0e by pht.
DPRINTK("PEN DOWN: x: %08d, y: %08d\n", x, y);
wait_up_int();
tsdev.penStatus = PEN_DOWN;
tsEvent();
}
}
编完驱动后更新kernel,重烧kernel,问题解决。
=====================
针对Qte-2.3.7的触摸屏配置
触摸屏配置
1交叉编译qte-2.3.7库
qconfig-local.h
1.#define QT_QWS_IPAQ
2.#define QT_QWS_IPAQ_RAW
2复制类库
cp libqte.so.2.3.7 libqte.so.2.3 libqte.so.2 libqte.so /目标板/程序类库
3配置启动shell
目标板/etc/init.d/rcS
if [ -e /dev/touchscreen/0 ]; then
ln –sf /dev/touchscreen/0 /dev/ts
fi
ln –sf /dev/ts /dev/h3600_tsraw
export QWS_MOUSE_PROTO=TPanel:/dev/h3600_tsraw
4生成效验文件
etc/pointrtcal
注:关于第3步因为板子不同启动也不一样,有的开发板在/usr/etc/rc.local下面,有的还在rc.local下做了一个. /testshell
直接放在了rootfs的根下面。
export QWS_MOUSE_PROTO=TPanel:/dev/h3600_tsraw
你可以根据你实际开发板的kernel检测硬件来改写,一般现有开发板触摸屏芯片为ad7843或7846都走的是spi总线在内核里也是在MCP2510里的代码