触摸linux
A. linux 系统触摸屏从左上方到右下方跑偏越来越严重!怎么办
是device tree设置触摸屏接口(使用串口)设置成bufeer方式,改成收到数据就上传问题就解决了;说明一下善于用minicom调试串口工具,很好定位问题。
B. 如何在ARM Linux下使用多点触摸屏
我在3.2内核下做的,配合Xorg 1.2.4,Xinput2,Qt5.2.1。
首先,驱动程序probe的时候要声明成多点触摸的:
input_set_abs_params(input, ABS_X, 0, pdata->x_res - 1, 0, 0);
input_set_abs_params(input, ABS_Y, 0, pdata->y_res - 1, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_X,
0, pdata->x_res - 1, 0, 0);
input_set_abs_params(input, ABS_MT_POSITION_Y,
0, pdata->y_res - 1, 0, 0);
error = input_mt_init_slots(input, MAX_SUPPORT_POINTS);
pdata是board-[mach].c里面定义的platform data,如果是3.8以上的内核,你可以用device tree。
其次,提交触摸数据的时候,要提交成多点的:
for (i = 0; i < MAX_SUPPORT_POINTS; i++)
{
type = posdata.touch[i].xh >> 6;
if (type == TOUCH_EVENT_RESERVED)
continue;
x = ((posdata.touch[i].xh << 8) | (posdata.touch[i].xl)) & 0x0fff;
y = ((posdata.touch[i].yh << 8) | (posdata.touch[i].yl)) & 0x0fff;
id = (posdata.touch[i].yh >> 4) & 0x0f;
down = (type != TOUCH_EVENT_UP);
input_mt_slot(tsdata->input, id);
input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down);
if (!down)
continue;
input_report_abs(tsdata->input, ABS_MT_POSITION_X, x);
input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y);
}
input_mt_report_pointer_emulation(tsdata->input, true);
input_sync(tsdata->input);
然后,Buildroot做根文件系统的时候要选上Target packages > Libraries > Hardware handling > mtdev和Target packages > Graphic libraries and applications (graphic/text) > X.org X Window System > X11R7 Drivers > xf86-input-evdev,网上有很多文章说如何让X支持多点触摸的,那都是过去式了,现在的X和xf86-input-evdev都支持多点触摸。
最后,编译Qt开发包的时候要加上-xinput2选项,在qtbase/examples/touch里能找到触摸屏的样例代码。
C. 如何在Linux下禁用键盘,触摸板,鼠标等输入设备
用 xinput 来禁用/启用输入设备。我经常用 synclient 来关掉我的触摸板, 或者用 xinput 来关闭我的笔记本键盘。
第一步我们需要先拿到设备的名字或者ID:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ USB Optical Mouse id=8 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=7 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Power Button id=10 [slave keyboard (3)]
↳ Video Bus id=11 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=6 [slave keyboard (3)]
在这里触摸板的名字是 'SynPS/2 Synaptics TouchPad' ID是 7;
键盘的名字是 'AT Translated Set 2 keyboard' ID是 6.
下一步我们要知道设备都有什么属性:
$ xinput list-props 'AT Translated Set 2 keyboard'
Device 'AT Translated Set 2 keyboard':
Device Enabled (127): 1
键盘只有一个属性 'Device Enabled' 他的值是 1,意思就是说键盘是打开状态的。
我们来尝试关掉它:
sleep 0.1 ; xinput set-prop 'AT Translated Set 2 keyboard' 'Device Enabled' 0 ; sleep 5 ; xinput set-prop 'AT Translated Set 2 keyboard' 'Device Enabled' 1
开头 sleep 0.1 的目的是要留出时间让你执行当前命令时所敲的回车的按键(keypress)事件能够完成, 我猜测当你按下回车时命令就会执行并把键盘禁用,但是按键弹起(keyup)还没有被发送,所以X会以为你一直按这回车键。
另一个更简单的用法是用ID来进行操作,这样你就不需要输入一大长串的名字了:
sleep 0.1 ; xinput set-prop 8 127 0 ; sleep 5 ; xinput set-prop 8 127 1
键盘的ID是8, 属性 'Device Enabled' 的ID是127。 当你用 list-props 列出设备属性时, 在属性名后面的数字就是属性的ID。 像 'Device Enabled' 的ID总是 127,但是设备的ID就不一样,它跟设备的连接时间有关,一般越先连接的设备ID越小,之后会越来越大。
PS:设置设备属性不需要root权限。
D. linux下 触摸屏驱动加载后,只能单击,不能移动,要怎么解决
电阻屏吧。。。你自己数据上报机制问题。触摸屏按下 上报 启动一个延时timer 延时 timer 到 再继续上报数据 触摸屏抬起 上报事件结束 删除 timer 大概就是这样
E. 安装linux后触摸板不能用
1、在终端输入以下代码
sudo modprobe -r psmouse
sudo modprobe psmouse
重新加载相应模块后好了(对于这种情况不管用)
2、有可能是关机前触摸板就处于关闭状态,这种情况下先打开触摸板,再重启一次系统触摸板就能恢复工作 。
在终端输入以下代码
sudo modprobe -r psmouse
sudo modprobe psmouse proto=imps
sudo gedit /etc/modprobe.d/options
添加 options psmouse proto=imps
保存改动重启。