hi3531A tslib,qt4.6.2移植笔记(三)

上一篇文章中记录到Qt移植ok,移植了tslib1.4,最后在hi3531通过HDMI也可以出现Qt界面,只是tslib移植后无法校准,所以存在的问题就是电阻屏触摸不准。

现在记录解决过程:

1.使用的是USB接口的12.1寸电阻屏,EETI eGalax厂家的。内核用的是3.10.y版本的。最开始我从EETI官网http://www.egalax.com.tw/drivers.html下载了驱动。按照里面的说明修改了内核代码,但是运行eGTouchD文件总是出错,搞了半天也没解决问题,最终放弃了这个。

2.内核3.10.y中其实是自带usbtouchscreen.c驱动的,这个是针对USB接口的触摸屏的驱动,里面包含了很多厂家型号的,当然,也包含eGalax的。使能Device Drivers → Input device support → Touchscreens下的USB Touchscreen Driver和eGalax, eTurboTouch CT-410/510/700 device support选项。编译,下载。运行tslib 的工具ts_print_raw发现可以输出正确的坐标(关于坐标的调整见上一篇),但是最后的samp->pressure这一项总是0,输出格式为:

printf("%ld.%06ld: %6d %6d %6d\n", samp.tv.tv_sec, samp.tv.tv_usec, samp.x, samp.y, samp.pressure);

依次打印按下的时间,X坐标,Y坐标,按压值(一般来说按下输出1,没按下输出0),现在我这里总是输出0,肯定是内核驱动有问题。

3.检查usbtouchscreen.c驱动。在usbtouch_process_pkt函数中添加打印输出:

printk("BTN_TOUCH=%d,PRESS=%d,ABS_X=%d,ABS_Y=x%d\n",usbtouch->touch,usbtouch->press,usbtouch->x,usbtouch->y);

编译后,再运行ts_print_raw,发现打印结果中,BTN_TOUCH在按下时为1,松手后为0,是正确的;而PRESS却一直为0!怪不得tslib也是一直输出0。

static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch,unsigned char *pkt, int len)
{
	struct usbtouch_device_info *type = usbtouch->type;

	if (!type->read_data(usbtouch, pkt))
			return;
	input_report_key(usbtouch->input, BTN_TOUCH, usbtouch->touch);
	input_report_abs(usbtouch->input, ABS_X, usbtouch->x);
	input_report_abs(usbtouch->input, ABS_Y, usbtouch->y);
	input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press);
	input_sync(usbtouch->input);
}

可能是input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press);中没有正确输出按压值。此处根据usbtouch->touch的值强制输出0或1
if(usbtouch->touch > 0)
	input_report_abs(usbtouch->input, ABS_PRESSURE, 1);
else
	input_report_abs(usbtouch->input, ABS_PRESSURE, 0);
4.再次编译,运行ts_print_raw,即可正确输出坐标和按压值了。 这一步很关键,这一步不通的话,后面的ts_calibrate就无法校准。

二、生成校准文件

1.首先有一点,海思平台的fb0操作不同于其他平台,在打开fb0之前,首先要对MPP,VO等操作才可以操作fb0,否则会打开出错。

2.查看ts_calibrate.c文件,发现里面open_framebuffer中直接对fb0进行了打开,在这之前是没有对mpp和vo操作的。这样,我就将mpp和vo的初始化加到open_framebuffer之前。由于ts_calibrate中对fb0的配置跟hisi的不一样,导致英文字母,划线等函数都不能用。故我自己在VO操作后画了5个方格,大小为10像素,模拟ts_calibrate的5个十字格。注释了put_string_center,setcolor等函数。进入到get_sample函数中。注释掉put_cross,只留下getxy函数。进入到getxy函数,发现里面有这样的:

	do {
		if (index < MAX_SAMPLES-1)
			index++;
		if (ts_read_raw(ts, &samp[index], 1) < 0) {
			perror("ts_read");
			close_framebuffer ();
			exit(1);
		}
	} while (samp[index].pressure > 0);

这里while(samp[index].pressure >0)就跟我上面说到的联系到一起了,否则运行到这里也是一直等待的。

3.最后经过perform_calibration函数计算,就将校准值写入pointercal文件了。

4.最后重新编译ts_calibrate,运行,出现5个方块,依次左上,右上,右下,左下,中间点击方块,就将值写入pointercal文件。再打开qt界面,点击测试,确实很准!




你可能感兴趣的:(QT,linux驱动,Hi3531A)