树莓派(Linux 系统)
触摸屏
翻转显示以及触摸翻转 问题:未使用的Pi官方屏幕,所以使用HDMI屏幕显示的时候,显示
旋转的同时,触摸没有旋转 目的:旋转屏幕显示的同时,使得触摸也跟随旋转 *** 作总流程: 旋转90度 *** 作 翻转显示: 1.sudo nano /boot/config.txt 2.在文件末尾加入 display_rotate=0 display_rotate=1 //90° display_rotate=2 //180° display_rotate=3 //270° ctrl + o 保存文档 重启即可。 注:以下 *** 作皆为SSH *** 作,所以每条指令前都加了DISPLAY=:0,如果本机 *** 作删掉即可。 1.安装xinput sudo apt-get install xinput 2.列出所有输入设备信息 远程 *** 作时,使用xinput指令需要加入DISPLAY=:0 DISPLAY=:0 xinput --list 3.列出目标设备属性 DISPLAY=:0 xinput --list-props 7 4.旋转触摸的坐标轴 1)所以先交换x、y轴 DISPLAY=:0 xinput --set-prop '7' 'Evdev Axes Swap' 1 2)然后反转y轴 DISPLAY=:0 xinput --set-prop '7' 'Evdev Axis Inversion' 0 1 显示旋转修改之后需要重启。而触摸旋转不需要重启。 详细 *** 作方法: 1.安装xinput sudo apt-get install xinput 描述: xinput - utility to configure and test X input devices xinput-用于配置和测试X输入设备的实用程序 xinput is a utility to list available input devices, xinput是一个实用程序,可以列出可用的输入设备、 query information about a device and change input device settings. 关于设备的查询信息和更改输入设备设置 2.列出所有输入设备信息 xinput --list 如果远程 *** 作记得在命令前加DISPLAY=:0 得到以下信息: pi@NTGAGE:~ $ DISPLAY=:0 xinput --list ⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ Logitech USB Optical Mouse id=6 [slave pointer (2)] ⎜ ↳ WaveShare WaveShare Touchscreen id=7 [slave pointer (2)] ⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ Logitech USB Keyboard id=8 [slave keyboard (3)] ↳ Logitech USB Keyboard id=9 [slave keyboard (3)] 3.列出目标设备属性 由于所使用的触摸屏幕是微雪7寸屏幕,由以上信息可以得到微雪的触摸屏对应的ID为7 所以,接下来看这款输入设备的属性, pi@NTGAGE:~ $ DISPLAY=:0 xinput --list-props 7 Device 'WaveShare WaveShare Touchscreen': Device Enabled (115): 1 Coordinate Transformation Matrix (116): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 Device Accel Profile (240): 0 Device Accel Constant Deceleration (241): 1.000000 Device Accel Adaptive Deceleration (242): 1.000000 Device Accel Velocity Scaling (243): 10.000000 Device Product ID (244): 3823, 5 Device Node (245): "/dev/input/event3" Evdev Axis Inversion (246): 0, 0 Evdev Axis Calibration (247): <no items> Evdev Axes Swap (248): 0 Axis Labels (249): "Abs MT Position X" (267), "Abs MT Position Y" (268), "Abs MT Pressure" (269), "None" (0), "None" (0), "None" (0) Button Labels (250): "Button Unknown" (233), "Button Unknown" (233), "Button Unknown" (233), "Button Wheel Up" (121), "Button Wheel Down" (122) Evdev Scrolling Distance (251): 0, 0, 0 Evdev Middle Button Emulation (252): 0 Evdev Middle Button Timeout (253): 50 Evdev Third Button Emulation (254): 0 Evdev Third Button Emulation Timeout (255): 1000 Evdev Third Button Emulation Button (256): 3 Evdev Third Button Emulation Threshold (257): 20 Evdev Wheel Emulation (258): 0 Evdev Wheel Emulation Axes (259): 0, 0, 4, 5 Evdev Wheel Emulation Inertia (260): 10 Evdev Wheel Emulation Timeout (261): 200 Evdev Wheel Emulation Button (262): 4 Evdev Drag Lock Buttons (263): 0 这块屏幕正常显示和触摸的信息如上。 如果执行到这一步,发现并没有以上的Evdev等属性项,请跳转第2种方法。 现在需要达到的目的是在屏幕显示反转的同时,使得触摸也随显示翻转。 屏幕显示为翻转90度。/boot/config.txt设置为display_rotate=1 上述信息中Evdev Axis Inversion 项是每条轴的旋转设置项,后面第一个参数是x,第二个参数是y. Evdev Axes Swap项对应的是两条轴的交换。 0为不翻转,1为翻转 例如。x轴原本是朝向右的,当把Evdev Axis Inversion的第一个参数 设置为1,即x轴朝向左。 4.旋转触摸的坐标轴 现在目的是要触摸旋转90度,从坐标轴理解: 即目的x轴正向为初始y轴的反向。目的y轴的正方向为初始x轴的正向。 1)所以先交换x、y轴 DISPLAY=:0 xinput --set-prop '7' 'Evdev Axes Swap' 1 2)然后反转y轴 DISPLAY=:0 xinput --set-prop '7' 'Evdev Axis Inversion' 0 1 这样即可完成触摸旋转90度。若要旋转其他角度,推理一下即可。 显示旋转修改之后需要重启。而触摸旋转不需要重启。 第二种方法 如果查询到的信息如下 DISPLAY=:0 xinput --list-props 6 Device 'WaveShare WaveShare Touchscreen': Device Enabled (114): 1 Coordinate Transformation Matrix (115): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 libinput Calibration Matrix (246): 0.000000, 1.000000, 0.000000, -1.000000, 0.000000, 1.000000, 0.000000, 0.000000, 1.000000 libinput Calibration Matrix Default (247): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 libinput Send Events Modes Available (248): 1, 0 libinput Send Events Mode Enabled (249): 0, 0 libinput Send Events Mode Enabled Default (250): 0, 0 Device Node (251): "/dev/input/event0" Device Product ID (252): 3823, 5 可以看到该驱动方式采用的是libinput, 查看/usr/share/X11/xorg.conf.d/目录下是否有40-libinput.conf这个文件。 无 则需要安装 sudo apt-get install xserver-xorg-input-libinput 下一步安装完成后ls一下,就可以看到在/usr/share/X11/xorg.conf.d/目录下存在该文件, 下一步复制该文件到/etc/X11/xorg.conf.d/目录下。 一开始xorg.conf.d这个目录在/etc/X11可能没有,需要自己创建。 sudo mkdir xorg.conf.d 下一步复制到xorg.conf.d 目录下即可。 sudo cp /usr/share/X11/xorg.conf.d/40-libinput.conf /etc/X11/xorg.conf.d/ 下一步进入/etc/X11/xorg.conf.d/目录下修改40-libinput.conf 文件 cd /etc/X11/xorg.conf.d/ sudo nano 40-libinput.conf 找到touchscreen section Section "InputClass" Identifier "libinput touchscreen catchall" MatchIsTouchscreen "on" MatchDevicePath "/dev/input/event*" Driver "libinput" EndSection 添加一行 Option "CalibrationMatrix" "0 1 0 -1 0 1 0 0 1 结果为 Section "InputClass" Identifier "libinput touchscreen catchall" Option "CalibrationMatrix" "0 1 0 -1 0 1 0 0 1 MatchIsTouchscreen "on" MatchDevicePath "/dev/input/event*" Driver "libinput"EndSection然后重启生效 这样的修改也是同样修改为翻转90度,如果需要修改为其他角度,请参考libinput的算法 https://wayland.freedesktop.org/libinput/doc/latest/absolute_axes.html我在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 = 0i <MAX_SUPPORT_POINTSi++)
{
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里能找到触摸屏的样例代码。
评论列表(0条)