162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * kbdif.h -- Xen virtual keyboard/mouse
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2005 Anthony Liguori <aliguori@us.ibm.com>
662306a36Sopenharmony_ci * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __XEN_PUBLIC_IO_KBDIF_H__
1062306a36Sopenharmony_ci#define __XEN_PUBLIC_IO_KBDIF_H__
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/*
1362306a36Sopenharmony_ci *****************************************************************************
1462306a36Sopenharmony_ci *                     Feature and Parameter Negotiation
1562306a36Sopenharmony_ci *****************************************************************************
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci * The two halves of a para-virtual driver utilize nodes within
1862306a36Sopenharmony_ci * XenStore to communicate capabilities and to negotiate operating parameters.
1962306a36Sopenharmony_ci * This section enumerates these nodes which reside in the respective front and
2062306a36Sopenharmony_ci * backend portions of XenStore, following XenBus convention.
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci * All data in XenStore is stored as strings.  Nodes specifying numeric
2362306a36Sopenharmony_ci * values are encoded in decimal. Integer value ranges listed below are
2462306a36Sopenharmony_ci * expressed as fixed sized integer types capable of storing the conversion
2562306a36Sopenharmony_ci * of a properly formated node string, without loss of information.
2662306a36Sopenharmony_ci *
2762306a36Sopenharmony_ci *****************************************************************************
2862306a36Sopenharmony_ci *                            Backend XenBus Nodes
2962306a36Sopenharmony_ci *****************************************************************************
3062306a36Sopenharmony_ci *
3162306a36Sopenharmony_ci *---------------------------- Features supported ----------------------------
3262306a36Sopenharmony_ci *
3362306a36Sopenharmony_ci * Capable backend advertises supported features by publishing
3462306a36Sopenharmony_ci * corresponding entries in XenStore and puts 1 as the value of the entry.
3562306a36Sopenharmony_ci * If a feature is not supported then 0 must be set or feature entry omitted.
3662306a36Sopenharmony_ci *
3762306a36Sopenharmony_ci * feature-disable-keyboard
3862306a36Sopenharmony_ci *      Values:         <uint>
3962306a36Sopenharmony_ci *
4062306a36Sopenharmony_ci *      If there is no need to expose a virtual keyboard device by the
4162306a36Sopenharmony_ci *      frontend then this must be set to 1.
4262306a36Sopenharmony_ci *
4362306a36Sopenharmony_ci * feature-disable-pointer
4462306a36Sopenharmony_ci *      Values:         <uint>
4562306a36Sopenharmony_ci *
4662306a36Sopenharmony_ci *      If there is no need to expose a virtual pointer device by the
4762306a36Sopenharmony_ci *      frontend then this must be set to 1.
4862306a36Sopenharmony_ci *
4962306a36Sopenharmony_ci * feature-abs-pointer
5062306a36Sopenharmony_ci *      Values:         <uint>
5162306a36Sopenharmony_ci *
5262306a36Sopenharmony_ci *      Backends, which support reporting of absolute coordinates for pointer
5362306a36Sopenharmony_ci *      device should set this to 1.
5462306a36Sopenharmony_ci *
5562306a36Sopenharmony_ci * feature-multi-touch
5662306a36Sopenharmony_ci *      Values:         <uint>
5762306a36Sopenharmony_ci *
5862306a36Sopenharmony_ci *      Backends, which support reporting of multi-touch events
5962306a36Sopenharmony_ci *      should set this to 1.
6062306a36Sopenharmony_ci *
6162306a36Sopenharmony_ci * feature-raw-pointer
6262306a36Sopenharmony_ci *      Values:        <uint>
6362306a36Sopenharmony_ci *
6462306a36Sopenharmony_ci *      Backends, which support reporting raw (unscaled) absolute coordinates
6562306a36Sopenharmony_ci *      for pointer devices should set this to 1. Raw (unscaled) values have
6662306a36Sopenharmony_ci *      a range of [0, 0x7fff].
6762306a36Sopenharmony_ci *
6862306a36Sopenharmony_ci *-----------------------  Device Instance Parameters ------------------------
6962306a36Sopenharmony_ci *
7062306a36Sopenharmony_ci * unique-id
7162306a36Sopenharmony_ci *      Values:         <string>
7262306a36Sopenharmony_ci *
7362306a36Sopenharmony_ci *      After device instance initialization it is assigned a unique ID,
7462306a36Sopenharmony_ci *      so every instance of the frontend can be identified by the backend
7562306a36Sopenharmony_ci *      by this ID. This can be UUID or such.
7662306a36Sopenharmony_ci *
7762306a36Sopenharmony_ci *------------------------- Pointer Device Parameters ------------------------
7862306a36Sopenharmony_ci *
7962306a36Sopenharmony_ci * width
8062306a36Sopenharmony_ci *      Values:         <uint>
8162306a36Sopenharmony_ci *
8262306a36Sopenharmony_ci *      Maximum X coordinate (width) to be used by the frontend
8362306a36Sopenharmony_ci *      while reporting input events, pixels, [0; UINT32_MAX].
8462306a36Sopenharmony_ci *
8562306a36Sopenharmony_ci * height
8662306a36Sopenharmony_ci *      Values:         <uint>
8762306a36Sopenharmony_ci *
8862306a36Sopenharmony_ci *      Maximum Y coordinate (height) to be used by the frontend
8962306a36Sopenharmony_ci *      while reporting input events, pixels, [0; UINT32_MAX].
9062306a36Sopenharmony_ci *
9162306a36Sopenharmony_ci *----------------------- Multi-touch Device Parameters ----------------------
9262306a36Sopenharmony_ci *
9362306a36Sopenharmony_ci * multi-touch-num-contacts
9462306a36Sopenharmony_ci *      Values:         <uint>
9562306a36Sopenharmony_ci *
9662306a36Sopenharmony_ci *      Number of simultaneous touches reported.
9762306a36Sopenharmony_ci *
9862306a36Sopenharmony_ci * multi-touch-width
9962306a36Sopenharmony_ci *      Values:         <uint>
10062306a36Sopenharmony_ci *
10162306a36Sopenharmony_ci *      Width of the touch area to be used by the frontend
10262306a36Sopenharmony_ci *      while reporting input events, pixels, [0; UINT32_MAX].
10362306a36Sopenharmony_ci *
10462306a36Sopenharmony_ci * multi-touch-height
10562306a36Sopenharmony_ci *      Values:         <uint>
10662306a36Sopenharmony_ci *
10762306a36Sopenharmony_ci *      Height of the touch area to be used by the frontend
10862306a36Sopenharmony_ci *      while reporting input events, pixels, [0; UINT32_MAX].
10962306a36Sopenharmony_ci *
11062306a36Sopenharmony_ci *****************************************************************************
11162306a36Sopenharmony_ci *                            Frontend XenBus Nodes
11262306a36Sopenharmony_ci *****************************************************************************
11362306a36Sopenharmony_ci *
11462306a36Sopenharmony_ci *------------------------------ Feature request -----------------------------
11562306a36Sopenharmony_ci *
11662306a36Sopenharmony_ci * Capable frontend requests features from backend via setting corresponding
11762306a36Sopenharmony_ci * entries to 1 in XenStore. Requests for features not advertised as supported
11862306a36Sopenharmony_ci * by the backend have no effect.
11962306a36Sopenharmony_ci *
12062306a36Sopenharmony_ci * request-abs-pointer
12162306a36Sopenharmony_ci *      Values:         <uint>
12262306a36Sopenharmony_ci *
12362306a36Sopenharmony_ci *      Request backend to report absolute pointer coordinates
12462306a36Sopenharmony_ci *      (XENKBD_TYPE_POS) instead of relative ones (XENKBD_TYPE_MOTION).
12562306a36Sopenharmony_ci *
12662306a36Sopenharmony_ci * request-multi-touch
12762306a36Sopenharmony_ci *      Values:         <uint>
12862306a36Sopenharmony_ci *
12962306a36Sopenharmony_ci *      Request backend to report multi-touch events.
13062306a36Sopenharmony_ci *
13162306a36Sopenharmony_ci * request-raw-pointer
13262306a36Sopenharmony_ci *      Values:         <uint>
13362306a36Sopenharmony_ci *
13462306a36Sopenharmony_ci *      Request backend to report raw unscaled absolute pointer coordinates.
13562306a36Sopenharmony_ci *      This option is only valid if request-abs-pointer is also set.
13662306a36Sopenharmony_ci *      Raw unscaled coordinates have the range [0, 0x7fff]
13762306a36Sopenharmony_ci *
13862306a36Sopenharmony_ci *----------------------- Request Transport Parameters -----------------------
13962306a36Sopenharmony_ci *
14062306a36Sopenharmony_ci * event-channel
14162306a36Sopenharmony_ci *      Values:         <uint>
14262306a36Sopenharmony_ci *
14362306a36Sopenharmony_ci *      The identifier of the Xen event channel used to signal activity
14462306a36Sopenharmony_ci *      in the ring buffer.
14562306a36Sopenharmony_ci *
14662306a36Sopenharmony_ci * page-gref
14762306a36Sopenharmony_ci *      Values:         <uint>
14862306a36Sopenharmony_ci *
14962306a36Sopenharmony_ci *      The Xen grant reference granting permission for the backend to map
15062306a36Sopenharmony_ci *      a sole page in a single page sized event ring buffer.
15162306a36Sopenharmony_ci *
15262306a36Sopenharmony_ci * page-ref
15362306a36Sopenharmony_ci *      Values:         <uint>
15462306a36Sopenharmony_ci *
15562306a36Sopenharmony_ci *      OBSOLETE, not recommended for use.
15662306a36Sopenharmony_ci *      PFN of the shared page.
15762306a36Sopenharmony_ci */
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci/*
16062306a36Sopenharmony_ci * EVENT CODES.
16162306a36Sopenharmony_ci */
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci#define XENKBD_TYPE_MOTION		1
16462306a36Sopenharmony_ci#define XENKBD_TYPE_RESERVED		2
16562306a36Sopenharmony_ci#define XENKBD_TYPE_KEY			3
16662306a36Sopenharmony_ci#define XENKBD_TYPE_POS			4
16762306a36Sopenharmony_ci#define XENKBD_TYPE_MTOUCH		5
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci/* Multi-touch event sub-codes */
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci#define XENKBD_MT_EV_DOWN		0
17262306a36Sopenharmony_ci#define XENKBD_MT_EV_UP			1
17362306a36Sopenharmony_ci#define XENKBD_MT_EV_MOTION		2
17462306a36Sopenharmony_ci#define XENKBD_MT_EV_SYN		3
17562306a36Sopenharmony_ci#define XENKBD_MT_EV_SHAPE		4
17662306a36Sopenharmony_ci#define XENKBD_MT_EV_ORIENT		5
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci/*
17962306a36Sopenharmony_ci * CONSTANTS, XENSTORE FIELD AND PATH NAME STRINGS, HELPERS.
18062306a36Sopenharmony_ci */
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci#define XENKBD_DRIVER_NAME		"vkbd"
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci#define XENKBD_FIELD_FEAT_DSBL_KEYBRD	"feature-disable-keyboard"
18562306a36Sopenharmony_ci#define XENKBD_FIELD_FEAT_DSBL_POINTER	"feature-disable-pointer"
18662306a36Sopenharmony_ci#define XENKBD_FIELD_FEAT_ABS_POINTER	"feature-abs-pointer"
18762306a36Sopenharmony_ci#define XENKBD_FIELD_FEAT_RAW_POINTER	"feature-raw-pointer"
18862306a36Sopenharmony_ci#define XENKBD_FIELD_FEAT_MTOUCH	"feature-multi-touch"
18962306a36Sopenharmony_ci#define XENKBD_FIELD_REQ_ABS_POINTER	"request-abs-pointer"
19062306a36Sopenharmony_ci#define XENKBD_FIELD_REQ_RAW_POINTER	"request-raw-pointer"
19162306a36Sopenharmony_ci#define XENKBD_FIELD_REQ_MTOUCH		"request-multi-touch"
19262306a36Sopenharmony_ci#define XENKBD_FIELD_RING_GREF		"page-gref"
19362306a36Sopenharmony_ci#define XENKBD_FIELD_EVT_CHANNEL	"event-channel"
19462306a36Sopenharmony_ci#define XENKBD_FIELD_WIDTH		"width"
19562306a36Sopenharmony_ci#define XENKBD_FIELD_HEIGHT		"height"
19662306a36Sopenharmony_ci#define XENKBD_FIELD_MT_WIDTH		"multi-touch-width"
19762306a36Sopenharmony_ci#define XENKBD_FIELD_MT_HEIGHT		"multi-touch-height"
19862306a36Sopenharmony_ci#define XENKBD_FIELD_MT_NUM_CONTACTS	"multi-touch-num-contacts"
19962306a36Sopenharmony_ci#define XENKBD_FIELD_UNIQUE_ID		"unique-id"
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci/* OBSOLETE, not recommended for use */
20262306a36Sopenharmony_ci#define XENKBD_FIELD_RING_REF		"page-ref"
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci/*
20562306a36Sopenharmony_ci *****************************************************************************
20662306a36Sopenharmony_ci * Description of the protocol between frontend and backend driver.
20762306a36Sopenharmony_ci *****************************************************************************
20862306a36Sopenharmony_ci *
20962306a36Sopenharmony_ci * The two halves of a Para-virtual driver communicate with
21062306a36Sopenharmony_ci * each other using a shared page and an event channel.
21162306a36Sopenharmony_ci * Shared page contains a ring with event structures.
21262306a36Sopenharmony_ci *
21362306a36Sopenharmony_ci * All reserved fields in the structures below must be 0.
21462306a36Sopenharmony_ci *
21562306a36Sopenharmony_ci *****************************************************************************
21662306a36Sopenharmony_ci *                           Backend to frontend events
21762306a36Sopenharmony_ci *****************************************************************************
21862306a36Sopenharmony_ci *
21962306a36Sopenharmony_ci * Frontends should ignore unknown in events.
22062306a36Sopenharmony_ci * All event packets have the same length (40 octets)
22162306a36Sopenharmony_ci * All event packets have common header:
22262306a36Sopenharmony_ci *
22362306a36Sopenharmony_ci *          0         octet
22462306a36Sopenharmony_ci * +-----------------+
22562306a36Sopenharmony_ci * |       type      |
22662306a36Sopenharmony_ci * +-----------------+
22762306a36Sopenharmony_ci * type - uint8_t, event code, XENKBD_TYPE_???
22862306a36Sopenharmony_ci *
22962306a36Sopenharmony_ci *
23062306a36Sopenharmony_ci * Pointer relative movement event
23162306a36Sopenharmony_ci *         0                1                 2               3        octet
23262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
23362306a36Sopenharmony_ci * |  _TYPE_MOTION  |                     reserved                     | 4
23462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
23562306a36Sopenharmony_ci * |                               rel_x                               | 8
23662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
23762306a36Sopenharmony_ci * |                               rel_y                               | 12
23862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
23962306a36Sopenharmony_ci * |                               rel_z                               | 16
24062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
24162306a36Sopenharmony_ci * |                             reserved                              | 20
24262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
24362306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
24462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
24562306a36Sopenharmony_ci * |                             reserved                              | 40
24662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
24762306a36Sopenharmony_ci *
24862306a36Sopenharmony_ci * rel_x - int32_t, relative X motion
24962306a36Sopenharmony_ci * rel_y - int32_t, relative Y motion
25062306a36Sopenharmony_ci * rel_z - int32_t, relative Z motion (wheel)
25162306a36Sopenharmony_ci */
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cistruct xenkbd_motion {
25462306a36Sopenharmony_ci	uint8_t type;
25562306a36Sopenharmony_ci	int32_t rel_x;
25662306a36Sopenharmony_ci	int32_t rel_y;
25762306a36Sopenharmony_ci	int32_t rel_z;
25862306a36Sopenharmony_ci};
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci/*
26162306a36Sopenharmony_ci * Key event (includes pointer buttons)
26262306a36Sopenharmony_ci *         0                1                 2               3        octet
26362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
26462306a36Sopenharmony_ci * |  _TYPE_KEY     |     pressed    |            reserved             | 4
26562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
26662306a36Sopenharmony_ci * |                              keycode                              | 8
26762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
26862306a36Sopenharmony_ci * |                             reserved                              | 12
26962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
27062306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
27162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
27262306a36Sopenharmony_ci * |                             reserved                              | 40
27362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
27462306a36Sopenharmony_ci *
27562306a36Sopenharmony_ci * pressed - uint8_t, 1 if pressed; 0 otherwise
27662306a36Sopenharmony_ci * keycode - uint32_t, KEY_* from linux/input.h
27762306a36Sopenharmony_ci */
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_cistruct xenkbd_key {
28062306a36Sopenharmony_ci	uint8_t type;
28162306a36Sopenharmony_ci	uint8_t pressed;
28262306a36Sopenharmony_ci	uint32_t keycode;
28362306a36Sopenharmony_ci};
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci/*
28662306a36Sopenharmony_ci * Pointer absolute position event
28762306a36Sopenharmony_ci *         0                1                 2               3        octet
28862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
28962306a36Sopenharmony_ci * |  _TYPE_POS     |                     reserved                     | 4
29062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
29162306a36Sopenharmony_ci * |                               abs_x                               | 8
29262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
29362306a36Sopenharmony_ci * |                               abs_y                               | 12
29462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
29562306a36Sopenharmony_ci * |                               rel_z                               | 16
29662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
29762306a36Sopenharmony_ci * |                             reserved                              | 20
29862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
29962306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
30062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
30162306a36Sopenharmony_ci * |                             reserved                              | 40
30262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
30362306a36Sopenharmony_ci *
30462306a36Sopenharmony_ci * abs_x - int32_t, absolute X position (in FB pixels)
30562306a36Sopenharmony_ci * abs_y - int32_t, absolute Y position (in FB pixels)
30662306a36Sopenharmony_ci * rel_z - int32_t, relative Z motion (wheel)
30762306a36Sopenharmony_ci */
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_cistruct xenkbd_position {
31062306a36Sopenharmony_ci	uint8_t type;
31162306a36Sopenharmony_ci	int32_t abs_x;
31262306a36Sopenharmony_ci	int32_t abs_y;
31362306a36Sopenharmony_ci	int32_t rel_z;
31462306a36Sopenharmony_ci};
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci/*
31762306a36Sopenharmony_ci * Multi-touch event and its sub-types
31862306a36Sopenharmony_ci *
31962306a36Sopenharmony_ci * All multi-touch event packets have common header:
32062306a36Sopenharmony_ci *
32162306a36Sopenharmony_ci *         0                1                 2               3        octet
32262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
32362306a36Sopenharmony_ci * |  _TYPE_MTOUCH  |   event_type   |   contact_id   |    reserved    | 4
32462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
32562306a36Sopenharmony_ci * |                             reserved                              | 8
32662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
32762306a36Sopenharmony_ci *
32862306a36Sopenharmony_ci * event_type - unt8_t, multi-touch event sub-type, XENKBD_MT_EV_???
32962306a36Sopenharmony_ci * contact_id - unt8_t, ID of the contact
33062306a36Sopenharmony_ci *
33162306a36Sopenharmony_ci * Touch interactions can consist of one or more contacts.
33262306a36Sopenharmony_ci * For each contact, a series of events is generated, starting
33362306a36Sopenharmony_ci * with a down event, followed by zero or more motion events,
33462306a36Sopenharmony_ci * and ending with an up event. Events relating to the same
33562306a36Sopenharmony_ci * contact point can be identified by the ID of the sequence: contact ID.
33662306a36Sopenharmony_ci * Contact ID may be reused after XENKBD_MT_EV_UP event and
33762306a36Sopenharmony_ci * is in the [0; XENKBD_FIELD_NUM_CONTACTS - 1] range.
33862306a36Sopenharmony_ci *
33962306a36Sopenharmony_ci * For further information please refer to documentation on Wayland [1],
34062306a36Sopenharmony_ci * Linux [2] and Windows [3] multi-touch support.
34162306a36Sopenharmony_ci *
34262306a36Sopenharmony_ci * [1] https://cgit.freedesktop.org/wayland/wayland/tree/protocol/wayland.xml
34362306a36Sopenharmony_ci * [2] https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.rst
34462306a36Sopenharmony_ci * [3] https://msdn.microsoft.com/en-us/library/jj151564(v=vs.85).aspx
34562306a36Sopenharmony_ci *
34662306a36Sopenharmony_ci *
34762306a36Sopenharmony_ci * Multi-touch down event - sent when a new touch is made: touch is assigned
34862306a36Sopenharmony_ci * a unique contact ID, sent with this and consequent events related
34962306a36Sopenharmony_ci * to this touch.
35062306a36Sopenharmony_ci *         0                1                 2               3        octet
35162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
35262306a36Sopenharmony_ci * |  _TYPE_MTOUCH  |   _MT_EV_DOWN  |   contact_id   |    reserved    | 4
35362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
35462306a36Sopenharmony_ci * |                             reserved                              | 8
35562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
35662306a36Sopenharmony_ci * |                               abs_x                               | 12
35762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
35862306a36Sopenharmony_ci * |                               abs_y                               | 16
35962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
36062306a36Sopenharmony_ci * |                             reserved                              | 20
36162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
36262306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
36362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
36462306a36Sopenharmony_ci * |                             reserved                              | 40
36562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
36662306a36Sopenharmony_ci *
36762306a36Sopenharmony_ci * abs_x - int32_t, absolute X position, in pixels
36862306a36Sopenharmony_ci * abs_y - int32_t, absolute Y position, in pixels
36962306a36Sopenharmony_ci *
37062306a36Sopenharmony_ci * Multi-touch contact release event
37162306a36Sopenharmony_ci *         0                1                 2               3        octet
37262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
37362306a36Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_UP     |   contact_id   |    reserved    | 4
37462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
37562306a36Sopenharmony_ci * |                             reserved                              | 8
37662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
37762306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
37862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
37962306a36Sopenharmony_ci * |                             reserved                              | 40
38062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
38162306a36Sopenharmony_ci *
38262306a36Sopenharmony_ci * Multi-touch motion event
38362306a36Sopenharmony_ci *         0                1                 2               3        octet
38462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
38562306a36Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_MOTION |   contact_id   |    reserved    | 4
38662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
38762306a36Sopenharmony_ci * |                             reserved                              | 8
38862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
38962306a36Sopenharmony_ci * |                               abs_x                               | 12
39062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
39162306a36Sopenharmony_ci * |                               abs_y                               | 16
39262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
39362306a36Sopenharmony_ci * |                             reserved                              | 20
39462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
39562306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
39662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
39762306a36Sopenharmony_ci * |                             reserved                              | 40
39862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
39962306a36Sopenharmony_ci *
40062306a36Sopenharmony_ci * abs_x - int32_t, absolute X position, in pixels,
40162306a36Sopenharmony_ci * abs_y - int32_t, absolute Y position, in pixels,
40262306a36Sopenharmony_ci *
40362306a36Sopenharmony_ci * Multi-touch input synchronization event - shows end of a set of events
40462306a36Sopenharmony_ci * which logically belong together.
40562306a36Sopenharmony_ci *         0                1                 2               3        octet
40662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
40762306a36Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_SYN    |   contact_id   |    reserved    | 4
40862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
40962306a36Sopenharmony_ci * |                             reserved                              | 8
41062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
41162306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
41262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
41362306a36Sopenharmony_ci * |                             reserved                              | 40
41462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
41562306a36Sopenharmony_ci *
41662306a36Sopenharmony_ci * Multi-touch shape event - touch point's shape has changed its shape.
41762306a36Sopenharmony_ci * Shape is approximated by an ellipse through the major and minor axis
41862306a36Sopenharmony_ci * lengths: major is the longer diameter of the ellipse and minor is the
41962306a36Sopenharmony_ci * shorter one. Center of the ellipse is reported via
42062306a36Sopenharmony_ci * XENKBD_MT_EV_DOWN/XENKBD_MT_EV_MOTION events.
42162306a36Sopenharmony_ci *         0                1                 2               3        octet
42262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
42362306a36Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_SHAPE  |   contact_id   |    reserved    | 4
42462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
42562306a36Sopenharmony_ci * |                             reserved                              | 8
42662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
42762306a36Sopenharmony_ci * |                               major                               | 12
42862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
42962306a36Sopenharmony_ci * |                               minor                               | 16
43062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
43162306a36Sopenharmony_ci * |                             reserved                              | 20
43262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
43362306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
43462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
43562306a36Sopenharmony_ci * |                             reserved                              | 40
43662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
43762306a36Sopenharmony_ci *
43862306a36Sopenharmony_ci * major - unt32_t, length of the major axis, pixels
43962306a36Sopenharmony_ci * minor - unt32_t, length of the minor axis, pixels
44062306a36Sopenharmony_ci *
44162306a36Sopenharmony_ci * Multi-touch orientation event - touch point's shape has changed
44262306a36Sopenharmony_ci * its orientation: calculated as a clockwise angle between the major axis
44362306a36Sopenharmony_ci * of the ellipse and positive Y axis in degrees, [-180; +180].
44462306a36Sopenharmony_ci *         0                1                 2               3        octet
44562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
44662306a36Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_ORIENT |   contact_id   |    reserved    | 4
44762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
44862306a36Sopenharmony_ci * |                             reserved                              | 8
44962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
45062306a36Sopenharmony_ci * |           orientation           |            reserved             | 12
45162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
45262306a36Sopenharmony_ci * |                             reserved                              | 16
45362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
45462306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
45562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
45662306a36Sopenharmony_ci * |                             reserved                              | 40
45762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
45862306a36Sopenharmony_ci *
45962306a36Sopenharmony_ci * orientation - int16_t, clockwise angle of the major axis
46062306a36Sopenharmony_ci */
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_cistruct xenkbd_mtouch {
46362306a36Sopenharmony_ci	uint8_t type;			/* XENKBD_TYPE_MTOUCH */
46462306a36Sopenharmony_ci	uint8_t event_type;		/* XENKBD_MT_EV_??? */
46562306a36Sopenharmony_ci	uint8_t contact_id;
46662306a36Sopenharmony_ci	uint8_t reserved[5];		/* reserved for the future use */
46762306a36Sopenharmony_ci	union {
46862306a36Sopenharmony_ci		struct {
46962306a36Sopenharmony_ci			int32_t abs_x;	/* absolute X position, pixels */
47062306a36Sopenharmony_ci			int32_t abs_y;	/* absolute Y position, pixels */
47162306a36Sopenharmony_ci		} pos;
47262306a36Sopenharmony_ci		struct {
47362306a36Sopenharmony_ci			uint32_t major;	/* length of the major axis, pixels */
47462306a36Sopenharmony_ci			uint32_t minor;	/* length of the minor axis, pixels */
47562306a36Sopenharmony_ci		} shape;
47662306a36Sopenharmony_ci		int16_t orientation;	/* clockwise angle of the major axis */
47762306a36Sopenharmony_ci	} u;
47862306a36Sopenharmony_ci};
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci#define XENKBD_IN_EVENT_SIZE 40
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ciunion xenkbd_in_event {
48362306a36Sopenharmony_ci	uint8_t type;
48462306a36Sopenharmony_ci	struct xenkbd_motion motion;
48562306a36Sopenharmony_ci	struct xenkbd_key key;
48662306a36Sopenharmony_ci	struct xenkbd_position pos;
48762306a36Sopenharmony_ci	struct xenkbd_mtouch mtouch;
48862306a36Sopenharmony_ci	char pad[XENKBD_IN_EVENT_SIZE];
48962306a36Sopenharmony_ci};
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci/*
49262306a36Sopenharmony_ci *****************************************************************************
49362306a36Sopenharmony_ci *                            Frontend to backend events
49462306a36Sopenharmony_ci *****************************************************************************
49562306a36Sopenharmony_ci *
49662306a36Sopenharmony_ci * Out events may be sent only when requested by backend, and receipt
49762306a36Sopenharmony_ci * of an unknown out event is an error.
49862306a36Sopenharmony_ci * No out events currently defined.
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci * All event packets have the same length (40 octets)
50162306a36Sopenharmony_ci * All event packets have common header:
50262306a36Sopenharmony_ci *          0         octet
50362306a36Sopenharmony_ci * +-----------------+
50462306a36Sopenharmony_ci * |       type      |
50562306a36Sopenharmony_ci * +-----------------+
50662306a36Sopenharmony_ci * type - uint8_t, event code
50762306a36Sopenharmony_ci */
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci#define XENKBD_OUT_EVENT_SIZE 40
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ciunion xenkbd_out_event {
51262306a36Sopenharmony_ci	uint8_t type;
51362306a36Sopenharmony_ci	char pad[XENKBD_OUT_EVENT_SIZE];
51462306a36Sopenharmony_ci};
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ci/*
51762306a36Sopenharmony_ci *****************************************************************************
51862306a36Sopenharmony_ci *                            Shared page
51962306a36Sopenharmony_ci *****************************************************************************
52062306a36Sopenharmony_ci */
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci#define XENKBD_IN_RING_SIZE 2048
52362306a36Sopenharmony_ci#define XENKBD_IN_RING_LEN (XENKBD_IN_RING_SIZE / XENKBD_IN_EVENT_SIZE)
52462306a36Sopenharmony_ci#define XENKBD_IN_RING_OFFS 1024
52562306a36Sopenharmony_ci#define XENKBD_IN_RING(page) \
52662306a36Sopenharmony_ci	((union xenkbd_in_event *)((char *)(page) + XENKBD_IN_RING_OFFS))
52762306a36Sopenharmony_ci#define XENKBD_IN_RING_REF(page, idx) \
52862306a36Sopenharmony_ci	(XENKBD_IN_RING((page))[(idx) % XENKBD_IN_RING_LEN])
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci#define XENKBD_OUT_RING_SIZE 1024
53162306a36Sopenharmony_ci#define XENKBD_OUT_RING_LEN (XENKBD_OUT_RING_SIZE / XENKBD_OUT_EVENT_SIZE)
53262306a36Sopenharmony_ci#define XENKBD_OUT_RING_OFFS (XENKBD_IN_RING_OFFS + XENKBD_IN_RING_SIZE)
53362306a36Sopenharmony_ci#define XENKBD_OUT_RING(page) \
53462306a36Sopenharmony_ci	((union xenkbd_out_event *)((char *)(page) + XENKBD_OUT_RING_OFFS))
53562306a36Sopenharmony_ci#define XENKBD_OUT_RING_REF(page, idx) \
53662306a36Sopenharmony_ci	(XENKBD_OUT_RING((page))[(idx) % XENKBD_OUT_RING_LEN])
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_cistruct xenkbd_page {
53962306a36Sopenharmony_ci	uint32_t in_cons, in_prod;
54062306a36Sopenharmony_ci	uint32_t out_cons, out_prod;
54162306a36Sopenharmony_ci};
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ci#endif /* __XEN_PUBLIC_IO_KBDIF_H__ */
544