Linux系统下Libinput驱动的应用(主要在触摸屏校准)
2017-12-12 11:51
1921 查看
在浸泡在旧的解决问题方法的过去,突然来了个新的情况(LUbuntu17.10下实现触摸屏的校准),这让我想到
惊醒了某些沉睡的领导,老办法不行了,要学习研究新办法了。
于是任务来了。
经查文档之后发现, Ubuntu17.10以及Fedora 22等Linux系统都使用了整合evdev驱动之后的libinput驱动,之前的触摸校准的方式原理还是一样,配置方式还是一样,libinput需要的校准参数(A,B,C,D,E,F)不一样了,而evdev的校准参数(Xmin,Xmax,Ymin,Ymax);
找不到写的了,先贴下来:
链接:https://wayland.freedesktop.org/libinput/doc/latest/absolute_axes.html
Touchscreens
Absolute axes
Devices with absolute axes are those that send positioning data for an axis in a device-specific coordinate range, defined by a minimum and a maximum value.
Compare this to relative devices (e.g. a mouse) that can only detect directional data, not positional data.
libinput supports three types of devices with absolute axes:
multi-touch screens
single-touch screens
graphics tablets
Touchpads are technically absolute devices but libinput converts the axis values to directional motion and posts events as relative events. Touchpads do not count as absolute devices in libinput.
For all absolute devices in libinput, the default unit for x/y coordinates is in mm off the top left corner on the device, or more specifically off the device's sensor. If the device is physically
rotated from its natural position and this rotation was communicated to libinput (e.g. by
setting the device left-handed), the coordinate origin is the top left corner of in the current rotation.
In most use-cases, absolute input devices are mapped to a single screen. For direct input devices such as touchscreens the aspect ratio of the screen and the device match. Mapping the input device
position to the output position is thus a simple mapping between two coordinates. libinput provides the API for this with
libinput_event_pointer_get_absolute_x_transformed() for
pointer events
libinput_event_touch_get_x_transformed() for
touch events
libinput's API only provides the call to map into a single coordinate range. If the coordinate range has an offset, the compositor is responsible for applying that offset after the mapping. For
example, if the device is mapped to the right of two outputs, add the output offset to the transformed coordinate.
An absolute device that does not provide a valid resolution is considered buggy and must be fixed in the kernel. Some touchpad devices do not provide resolution, those devices are correctly handled
within libinput (touchpads are not absolute devices, as mentioned above).
Absolute devices may require calibration to map precisely into the output range required. This is done by setting a transformation matrix, see libinput_device_config_calibration_set_matrix() which
is applied to each input coordinate.
⎛⎝⎜cosθsinθ0−sinθcosθ0xoffyoff1⎞⎠⎟⎛⎝⎜xy1⎞⎠⎟
θ is
the rotation angle. The offsets xoff and yoff are
specified in device dimensions, i.e. a value of 1 equals one device width or height. Note that rotation applies to the device's origin, rotation usually requires an offset to move the coordinates back into the original range.
The most common matrices are:
90 degree clockwise: ⎛⎝⎜010−100101⎞⎠⎟
180 degree clockwise: ⎛⎝⎜−1000−10111⎞⎠⎟
270 degree clockwise: ⎛⎝⎜0−10100011⎞⎠⎟
reflection along y axis: ⎛⎝⎜−110000101⎞⎠⎟
See Wikipedia's Transformation Matrix article for more
information on the matrix maths. See libinput_device_config_calibration_get_default_matrix() for
how these matrices must be supplied to libinput.
Once applied, any x and y axis value has the calibration applied before it is made available to the caller. libinput does not provide access to the raw coordinates before the calibration is applied.
x/y are not given in normalized
coordinates ([0..1]) for one simple reason: the aspect ratio of virtually all current devices is something other than 1:1. A normalized axes thus is only useful to determine that the stylus is e.g. at 78% from the left, 34% from the top of the device.
Without knowing the per-axis resolution, these numbers are meaningless. Worse, calculation based on previous coordinates is simply wrong: a movement from 0/0 to 50%/50% is not a 45% degree line.
This could be alleviated by providing resolution and information about the aspect ratio to the caller. Which shifts processing and likely errors into the caller for little benefit. Providing the
x/y axes in mm from the outset removes these errors.
最后,还是利用最经典的三点校准算法,算出ABCDEF;然后,配置参数搞定。
“一个幽灵在欧洲的上空徘徊,XXXX的一声枪响”
惊醒了某些沉睡的领导,老办法不行了,要学习研究新办法了。于是任务来了。
经查文档之后发现, Ubuntu17.10以及Fedora 22等Linux系统都使用了整合evdev驱动之后的libinput驱动,之前的触摸校准的方式原理还是一样,配置方式还是一样,libinput需要的校准参数(A,B,C,D,E,F)不一样了,而evdev的校准参数(Xmin,Xmax,Ymin,Ymax);
找不到写的了,先贴下来:
链接:https://wayland.freedesktop.org/libinput/doc/latest/absolute_axes.html
Touchscreens
Absolute axes
Devices with absolute axes are those that send positioning data for an axis in a device-specific coordinate range, defined by a minimum and a maximum value.
Compare this to relative devices (e.g. a mouse) that can only detect directional data, not positional data.
libinput supports three types of devices with absolute axes:
multi-touch screens
single-touch screens
graphics tablets
Touchpads are technically absolute devices but libinput converts the axis values to directional motion and posts events as relative events. Touchpads do not count as absolute devices in libinput.
For all absolute devices in libinput, the default unit for x/y coordinates is in mm off the top left corner on the device, or more specifically off the device's sensor. If the device is physically
rotated from its natural position and this rotation was communicated to libinput (e.g. by
setting the device left-handed), the coordinate origin is the top left corner of in the current rotation.
Handling of absolute coordinates
In most use-cases, absolute input devices are mapped to a single screen. For direct input devices such as touchscreens the aspect ratio of the screen and the device match. Mapping the input deviceposition to the output position is thus a simple mapping between two coordinates. libinput provides the API for this with
libinput_event_pointer_get_absolute_x_transformed() for
pointer events
libinput_event_touch_get_x_transformed() for
touch events
libinput's API only provides the call to map into a single coordinate range. If the coordinate range has an offset, the compositor is responsible for applying that offset after the mapping. For
example, if the device is mapped to the right of two outputs, add the output offset to the transformed coordinate.
Devices without x/y resolution
An absolute device that does not provide a valid resolution is considered buggy and must be fixed in the kernel. Some touchpad devices do not provide resolution, those devices are correctly handledwithin libinput (touchpads are not absolute devices, as mentioned above).
Calibration of absolute devices
Absolute devices may require calibration to map precisely into the output range required. This is done by setting a transformation matrix, see libinput_device_config_calibration_set_matrix() whichis applied to each input coordinate.
⎛⎝⎜cosθsinθ0−sinθcosθ0xoffyoff1⎞⎠⎟⎛⎝⎜xy1⎞⎠⎟
θ is
the rotation angle. The offsets xoff and yoff are
specified in device dimensions, i.e. a value of 1 equals one device width or height. Note that rotation applies to the device's origin, rotation usually requires an offset to move the coordinates back into the original range.
The most common matrices are:
90 degree clockwise: ⎛⎝⎜010−100101⎞⎠⎟
180 degree clockwise: ⎛⎝⎜−1000−10111⎞⎠⎟
270 degree clockwise: ⎛⎝⎜0−10100011⎞⎠⎟
reflection along y axis: ⎛⎝⎜−110000101⎞⎠⎟
See Wikipedia's Transformation Matrix article for more
information on the matrix maths. See libinput_device_config_calibration_get_default_matrix() for
how these matrices must be supplied to libinput.
Once applied, any x and y axis value has the calibration applied before it is made available to the caller. libinput does not provide access to the raw coordinates before the calibration is applied.
Why x/y coordinates are not normalized
x/y are not given in normalizedcoordinates ([0..1]) for one simple reason: the aspect ratio of virtually all current devices is something other than 1:1. A normalized axes thus is only useful to determine that the stylus is e.g. at 78% from the left, 34% from the top of the device.
Without knowing the per-axis resolution, these numbers are meaningless. Worse, calculation based on previous coordinates is simply wrong: a movement from 0/0 to 50%/50% is not a 45% degree line.
This could be alleviated by providing resolution and information about the aspect ratio to the caller. Which shifts processing and likely errors into the caller for little benefit. Providing the
x/y axes in mm from the outset removes these errors.
最后,还是利用最经典的三点校准算法,算出ABCDEF;然后,配置参数搞定。
相关文章推荐
- linux设备驱动(三)--应用input子系统实现按键驱动
- 设置编译内核lib驱动及应用层dll的source文件 推荐
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- 关于STM32应用触摸屏校准原理的总结
- TRTOS触摸屏驱动的容差离散校准算…
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- 实例:触摸屏驱动-2.用input子系统报告事件 分类: linux_内核_input模型 2013-07-10 09:39 327人阅读 评论(0) 收藏
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- input子系统八之触摸屏驱动实例2(源码分析)
- 实例:触摸屏驱动-2.用input子系统报告事件
- input子系统——架构、驱动、应用
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- input子系统整体流程全面分析(触摸屏驱动为例)
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- 触摸屏的校准和应用
- 设置编译内核lib驱动及应用层dll的source文件
- 在触摸屏驱动中,通常在probe函数中会调用input_set_abs_params给设备的input_dev结构体初始化 ,上报点input_mt_sync(input);
- mini2440触摸屏驱动----非input子系统实现方法
- linux驱动由浅入深系列:输入子系统之三(应用层模拟input_event)