[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] [PATCH v1 2/2] xen/kbdif: add multi-touch support
On 01/21/2017 01:01 AM, Stefano Stabellini wrote:
On Fri, 20 Jan 2017, Oleksandr Andrushchenko wrote:
On 01/20/2017 07:52 PM, Stefano Stabellini wrote:
On Fri, 20 Jan 2017, Oleksandr Andrushchenko wrote:
On 01/20/2017 12:22 AM, Stefano Stabellini wrote:
On Thu, 19 Jan 2017, Oleksandr Andrushchenko wrote:
From: Oleksandr Andrushchenko <Oleksandr_Andrushchenko@xxxxxxxx>
Signed-off-by: Oleksandr Andrushchenko
<Oleksandr_Andrushchenko@xxxxxxxx>
---
xen/include/public/io/kbdif.h | 216
++++++++++++++++++++++++++++++++++++++++++
1 file changed, 216 insertions(+)
diff --git a/xen/include/public/io/kbdif.h
b/xen/include/public/io/kbdif.h
index c00faa3af5d2..8d8ba9af1cb1 100644
--- a/xen/include/public/io/kbdif.h
+++ b/xen/include/public/io/kbdif.h
@@ -57,6 +57,12 @@
* Backends, which support reporting of absolute coordinates
for
pointer
* device should set this to 1.
*
+ * feature-multi-touch
+ * Values: <uint>
+ *
+ * Backends, which support reporting of multi-touch events
+ * should set this to 1.
+ *
*------------------------- Pointer Device Parameters
------------------------
*
* width
@@ -87,6 +93,11 @@
* Request backend to report absolute pointer coordinates
* (XENKBD_TYPE_POS) instead of relative ones
(XENKBD_TYPE_MOTION).
*
+ * request-multi-touch
+ * Values: <uint>
+ *
+ * Request backend to report multi-touch events.
+ *
*----------------------- Request Transport Parameters
-----------------------
*
* event-channel
@@ -106,6 +117,30 @@
*
* OBSOLETE, not recommended for use.
* PFN of the shared page.
+ *
+ *----------------------- Multi-touch Device Parameters
-----------------------
+ *
+ * Every multi-touch input device uses a dedicated event
frontend/backend
+ * connection configured via XenStore properties under
+ * XENKBD_PATH_MTOUCH folder.
This sentence doesn't seem to match the rest of the patch:
lets break it into smaller parts
it looks
like multi-touch devices use the same ring and evtchn used by the
pointer and keyboard.
*Every* multi-touch input device uses a *dedicated* event frontend/backend
*connection*
So, it is clearly stated that there is a dedicated/separate connection
(which consists of a ring and corresponding event channel: here we have
already discussed this part:
http://marc.info/?l=xen-devel&m=148412731428686):
+ * Every multi-touch input device uses a dedicated event ring and
is
For clarity I would say "Every multi-touch input device uses a
dedicated
frontend/backend connection". That includes a ring, an event
channel,
and xenstore entries.
Also, it is not clear whether multiple multitouch devices are supported
with a single frontend/backend connection (as you described in
http://marc.info/?l=xen-devel&m=148412731428686) or not. Please clarify.
Same as above:
*Every* multi-touch input device uses a *dedicated* event frontend/backend
*connection*
If only one device is supported, do we need a XENKBD_PATH_MTOUCH folder?
For consistency and simplicity: at
http://marc.info/?l=xen-devel&m=148412731428686 I have an example of how
XenStore entries look like. If you define multiple mtouch devices then
you'll
iterate over folder contents, e.g.
/local/domain/11/device/vkbd/0/mtouch/0/width = "3200"
/local/domain/11/device/vkbd/0/mtouch/1/width = "6400"
So, you'll have something like for (i = 0; i < num_mtouch_devices; i++) {
process(i); } If you have a single mtouch device nothing changes. Thus, I
see
no reason in making any difference for single or multiple-devices.
All right. I got confused because I read first the other email where you
still suggested to use the other approach. Sorry. The wording is clear
enough.
No problem, glad we are on the same page now
Aside from clarity, XENKBD_PATH_MTOUCH is important to distinguish the
width and height parameters of the mtouch device from the ones of the
pointers device, is that right?
Exactly. Also for ring-ref and event-channel
Sorry, now I am confused again :-S
In the mail-thread you mentioned above there is a picture of
the xenstore entries and conclusion:
1. No change to the existing kbd+ptr:
1.1. They still share a dedicated (single) connection
channel as they did before multi-touch: page-ref + event-channel:
/local/domain/2/device/vkbd/0/page-ref = "1248025"
/local/domain/2/device/vkbd/0/page-gref = "336"
/local/domain/2/device/vkbd/0/event-channel = "43"
1.2. No multi-touch events via that connection
1.3. Old backends/frontends will see no difference
after multi-touch
2. Each multi-touch device has its own:
2.1. Configuration (width x height, num-contacts)
2.2. Own connection channel (page-ref, event-channel)
/local/domain/2/device/vkbd/0/mtouch/0/width = "3200"
/local/domain/2/device/vkbd/0/mtouch/0/height = "3200"
/local/domain/2/device/vkbd/0/mtouch/0/num-contacts = "5"
/local/domain/2/device/vkbd/0/mtouch/0/page-ref = "1252386"
/local/domain/2/device/vkbd/0/mtouch/0/page-gref = "335"
/local/domain/2/device/vkbd/0/mtouch/0/event-channel = "44"
/local/domain/2/device/vkbd/0/mtouch/1/width = "6400"
/local/domain/2/device/vkbd/0/mtouch/1/height = "6400"
/local/domain/2/device/vkbd/0/mtouch/1/num-contacts = "10"
/local/domain/2/device/vkbd/0/mtouch/1/page-ref = "2376038"
/local/domain/2/device/vkbd/0/mtouch/1/page-gref = "337"
/local/domain/2/device/vkbd/0/mtouch/1/event-channel = "45"
So, for the example above: 1 kbd + 1 ptr + 2 mt devices
within a single driver, *3 connections*
There are no ring-ref and event-channel under mtouch, are there?
there are ring-refs and event-channels under mtouch *per
multi-touch*
device
So, why
would XENKBD_PATH_MTOUCH help distinguish them?
it groups multiple mtouch devices
Hope this clarifies things a bit
This patch is OK as is.
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
Thank you,
can I also put this "Reviewed-by" into the patch?
Sure, unless there was a misunderstanding.
Anyways, I have to wait for some other comments if any
and publish another version of the series with
comments addressed ("the" in the previous patch)
The values below are per emulated multi-touch
+ * input device:
+ *
+ * num-contacts
+ * Values: <uint>
+ *
+ * Number of simultaneous touches reported.
+ *
+ * width
+ * Values: <uint>
+ *
+ * Width of the touch area to be used by the frontend
+ * while reporting input events, pixels, [0; UINT32_MAX].
+ *
+ * height
+ * Values: <uint>
+ *
+ * Height of the touch area to be used by the frontend
+ * while reporting input events, pixels, [0; UINT32_MAX].
*/
/*
@@ -116,6 +151,16 @@
#define XENKBD_TYPE_RESERVED 2
#define XENKBD_TYPE_KEY 3
#define XENKBD_TYPE_POS 4
+#define XENKBD_TYPE_MTOUCH 5
+
+/* Multi-touch event sub-codes */
+
+#define XENKBD_MT_EV_DOWN 0
+#define XENKBD_MT_EV_UP 1
+#define XENKBD_MT_EV_MOTION 2
+#define XENKBD_MT_EV_SYN 3
+#define XENKBD_MT_EV_SHAPE 4
+#define XENKBD_MT_EV_ORIENT 5
/*
* CONSTANTS, XENSTORE FIELD AND PATH NAME STRINGS, HELPERS.
@@ -124,11 +169,17 @@
#define XENKBD_DRIVER_NAME "vkbd"
#define XENKBD_FIELD_FEAT_ABS_POINTER "feature-abs-pointer"
+#define XENKBD_FIELD_FEAT_MTOUCH "feature-multi-touch"
#define XENKBD_FIELD_REQ_ABS_POINTER "request-abs-pointer"
+#define XENKBD_FIELD_REQ_MTOUCH "request-multi-touch"
#define XENKBD_FIELD_RING_GREF "page-gref"
#define XENKBD_FIELD_EVT_CHANNEL "event-channel"
#define XENKBD_FIELD_WIDTH "width"
#define XENKBD_FIELD_HEIGHT "height"
+#define XENKBD_FIELD_NUM_CONTACTS "num-contacts"
+
+/* Path entries */
+#define XENKBD_PATH_MTOUCH "mtouch"
/* OBSOLETE, not recommended for use */
#define XENKBD_FIELD_RING_REF "page-ref"
@@ -248,6 +299,170 @@ struct xenkbd_position
int32_t rel_z;
};
+/*
+ * Multi-touch event and its sub-types
+ *
+ * All multi-touch event packets have common header:
+ *
+ * 0 1 2 3
octet
+ *
+----------------+----------------+----------------+----------------+
+ * | _TYPE_MTOUCH | event_type | contact_id | reserved
|
4
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
8
+ *
+----------------+----------------+----------------+----------------+
+ *
+ * event_type - unt8_t, multi-touch event sub-type, XENKBD_MT_EV_???
+ * contact_id - unt8_t, ID of the contact
If multiple devices are supported, don't we need a per multitouch device
ID to identify the source?
Again, *Every* multi-touch input device uses a *dedicated* event
frontend/backend *connection* Thus, events are passed w/o indices via
dedicated channels
+ * Touch interactions can consist of one or more contacts.
+ * For each contact, a series of events is generated, starting
+ * with a down event, followed by zero or more motion events,
+ * and ending with an up event. Events relating to the same
+ * contact point can be identified by the ID of the sequence: contact
ID.
+ * Contact ID may be reused after XENKBD_MT_EV_UP event and
+ * is in the [0; XENKBD_FIELD_NUM_CONTACTS - 1] range.
+ *
+ * For further information please refer to documentation on Wayland
[1],
+ * Linux [2] and Windows [3] multi-touch support.
+ *
+ * [1]
https://cgit.freedesktop.org/wayland/wayland/tree/protocol/wayland.xml
+ * [2]
https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt
+ * [3]
https://msdn.microsoft.com/en-us/library/jj151564(v=vs.85).aspx
+ *
+ *
+ * Multi-touch down event - sent when a new touch is made: touch is
assigned
+ * a unique contact ID, sent with this and consequent events related
+ * to this touch.
+ * 0 1 2 3
octet
+ *
+----------------+----------------+----------------+----------------+
+ * | _TYPE_MTOUCH | _MT_EV_DOWN | contact_id | reserved
|
4
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
8
+ *
+----------------+----------------+----------------+----------------+
+ * | abs_x
|
12
+ *
+----------------+----------------+----------------+----------------+
+ * | abs_y
|
16
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
20
+ *
+----------------+----------------+----------------+----------------+
+ *
|/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
40
+ *
+----------------+----------------+----------------+----------------+
+ *
+ * abs_x - int32_t, absolute X position, in pixels
+ * abs_y - int32_t, absolute Y position, in pixels
+ *
+ * Multi-touch contact release event
+ * 0 1 2 3
octet
+ *
+----------------+----------------+----------------+----------------+
+ * | _TYPE_MTOUCH | _MT_EV_UP | contact_id | reserved
|
4
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
8
+ *
+----------------+----------------+----------------+----------------+
+ *
|/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
40
+ *
+----------------+----------------+----------------+----------------+
+ *
+ * Multi-touch motion event
+ * 0 1 2 3
octet
+ *
+----------------+----------------+----------------+----------------+
+ * | _TYPE_MTOUCH | _MT_EV_MOTION | contact_id | reserved
|
4
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
8
+ *
+----------------+----------------+----------------+----------------+
+ * | abs_x
|
12
+ *
+----------------+----------------+----------------+----------------+
+ * | abs_y
|
16
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
20
+ *
+----------------+----------------+----------------+----------------+
+ *
|/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
40
+ *
+----------------+----------------+----------------+----------------+
+ *
+ * abs_x - int32_t, absolute X position, in pixels,
+ * abs_y - int32_t, absolute Y position, in pixels,
+ *
+ * Multi-touch input synchronization event - shows end of a set of
events
+ * which logically belong together.
+ * 0 1 2 3
octet
+ *
+----------------+----------------+----------------+----------------+
+ * | _TYPE_MTOUCH | _MT_EV_SYN | contact_id | reserved
|
4
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
8
+ *
+----------------+----------------+----------------+----------------+
+ *
|/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
40
+ *
+----------------+----------------+----------------+----------------+
+ *
+ * Multi-touch shape event - touch point's shape has changed its
shape.
+ * Shape is approximated by an ellipse through the major and minor
axis
+ * lengths: major is the longer diameter of the ellipse and minor is
the
+ * shorter one. Center of the ellipse is reported via
+ * XENKBD_MT_EV_DOWN/XENKBD_MT_EV_MOTION events.
+ * 0 1 2 3
octet
+ *
+----------------+----------------+----------------+----------------+
+ * | _TYPE_MTOUCH | _MT_EV_SHAPE | contact_id | reserved
|
4
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
8
+ *
+----------------+----------------+----------------+----------------+
+ * | major
|
12
+ *
+----------------+----------------+----------------+----------------+
+ * | minor
|
16
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
20
+ *
+----------------+----------------+----------------+----------------+
+ *
|/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
40
+ *
+----------------+----------------+----------------+----------------+
+ *
+ * major - unt32_t, length of the major axis, pixels
+ * minor - unt32_t, length of the minor axis, pixels
+ *
+ * Multi-touch orientation event - touch point's shape has changed
+ * its orientation: calculated as a clockwise angle between the major
axis
+ * of the ellipse and positive Y axis in degrees, [-180; +180].
+ * 0 1 2 3
octet
+ *
+----------------+----------------+----------------+----------------+
+ * | _TYPE_MTOUCH | _MT_EV_ORIENT | contact_id | reserved
|
4
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
8
+ *
+----------------+----------------+----------------+----------------+
+ * | orientation | reserved
|
12
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
16
+ *
+----------------+----------------+----------------+----------------+
+ *
|/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
+ *
+----------------+----------------+----------------+----------------+
+ * | reserved
|
40
+ *
+----------------+----------------+----------------+----------------+
+ *
+ * orientation - int16_t, clockwise angle of the major axis
+ */
+
+struct xenkbd_mtouch {
+ uint8_t type; /* XENKBD_TYPE_MTOUCH */
+ uint8_t event_type; /* XENKBD_MT_EV_??? */
+ uint8_t contact_id;
+ uint8_t reserved[5]; /* reserved for the future use */
+ union {
+ struct {
+ int32_t abs_x; /* absolute X position, pixels */
+ int32_t abs_y; /* absolute Y position, pixels */
+ } pos;
+ struct {
+ uint32_t major; /* length of the major axis, pixels */
+ uint32_t minor; /* length of the minor axis, pixels */
+ } shape;
+ int16_t orientation; /* clockwise angle of the major axis */
+ } u;
+};
+
#define XENKBD_IN_EVENT_SIZE 40
union xenkbd_in_event
@@ -256,6 +471,7 @@ union xenkbd_in_event
struct xenkbd_motion motion;
struct xenkbd_key key;
struct xenkbd_position pos;
+ struct xenkbd_mtouch mtouch;
char pad[XENKBD_IN_EVENT_SIZE];
};
--
2.7.4
|
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|