近期给客户调试一块数控板,今天客户带过来一个屏,并且有一个usb的触摸屏芯片接在屏上。屏很快就弄好正常显示。
触摸屏在内核下找到usb 触摸屏驱动,内核启动后这个usb转的触摸屏也正常找到,注册为event接口事件event0, cat /dev/event0,触摸屏幕有乱码输出,说明usb触摸屏驱动产生中断并且将采集数据上报input子系统了。
然后用我移植的tslib中有几个校准测试程序,运行,发现出现下面的错误:
selected device is not a touchscreen I understand
屏上出现校准界面,但是校准的5个点瞬间连了一遍程序就出错结束了。
多次尝试都是这个结果,我就插入一个usb的鼠标,识别产生event1,我就讲为tslib运行设置的环境变量中tslib的设备设为event1,再运行校准程序,发现现象跟触摸屏的一样。也就说tslib中应该是有容错处理,会先根据一些条件来判断这个环境变量指定的设备是否是一个真正的触摸屏设备。
想多无意,还是多看代码,于是在tslib源码中找到上面这句的出处如下:
static int check_fd(struct tslib_input *i)
{
struct tsdev *ts = i->module.dev;
int version;
u_int32_t bit;
u_int64_t absbit;
if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) &&
(version == EV_VERSION) &&
(ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&
(bit & (1 << EV_ABS)) &&
(ioctl(ts-&g