Loading Documentation/input/multi-touch-protocol.txt +92 −26 Original line number Original line Diff line number Diff line Loading @@ -162,26 +162,48 @@ are divided into categories, to allow for partial implementation. The minimum set consists of ABS_MT_POSITION_X and ABS_MT_POSITION_Y, which minimum set consists of ABS_MT_POSITION_X and ABS_MT_POSITION_Y, which allows for multiple contacts to be tracked. If the device supports it, the allows for multiple contacts to be tracked. If the device supports it, the ABS_MT_TOUCH_MAJOR and ABS_MT_WIDTH_MAJOR may be used to provide the size ABS_MT_TOUCH_MAJOR and ABS_MT_WIDTH_MAJOR may be used to provide the size of the contact area and approaching contact, respectively. of the contact area and approaching tool, respectively. The TOUCH and WIDTH parameters have a geometrical interpretation; imagine The TOUCH and WIDTH parameters have a geometrical interpretation; imagine looking through a window at someone gently holding a finger against the looking through a window at someone gently holding a finger against the glass. You will see two regions, one inner region consisting of the part glass. You will see two regions, one inner region consisting of the part of the finger actually touching the glass, and one outer region formed by of the finger actually touching the glass, and one outer region formed by the perimeter of the finger. The diameter of the inner region is the the perimeter of the finger. The center of the touching region (a) is ABS_MT_TOUCH_MAJOR, the diameter of the outer region is ABS_MT_POSITION_X/Y and the center of the approaching finger (b) is ABS_MT_WIDTH_MAJOR. Now imagine the person pressing the finger harder ABS_MT_TOOL_X/Y. The touch diameter is ABS_MT_TOUCH_MAJOR and the finger against the glass. The inner region will increase, and in general, the diameter is ABS_MT_WIDTH_MAJOR. Now imagine the person pressing the finger ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR, which is always smaller than harder against the glass. The touch region will increase, and in general, unity, is related to the contact pressure. For pressure-based devices, the ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR, which is always smaller than unity, is related to the contact pressure. For pressure-based devices, ABS_MT_PRESSURE may be used to provide the pressure on the contact area ABS_MT_PRESSURE may be used to provide the pressure on the contact area instead. Devices capable of contact hovering can use ABS_MT_DISTANCE to instead. Devices capable of contact hovering can use ABS_MT_DISTANCE to indicate the distance between the contact and the surface. indicate the distance between the contact and the surface. In addition to the MAJOR parameters, the oval shape of the contact can be described by adding the MINOR parameters, such that MAJOR and MINOR are the Linux MT Win8 major and minor axis of an ellipse. Finally, the orientation of the oval __________ _______________________ shape can be describe with the ORIENTATION parameter. / \ | | / \ | | / ____ \ | | / / \ \ | | \ \ a \ \ | a | \ \____/ \ | | \ \ | | \ b \ | b | \ \ | | \ \ | | \ \ | | \ / | | \ / | | \ / | | \__________/ |_______________________| In addition to the MAJOR parameters, the oval shape of the touch and finger regions can be described by adding the MINOR parameters, such that MAJOR and MINOR are the major and minor axis of an ellipse. The orientation of the touch ellipse can be described with the ORIENTATION parameter, and the direction of the finger ellipse is given by the vector (a - b). For type A devices, further specification of the touch shape is possible For type A devices, further specification of the touch shape is possible via ABS_MT_BLOB_ID. via ABS_MT_BLOB_ID. Loading Loading @@ -224,7 +246,7 @@ tool. Omit if circular [4]. The above four values can be used to derive additional information about The above four values can be used to derive additional information about the contact. The ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR approximates the contact. The ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR approximates the notion of pressure. The fingers of the hand and the palm all have the notion of pressure. The fingers of the hand and the palm all have different characteristic widths [1]. different characteristic widths. ABS_MT_PRESSURE ABS_MT_PRESSURE Loading @@ -240,17 +262,24 @@ the contact is hovering above the surface. ABS_MT_ORIENTATION ABS_MT_ORIENTATION The orientation of the ellipse. The value should describe a signed quarter The orientation of the touching ellipse. The value should describe a signed of a revolution clockwise around the touch center. The signed value range quarter of a revolution clockwise around the touch center. The signed value is arbitrary, but zero should be returned for a finger aligned along the Y range is arbitrary, but zero should be returned for an ellipse aligned with axis of the surface, a negative value when finger is turned to the left, and the Y axis of the surface, a negative value when the ellipse is turned to a positive value when finger turned to the right. When completely aligned with the left, and a positive value when the ellipse is turned to the the X axis, the range max should be returned. Orientation can be omitted right. When completely aligned with the X axis, the range max should be if the touching object is circular, or if the information is not available returned. in the kernel driver. Partial orientation support is possible if the device can distinguish between the two axis, but not (uniquely) any values in Touch ellipsis are symmetrical by default. For devices capable of true 360 between. In such cases, the range of ABS_MT_ORIENTATION should be [0, 1] degree orientation, the reported orientation must exceed the range max to [4]. indicate more than a quarter of a revolution. For an upside-down finger, range max * 2 should be returned. Orientation can be omitted if the touch area is circular, or if the information is not available in the kernel driver. Partial orientation support is possible if the device can distinguish between the two axis, but not (uniquely) any values in between. In such cases, the range of ABS_MT_ORIENTATION should be [0, 1] [4]. ABS_MT_POSITION_X ABS_MT_POSITION_X Loading @@ -260,6 +289,23 @@ ABS_MT_POSITION_Y The surface Y coordinate of the center of the touching ellipse. The surface Y coordinate of the center of the touching ellipse. ABS_MT_TOOL_X The surface X coordinate of the center of the approaching tool. Omit if the device cannot distinguish between the intended touch point and the tool itself. ABS_MT_TOOL_Y The surface Y coordinate of the center of the approaching tool. Omit if the device cannot distinguish between the intended touch point and the tool itself. The four position values can be used to separate the position of the touch from the position of the tool. If both positions are present, the major tool axis points towards the touch point [1]. Otherwise, the tool axes are aligned with the touch axes. ABS_MT_TOOL_TYPE ABS_MT_TOOL_TYPE The type of approaching tool. A lot of kernel drivers cannot distinguish The type of approaching tool. A lot of kernel drivers cannot distinguish Loading Loading @@ -305,6 +351,28 @@ The range of ABS_MT_ORIENTATION should be set to [0, 1], to indicate that the device can distinguish between a finger along the Y axis (0) and a the device can distinguish between a finger along the Y axis (0) and a finger along the X axis (1). finger along the X axis (1). For win8 devices with both T and C coordinates, the position mapping is ABS_MT_POSITION_X := T_X ABS_MT_POSITION_Y := T_Y ABS_MT_TOOL_X := C_X ABS_MT_TOOL_X := C_Y Unfortunately, there is not enough information to specify both the touching ellipse and the tool ellipse, so one has to resort to approximations. One simple scheme, which is compatible with earlier usage, is: ABS_MT_TOUCH_MAJOR := min(X, Y) ABS_MT_TOUCH_MINOR := <not used> ABS_MT_ORIENTATION := <not used> ABS_MT_WIDTH_MAJOR := min(X, Y) + distance(T, C) ABS_MT_WIDTH_MINOR := min(X, Y) Rationale: We have no information about the orientation of the touching ellipse, so approximate it with an inscribed circle instead. The tool ellipse should align with the the vector (T - C), so the diameter must increase with distance(T, C). Finally, assume that the touch diameter is equal to the tool thickness, and we arrive at the formulas above. Finger Tracking Finger Tracking --------------- --------------- Loading Loading @@ -338,9 +406,7 @@ subsequent events of the same type refer to different fingers. For example usage of the type A protocol, see the bcm5974 driver. For For example usage of the type A protocol, see the bcm5974 driver. For example usage of the type B protocol, see the hid-egalax driver. example usage of the type B protocol, see the hid-egalax driver. [1] With the extension ABS_MT_APPROACH_X and ABS_MT_APPROACH_Y, the [1] Also, the difference (TOOL_X - POSITION_X) can be used to model tilt. difference between the contact position and the approaching tool position could be used to derive tilt. [2] The list can of course be extended. [2] The list can of course be extended. [3] The mtdev project: http://bitmath.org/code/mtdev/. [3] The mtdev project: http://bitmath.org/code/mtdev/. [4] See the section on event computation. [4] See the section on event computation. Loading drivers/input/input-mt.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -135,7 +135,7 @@ EXPORT_SYMBOL(input_mt_report_finger_count); */ */ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count) void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count) { { struct input_mt_slot *oldest = 0; struct input_mt_slot *oldest = NULL; int oldid = dev->trkid; int oldid = dev->trkid; int count = 0; int count = 0; int i; int i; Loading Loading
Documentation/input/multi-touch-protocol.txt +92 −26 Original line number Original line Diff line number Diff line Loading @@ -162,26 +162,48 @@ are divided into categories, to allow for partial implementation. The minimum set consists of ABS_MT_POSITION_X and ABS_MT_POSITION_Y, which minimum set consists of ABS_MT_POSITION_X and ABS_MT_POSITION_Y, which allows for multiple contacts to be tracked. If the device supports it, the allows for multiple contacts to be tracked. If the device supports it, the ABS_MT_TOUCH_MAJOR and ABS_MT_WIDTH_MAJOR may be used to provide the size ABS_MT_TOUCH_MAJOR and ABS_MT_WIDTH_MAJOR may be used to provide the size of the contact area and approaching contact, respectively. of the contact area and approaching tool, respectively. The TOUCH and WIDTH parameters have a geometrical interpretation; imagine The TOUCH and WIDTH parameters have a geometrical interpretation; imagine looking through a window at someone gently holding a finger against the looking through a window at someone gently holding a finger against the glass. You will see two regions, one inner region consisting of the part glass. You will see two regions, one inner region consisting of the part of the finger actually touching the glass, and one outer region formed by of the finger actually touching the glass, and one outer region formed by the perimeter of the finger. The diameter of the inner region is the the perimeter of the finger. The center of the touching region (a) is ABS_MT_TOUCH_MAJOR, the diameter of the outer region is ABS_MT_POSITION_X/Y and the center of the approaching finger (b) is ABS_MT_WIDTH_MAJOR. Now imagine the person pressing the finger harder ABS_MT_TOOL_X/Y. The touch diameter is ABS_MT_TOUCH_MAJOR and the finger against the glass. The inner region will increase, and in general, the diameter is ABS_MT_WIDTH_MAJOR. Now imagine the person pressing the finger ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR, which is always smaller than harder against the glass. The touch region will increase, and in general, unity, is related to the contact pressure. For pressure-based devices, the ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR, which is always smaller than unity, is related to the contact pressure. For pressure-based devices, ABS_MT_PRESSURE may be used to provide the pressure on the contact area ABS_MT_PRESSURE may be used to provide the pressure on the contact area instead. Devices capable of contact hovering can use ABS_MT_DISTANCE to instead. Devices capable of contact hovering can use ABS_MT_DISTANCE to indicate the distance between the contact and the surface. indicate the distance between the contact and the surface. In addition to the MAJOR parameters, the oval shape of the contact can be described by adding the MINOR parameters, such that MAJOR and MINOR are the Linux MT Win8 major and minor axis of an ellipse. Finally, the orientation of the oval __________ _______________________ shape can be describe with the ORIENTATION parameter. / \ | | / \ | | / ____ \ | | / / \ \ | | \ \ a \ \ | a | \ \____/ \ | | \ \ | | \ b \ | b | \ \ | | \ \ | | \ \ | | \ / | | \ / | | \ / | | \__________/ |_______________________| In addition to the MAJOR parameters, the oval shape of the touch and finger regions can be described by adding the MINOR parameters, such that MAJOR and MINOR are the major and minor axis of an ellipse. The orientation of the touch ellipse can be described with the ORIENTATION parameter, and the direction of the finger ellipse is given by the vector (a - b). For type A devices, further specification of the touch shape is possible For type A devices, further specification of the touch shape is possible via ABS_MT_BLOB_ID. via ABS_MT_BLOB_ID. Loading Loading @@ -224,7 +246,7 @@ tool. Omit if circular [4]. The above four values can be used to derive additional information about The above four values can be used to derive additional information about the contact. The ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR approximates the contact. The ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR approximates the notion of pressure. The fingers of the hand and the palm all have the notion of pressure. The fingers of the hand and the palm all have different characteristic widths [1]. different characteristic widths. ABS_MT_PRESSURE ABS_MT_PRESSURE Loading @@ -240,17 +262,24 @@ the contact is hovering above the surface. ABS_MT_ORIENTATION ABS_MT_ORIENTATION The orientation of the ellipse. The value should describe a signed quarter The orientation of the touching ellipse. The value should describe a signed of a revolution clockwise around the touch center. The signed value range quarter of a revolution clockwise around the touch center. The signed value is arbitrary, but zero should be returned for a finger aligned along the Y range is arbitrary, but zero should be returned for an ellipse aligned with axis of the surface, a negative value when finger is turned to the left, and the Y axis of the surface, a negative value when the ellipse is turned to a positive value when finger turned to the right. When completely aligned with the left, and a positive value when the ellipse is turned to the the X axis, the range max should be returned. Orientation can be omitted right. When completely aligned with the X axis, the range max should be if the touching object is circular, or if the information is not available returned. in the kernel driver. Partial orientation support is possible if the device can distinguish between the two axis, but not (uniquely) any values in Touch ellipsis are symmetrical by default. For devices capable of true 360 between. In such cases, the range of ABS_MT_ORIENTATION should be [0, 1] degree orientation, the reported orientation must exceed the range max to [4]. indicate more than a quarter of a revolution. For an upside-down finger, range max * 2 should be returned. Orientation can be omitted if the touch area is circular, or if the information is not available in the kernel driver. Partial orientation support is possible if the device can distinguish between the two axis, but not (uniquely) any values in between. In such cases, the range of ABS_MT_ORIENTATION should be [0, 1] [4]. ABS_MT_POSITION_X ABS_MT_POSITION_X Loading @@ -260,6 +289,23 @@ ABS_MT_POSITION_Y The surface Y coordinate of the center of the touching ellipse. The surface Y coordinate of the center of the touching ellipse. ABS_MT_TOOL_X The surface X coordinate of the center of the approaching tool. Omit if the device cannot distinguish between the intended touch point and the tool itself. ABS_MT_TOOL_Y The surface Y coordinate of the center of the approaching tool. Omit if the device cannot distinguish between the intended touch point and the tool itself. The four position values can be used to separate the position of the touch from the position of the tool. If both positions are present, the major tool axis points towards the touch point [1]. Otherwise, the tool axes are aligned with the touch axes. ABS_MT_TOOL_TYPE ABS_MT_TOOL_TYPE The type of approaching tool. A lot of kernel drivers cannot distinguish The type of approaching tool. A lot of kernel drivers cannot distinguish Loading Loading @@ -305,6 +351,28 @@ The range of ABS_MT_ORIENTATION should be set to [0, 1], to indicate that the device can distinguish between a finger along the Y axis (0) and a the device can distinguish between a finger along the Y axis (0) and a finger along the X axis (1). finger along the X axis (1). For win8 devices with both T and C coordinates, the position mapping is ABS_MT_POSITION_X := T_X ABS_MT_POSITION_Y := T_Y ABS_MT_TOOL_X := C_X ABS_MT_TOOL_X := C_Y Unfortunately, there is not enough information to specify both the touching ellipse and the tool ellipse, so one has to resort to approximations. One simple scheme, which is compatible with earlier usage, is: ABS_MT_TOUCH_MAJOR := min(X, Y) ABS_MT_TOUCH_MINOR := <not used> ABS_MT_ORIENTATION := <not used> ABS_MT_WIDTH_MAJOR := min(X, Y) + distance(T, C) ABS_MT_WIDTH_MINOR := min(X, Y) Rationale: We have no information about the orientation of the touching ellipse, so approximate it with an inscribed circle instead. The tool ellipse should align with the the vector (T - C), so the diameter must increase with distance(T, C). Finally, assume that the touch diameter is equal to the tool thickness, and we arrive at the formulas above. Finger Tracking Finger Tracking --------------- --------------- Loading Loading @@ -338,9 +406,7 @@ subsequent events of the same type refer to different fingers. For example usage of the type A protocol, see the bcm5974 driver. For For example usage of the type A protocol, see the bcm5974 driver. For example usage of the type B protocol, see the hid-egalax driver. example usage of the type B protocol, see the hid-egalax driver. [1] With the extension ABS_MT_APPROACH_X and ABS_MT_APPROACH_Y, the [1] Also, the difference (TOOL_X - POSITION_X) can be used to model tilt. difference between the contact position and the approaching tool position could be used to derive tilt. [2] The list can of course be extended. [2] The list can of course be extended. [3] The mtdev project: http://bitmath.org/code/mtdev/. [3] The mtdev project: http://bitmath.org/code/mtdev/. [4] See the section on event computation. [4] See the section on event computation. Loading
drivers/input/input-mt.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -135,7 +135,7 @@ EXPORT_SYMBOL(input_mt_report_finger_count); */ */ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count) void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count) { { struct input_mt_slot *oldest = 0; struct input_mt_slot *oldest = NULL; int oldid = dev->trkid; int oldid = dev->trkid; int count = 0; int count = 0; int i; int i; Loading