18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * kbdif.h -- Xen virtual keyboard/mouse
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy
58c2ecf20Sopenharmony_ci * of this software and associated documentation files (the "Software"), to
68c2ecf20Sopenharmony_ci * deal in the Software without restriction, including without limitation the
78c2ecf20Sopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
88c2ecf20Sopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is
98c2ecf20Sopenharmony_ci * furnished to do so, subject to the following conditions:
108c2ecf20Sopenharmony_ci *
118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice shall be included in
128c2ecf20Sopenharmony_ci * all copies or substantial portions of the Software.
138c2ecf20Sopenharmony_ci *
148c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
158c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
168c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
178c2ecf20Sopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
188c2ecf20Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
198c2ecf20Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
208c2ecf20Sopenharmony_ci * DEALINGS IN THE SOFTWARE.
218c2ecf20Sopenharmony_ci *
228c2ecf20Sopenharmony_ci * Copyright (C) 2005 Anthony Liguori <aliguori@us.ibm.com>
238c2ecf20Sopenharmony_ci * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
248c2ecf20Sopenharmony_ci */
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci#ifndef __XEN_PUBLIC_IO_KBDIF_H__
278c2ecf20Sopenharmony_ci#define __XEN_PUBLIC_IO_KBDIF_H__
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci/*
308c2ecf20Sopenharmony_ci *****************************************************************************
318c2ecf20Sopenharmony_ci *                     Feature and Parameter Negotiation
328c2ecf20Sopenharmony_ci *****************************************************************************
338c2ecf20Sopenharmony_ci *
348c2ecf20Sopenharmony_ci * The two halves of a para-virtual driver utilize nodes within
358c2ecf20Sopenharmony_ci * XenStore to communicate capabilities and to negotiate operating parameters.
368c2ecf20Sopenharmony_ci * This section enumerates these nodes which reside in the respective front and
378c2ecf20Sopenharmony_ci * backend portions of XenStore, following XenBus convention.
388c2ecf20Sopenharmony_ci *
398c2ecf20Sopenharmony_ci * All data in XenStore is stored as strings.  Nodes specifying numeric
408c2ecf20Sopenharmony_ci * values are encoded in decimal. Integer value ranges listed below are
418c2ecf20Sopenharmony_ci * expressed as fixed sized integer types capable of storing the conversion
428c2ecf20Sopenharmony_ci * of a properly formated node string, without loss of information.
438c2ecf20Sopenharmony_ci *
448c2ecf20Sopenharmony_ci *****************************************************************************
458c2ecf20Sopenharmony_ci *                            Backend XenBus Nodes
468c2ecf20Sopenharmony_ci *****************************************************************************
478c2ecf20Sopenharmony_ci *
488c2ecf20Sopenharmony_ci *---------------------------- Features supported ----------------------------
498c2ecf20Sopenharmony_ci *
508c2ecf20Sopenharmony_ci * Capable backend advertises supported features by publishing
518c2ecf20Sopenharmony_ci * corresponding entries in XenStore and puts 1 as the value of the entry.
528c2ecf20Sopenharmony_ci * If a feature is not supported then 0 must be set or feature entry omitted.
538c2ecf20Sopenharmony_ci *
548c2ecf20Sopenharmony_ci * feature-disable-keyboard
558c2ecf20Sopenharmony_ci *      Values:         <uint>
568c2ecf20Sopenharmony_ci *
578c2ecf20Sopenharmony_ci *      If there is no need to expose a virtual keyboard device by the
588c2ecf20Sopenharmony_ci *      frontend then this must be set to 1.
598c2ecf20Sopenharmony_ci *
608c2ecf20Sopenharmony_ci * feature-disable-pointer
618c2ecf20Sopenharmony_ci *      Values:         <uint>
628c2ecf20Sopenharmony_ci *
638c2ecf20Sopenharmony_ci *      If there is no need to expose a virtual pointer device by the
648c2ecf20Sopenharmony_ci *      frontend then this must be set to 1.
658c2ecf20Sopenharmony_ci *
668c2ecf20Sopenharmony_ci * feature-abs-pointer
678c2ecf20Sopenharmony_ci *      Values:         <uint>
688c2ecf20Sopenharmony_ci *
698c2ecf20Sopenharmony_ci *      Backends, which support reporting of absolute coordinates for pointer
708c2ecf20Sopenharmony_ci *      device should set this to 1.
718c2ecf20Sopenharmony_ci *
728c2ecf20Sopenharmony_ci * feature-multi-touch
738c2ecf20Sopenharmony_ci *      Values:         <uint>
748c2ecf20Sopenharmony_ci *
758c2ecf20Sopenharmony_ci *      Backends, which support reporting of multi-touch events
768c2ecf20Sopenharmony_ci *      should set this to 1.
778c2ecf20Sopenharmony_ci *
788c2ecf20Sopenharmony_ci * feature-raw-pointer
798c2ecf20Sopenharmony_ci *      Values:        <uint>
808c2ecf20Sopenharmony_ci *
818c2ecf20Sopenharmony_ci *      Backends, which support reporting raw (unscaled) absolute coordinates
828c2ecf20Sopenharmony_ci *      for pointer devices should set this to 1. Raw (unscaled) values have
838c2ecf20Sopenharmony_ci *      a range of [0, 0x7fff].
848c2ecf20Sopenharmony_ci *
858c2ecf20Sopenharmony_ci *-----------------------  Device Instance Parameters ------------------------
868c2ecf20Sopenharmony_ci *
878c2ecf20Sopenharmony_ci * unique-id
888c2ecf20Sopenharmony_ci *      Values:         <string>
898c2ecf20Sopenharmony_ci *
908c2ecf20Sopenharmony_ci *      After device instance initialization it is assigned a unique ID,
918c2ecf20Sopenharmony_ci *      so every instance of the frontend can be identified by the backend
928c2ecf20Sopenharmony_ci *      by this ID. This can be UUID or such.
938c2ecf20Sopenharmony_ci *
948c2ecf20Sopenharmony_ci *------------------------- Pointer Device Parameters ------------------------
958c2ecf20Sopenharmony_ci *
968c2ecf20Sopenharmony_ci * width
978c2ecf20Sopenharmony_ci *      Values:         <uint>
988c2ecf20Sopenharmony_ci *
998c2ecf20Sopenharmony_ci *      Maximum X coordinate (width) to be used by the frontend
1008c2ecf20Sopenharmony_ci *      while reporting input events, pixels, [0; UINT32_MAX].
1018c2ecf20Sopenharmony_ci *
1028c2ecf20Sopenharmony_ci * height
1038c2ecf20Sopenharmony_ci *      Values:         <uint>
1048c2ecf20Sopenharmony_ci *
1058c2ecf20Sopenharmony_ci *      Maximum Y coordinate (height) to be used by the frontend
1068c2ecf20Sopenharmony_ci *      while reporting input events, pixels, [0; UINT32_MAX].
1078c2ecf20Sopenharmony_ci *
1088c2ecf20Sopenharmony_ci *----------------------- Multi-touch Device Parameters ----------------------
1098c2ecf20Sopenharmony_ci *
1108c2ecf20Sopenharmony_ci * multi-touch-num-contacts
1118c2ecf20Sopenharmony_ci *      Values:         <uint>
1128c2ecf20Sopenharmony_ci *
1138c2ecf20Sopenharmony_ci *      Number of simultaneous touches reported.
1148c2ecf20Sopenharmony_ci *
1158c2ecf20Sopenharmony_ci * multi-touch-width
1168c2ecf20Sopenharmony_ci *      Values:         <uint>
1178c2ecf20Sopenharmony_ci *
1188c2ecf20Sopenharmony_ci *      Width of the touch area to be used by the frontend
1198c2ecf20Sopenharmony_ci *      while reporting input events, pixels, [0; UINT32_MAX].
1208c2ecf20Sopenharmony_ci *
1218c2ecf20Sopenharmony_ci * multi-touch-height
1228c2ecf20Sopenharmony_ci *      Values:         <uint>
1238c2ecf20Sopenharmony_ci *
1248c2ecf20Sopenharmony_ci *      Height of the touch area to be used by the frontend
1258c2ecf20Sopenharmony_ci *      while reporting input events, pixels, [0; UINT32_MAX].
1268c2ecf20Sopenharmony_ci *
1278c2ecf20Sopenharmony_ci *****************************************************************************
1288c2ecf20Sopenharmony_ci *                            Frontend XenBus Nodes
1298c2ecf20Sopenharmony_ci *****************************************************************************
1308c2ecf20Sopenharmony_ci *
1318c2ecf20Sopenharmony_ci *------------------------------ Feature request -----------------------------
1328c2ecf20Sopenharmony_ci *
1338c2ecf20Sopenharmony_ci * Capable frontend requests features from backend via setting corresponding
1348c2ecf20Sopenharmony_ci * entries to 1 in XenStore. Requests for features not advertised as supported
1358c2ecf20Sopenharmony_ci * by the backend have no effect.
1368c2ecf20Sopenharmony_ci *
1378c2ecf20Sopenharmony_ci * request-abs-pointer
1388c2ecf20Sopenharmony_ci *      Values:         <uint>
1398c2ecf20Sopenharmony_ci *
1408c2ecf20Sopenharmony_ci *      Request backend to report absolute pointer coordinates
1418c2ecf20Sopenharmony_ci *      (XENKBD_TYPE_POS) instead of relative ones (XENKBD_TYPE_MOTION).
1428c2ecf20Sopenharmony_ci *
1438c2ecf20Sopenharmony_ci * request-multi-touch
1448c2ecf20Sopenharmony_ci *      Values:         <uint>
1458c2ecf20Sopenharmony_ci *
1468c2ecf20Sopenharmony_ci *      Request backend to report multi-touch events.
1478c2ecf20Sopenharmony_ci *
1488c2ecf20Sopenharmony_ci * request-raw-pointer
1498c2ecf20Sopenharmony_ci *      Values:         <uint>
1508c2ecf20Sopenharmony_ci *
1518c2ecf20Sopenharmony_ci *      Request backend to report raw unscaled absolute pointer coordinates.
1528c2ecf20Sopenharmony_ci *      This option is only valid if request-abs-pointer is also set.
1538c2ecf20Sopenharmony_ci *      Raw unscaled coordinates have the range [0, 0x7fff]
1548c2ecf20Sopenharmony_ci *
1558c2ecf20Sopenharmony_ci *----------------------- Request Transport Parameters -----------------------
1568c2ecf20Sopenharmony_ci *
1578c2ecf20Sopenharmony_ci * event-channel
1588c2ecf20Sopenharmony_ci *      Values:         <uint>
1598c2ecf20Sopenharmony_ci *
1608c2ecf20Sopenharmony_ci *      The identifier of the Xen event channel used to signal activity
1618c2ecf20Sopenharmony_ci *      in the ring buffer.
1628c2ecf20Sopenharmony_ci *
1638c2ecf20Sopenharmony_ci * page-gref
1648c2ecf20Sopenharmony_ci *      Values:         <uint>
1658c2ecf20Sopenharmony_ci *
1668c2ecf20Sopenharmony_ci *      The Xen grant reference granting permission for the backend to map
1678c2ecf20Sopenharmony_ci *      a sole page in a single page sized event ring buffer.
1688c2ecf20Sopenharmony_ci *
1698c2ecf20Sopenharmony_ci * page-ref
1708c2ecf20Sopenharmony_ci *      Values:         <uint>
1718c2ecf20Sopenharmony_ci *
1728c2ecf20Sopenharmony_ci *      OBSOLETE, not recommended for use.
1738c2ecf20Sopenharmony_ci *      PFN of the shared page.
1748c2ecf20Sopenharmony_ci */
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci/*
1778c2ecf20Sopenharmony_ci * EVENT CODES.
1788c2ecf20Sopenharmony_ci */
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci#define XENKBD_TYPE_MOTION		1
1818c2ecf20Sopenharmony_ci#define XENKBD_TYPE_RESERVED		2
1828c2ecf20Sopenharmony_ci#define XENKBD_TYPE_KEY			3
1838c2ecf20Sopenharmony_ci#define XENKBD_TYPE_POS			4
1848c2ecf20Sopenharmony_ci#define XENKBD_TYPE_MTOUCH		5
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci/* Multi-touch event sub-codes */
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci#define XENKBD_MT_EV_DOWN		0
1898c2ecf20Sopenharmony_ci#define XENKBD_MT_EV_UP			1
1908c2ecf20Sopenharmony_ci#define XENKBD_MT_EV_MOTION		2
1918c2ecf20Sopenharmony_ci#define XENKBD_MT_EV_SYN		3
1928c2ecf20Sopenharmony_ci#define XENKBD_MT_EV_SHAPE		4
1938c2ecf20Sopenharmony_ci#define XENKBD_MT_EV_ORIENT		5
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci/*
1968c2ecf20Sopenharmony_ci * CONSTANTS, XENSTORE FIELD AND PATH NAME STRINGS, HELPERS.
1978c2ecf20Sopenharmony_ci */
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci#define XENKBD_DRIVER_NAME		"vkbd"
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ci#define XENKBD_FIELD_FEAT_DSBL_KEYBRD	"feature-disable-keyboard"
2028c2ecf20Sopenharmony_ci#define XENKBD_FIELD_FEAT_DSBL_POINTER	"feature-disable-pointer"
2038c2ecf20Sopenharmony_ci#define XENKBD_FIELD_FEAT_ABS_POINTER	"feature-abs-pointer"
2048c2ecf20Sopenharmony_ci#define XENKBD_FIELD_FEAT_RAW_POINTER	"feature-raw-pointer"
2058c2ecf20Sopenharmony_ci#define XENKBD_FIELD_FEAT_MTOUCH	"feature-multi-touch"
2068c2ecf20Sopenharmony_ci#define XENKBD_FIELD_REQ_ABS_POINTER	"request-abs-pointer"
2078c2ecf20Sopenharmony_ci#define XENKBD_FIELD_REQ_RAW_POINTER	"request-raw-pointer"
2088c2ecf20Sopenharmony_ci#define XENKBD_FIELD_REQ_MTOUCH		"request-multi-touch"
2098c2ecf20Sopenharmony_ci#define XENKBD_FIELD_RING_GREF		"page-gref"
2108c2ecf20Sopenharmony_ci#define XENKBD_FIELD_EVT_CHANNEL	"event-channel"
2118c2ecf20Sopenharmony_ci#define XENKBD_FIELD_WIDTH		"width"
2128c2ecf20Sopenharmony_ci#define XENKBD_FIELD_HEIGHT		"height"
2138c2ecf20Sopenharmony_ci#define XENKBD_FIELD_MT_WIDTH		"multi-touch-width"
2148c2ecf20Sopenharmony_ci#define XENKBD_FIELD_MT_HEIGHT		"multi-touch-height"
2158c2ecf20Sopenharmony_ci#define XENKBD_FIELD_MT_NUM_CONTACTS	"multi-touch-num-contacts"
2168c2ecf20Sopenharmony_ci#define XENKBD_FIELD_UNIQUE_ID		"unique-id"
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci/* OBSOLETE, not recommended for use */
2198c2ecf20Sopenharmony_ci#define XENKBD_FIELD_RING_REF		"page-ref"
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci/*
2228c2ecf20Sopenharmony_ci *****************************************************************************
2238c2ecf20Sopenharmony_ci * Description of the protocol between frontend and backend driver.
2248c2ecf20Sopenharmony_ci *****************************************************************************
2258c2ecf20Sopenharmony_ci *
2268c2ecf20Sopenharmony_ci * The two halves of a Para-virtual driver communicate with
2278c2ecf20Sopenharmony_ci * each other using a shared page and an event channel.
2288c2ecf20Sopenharmony_ci * Shared page contains a ring with event structures.
2298c2ecf20Sopenharmony_ci *
2308c2ecf20Sopenharmony_ci * All reserved fields in the structures below must be 0.
2318c2ecf20Sopenharmony_ci *
2328c2ecf20Sopenharmony_ci *****************************************************************************
2338c2ecf20Sopenharmony_ci *                           Backend to frontend events
2348c2ecf20Sopenharmony_ci *****************************************************************************
2358c2ecf20Sopenharmony_ci *
2368c2ecf20Sopenharmony_ci * Frontends should ignore unknown in events.
2378c2ecf20Sopenharmony_ci * All event packets have the same length (40 octets)
2388c2ecf20Sopenharmony_ci * All event packets have common header:
2398c2ecf20Sopenharmony_ci *
2408c2ecf20Sopenharmony_ci *          0         octet
2418c2ecf20Sopenharmony_ci * +-----------------+
2428c2ecf20Sopenharmony_ci * |       type      |
2438c2ecf20Sopenharmony_ci * +-----------------+
2448c2ecf20Sopenharmony_ci * type - uint8_t, event code, XENKBD_TYPE_???
2458c2ecf20Sopenharmony_ci *
2468c2ecf20Sopenharmony_ci *
2478c2ecf20Sopenharmony_ci * Pointer relative movement event
2488c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
2498c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2508c2ecf20Sopenharmony_ci * |  _TYPE_MOTION  |                     reserved                     | 4
2518c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2528c2ecf20Sopenharmony_ci * |                               rel_x                               | 8
2538c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2548c2ecf20Sopenharmony_ci * |                               rel_y                               | 12
2558c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2568c2ecf20Sopenharmony_ci * |                               rel_z                               | 16
2578c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2588c2ecf20Sopenharmony_ci * |                             reserved                              | 20
2598c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2608c2ecf20Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
2618c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2628c2ecf20Sopenharmony_ci * |                             reserved                              | 40
2638c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2648c2ecf20Sopenharmony_ci *
2658c2ecf20Sopenharmony_ci * rel_x - int32_t, relative X motion
2668c2ecf20Sopenharmony_ci * rel_y - int32_t, relative Y motion
2678c2ecf20Sopenharmony_ci * rel_z - int32_t, relative Z motion (wheel)
2688c2ecf20Sopenharmony_ci */
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_cistruct xenkbd_motion {
2718c2ecf20Sopenharmony_ci	uint8_t type;
2728c2ecf20Sopenharmony_ci	int32_t rel_x;
2738c2ecf20Sopenharmony_ci	int32_t rel_y;
2748c2ecf20Sopenharmony_ci	int32_t rel_z;
2758c2ecf20Sopenharmony_ci};
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci/*
2788c2ecf20Sopenharmony_ci * Key event (includes pointer buttons)
2798c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
2808c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2818c2ecf20Sopenharmony_ci * |  _TYPE_KEY     |     pressed    |            reserved             | 4
2828c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2838c2ecf20Sopenharmony_ci * |                              keycode                              | 8
2848c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2858c2ecf20Sopenharmony_ci * |                             reserved                              | 12
2868c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2878c2ecf20Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
2888c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2898c2ecf20Sopenharmony_ci * |                             reserved                              | 40
2908c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
2918c2ecf20Sopenharmony_ci *
2928c2ecf20Sopenharmony_ci * pressed - uint8_t, 1 if pressed; 0 otherwise
2938c2ecf20Sopenharmony_ci * keycode - uint32_t, KEY_* from linux/input.h
2948c2ecf20Sopenharmony_ci */
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_cistruct xenkbd_key {
2978c2ecf20Sopenharmony_ci	uint8_t type;
2988c2ecf20Sopenharmony_ci	uint8_t pressed;
2998c2ecf20Sopenharmony_ci	uint32_t keycode;
3008c2ecf20Sopenharmony_ci};
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci/*
3038c2ecf20Sopenharmony_ci * Pointer absolute position event
3048c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
3058c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3068c2ecf20Sopenharmony_ci * |  _TYPE_POS     |                     reserved                     | 4
3078c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3088c2ecf20Sopenharmony_ci * |                               abs_x                               | 8
3098c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3108c2ecf20Sopenharmony_ci * |                               abs_y                               | 12
3118c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3128c2ecf20Sopenharmony_ci * |                               rel_z                               | 16
3138c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3148c2ecf20Sopenharmony_ci * |                             reserved                              | 20
3158c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3168c2ecf20Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
3178c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3188c2ecf20Sopenharmony_ci * |                             reserved                              | 40
3198c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3208c2ecf20Sopenharmony_ci *
3218c2ecf20Sopenharmony_ci * abs_x - int32_t, absolute X position (in FB pixels)
3228c2ecf20Sopenharmony_ci * abs_y - int32_t, absolute Y position (in FB pixels)
3238c2ecf20Sopenharmony_ci * rel_z - int32_t, relative Z motion (wheel)
3248c2ecf20Sopenharmony_ci */
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_cistruct xenkbd_position {
3278c2ecf20Sopenharmony_ci	uint8_t type;
3288c2ecf20Sopenharmony_ci	int32_t abs_x;
3298c2ecf20Sopenharmony_ci	int32_t abs_y;
3308c2ecf20Sopenharmony_ci	int32_t rel_z;
3318c2ecf20Sopenharmony_ci};
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_ci/*
3348c2ecf20Sopenharmony_ci * Multi-touch event and its sub-types
3358c2ecf20Sopenharmony_ci *
3368c2ecf20Sopenharmony_ci * All multi-touch event packets have common header:
3378c2ecf20Sopenharmony_ci *
3388c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
3398c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3408c2ecf20Sopenharmony_ci * |  _TYPE_MTOUCH  |   event_type   |   contact_id   |    reserved    | 4
3418c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3428c2ecf20Sopenharmony_ci * |                             reserved                              | 8
3438c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3448c2ecf20Sopenharmony_ci *
3458c2ecf20Sopenharmony_ci * event_type - unt8_t, multi-touch event sub-type, XENKBD_MT_EV_???
3468c2ecf20Sopenharmony_ci * contact_id - unt8_t, ID of the contact
3478c2ecf20Sopenharmony_ci *
3488c2ecf20Sopenharmony_ci * Touch interactions can consist of one or more contacts.
3498c2ecf20Sopenharmony_ci * For each contact, a series of events is generated, starting
3508c2ecf20Sopenharmony_ci * with a down event, followed by zero or more motion events,
3518c2ecf20Sopenharmony_ci * and ending with an up event. Events relating to the same
3528c2ecf20Sopenharmony_ci * contact point can be identified by the ID of the sequence: contact ID.
3538c2ecf20Sopenharmony_ci * Contact ID may be reused after XENKBD_MT_EV_UP event and
3548c2ecf20Sopenharmony_ci * is in the [0; XENKBD_FIELD_NUM_CONTACTS - 1] range.
3558c2ecf20Sopenharmony_ci *
3568c2ecf20Sopenharmony_ci * For further information please refer to documentation on Wayland [1],
3578c2ecf20Sopenharmony_ci * Linux [2] and Windows [3] multi-touch support.
3588c2ecf20Sopenharmony_ci *
3598c2ecf20Sopenharmony_ci * [1] https://cgit.freedesktop.org/wayland/wayland/tree/protocol/wayland.xml
3608c2ecf20Sopenharmony_ci * [2] https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.rst
3618c2ecf20Sopenharmony_ci * [3] https://msdn.microsoft.com/en-us/library/jj151564(v=vs.85).aspx
3628c2ecf20Sopenharmony_ci *
3638c2ecf20Sopenharmony_ci *
3648c2ecf20Sopenharmony_ci * Multi-touch down event - sent when a new touch is made: touch is assigned
3658c2ecf20Sopenharmony_ci * a unique contact ID, sent with this and consequent events related
3668c2ecf20Sopenharmony_ci * to this touch.
3678c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
3688c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3698c2ecf20Sopenharmony_ci * |  _TYPE_MTOUCH  |   _MT_EV_DOWN  |   contact_id   |    reserved    | 4
3708c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3718c2ecf20Sopenharmony_ci * |                             reserved                              | 8
3728c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3738c2ecf20Sopenharmony_ci * |                               abs_x                               | 12
3748c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3758c2ecf20Sopenharmony_ci * |                               abs_y                               | 16
3768c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3778c2ecf20Sopenharmony_ci * |                             reserved                              | 20
3788c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3798c2ecf20Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
3808c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3818c2ecf20Sopenharmony_ci * |                             reserved                              | 40
3828c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3838c2ecf20Sopenharmony_ci *
3848c2ecf20Sopenharmony_ci * abs_x - int32_t, absolute X position, in pixels
3858c2ecf20Sopenharmony_ci * abs_y - int32_t, absolute Y position, in pixels
3868c2ecf20Sopenharmony_ci *
3878c2ecf20Sopenharmony_ci * Multi-touch contact release event
3888c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
3898c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3908c2ecf20Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_UP     |   contact_id   |    reserved    | 4
3918c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3928c2ecf20Sopenharmony_ci * |                             reserved                              | 8
3938c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3948c2ecf20Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
3958c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3968c2ecf20Sopenharmony_ci * |                             reserved                              | 40
3978c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
3988c2ecf20Sopenharmony_ci *
3998c2ecf20Sopenharmony_ci * Multi-touch motion event
4008c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
4018c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4028c2ecf20Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_MOTION |   contact_id   |    reserved    | 4
4038c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4048c2ecf20Sopenharmony_ci * |                             reserved                              | 8
4058c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4068c2ecf20Sopenharmony_ci * |                               abs_x                               | 12
4078c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4088c2ecf20Sopenharmony_ci * |                               abs_y                               | 16
4098c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4108c2ecf20Sopenharmony_ci * |                             reserved                              | 20
4118c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4128c2ecf20Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
4138c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4148c2ecf20Sopenharmony_ci * |                             reserved                              | 40
4158c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4168c2ecf20Sopenharmony_ci *
4178c2ecf20Sopenharmony_ci * abs_x - int32_t, absolute X position, in pixels,
4188c2ecf20Sopenharmony_ci * abs_y - int32_t, absolute Y position, in pixels,
4198c2ecf20Sopenharmony_ci *
4208c2ecf20Sopenharmony_ci * Multi-touch input synchronization event - shows end of a set of events
4218c2ecf20Sopenharmony_ci * which logically belong together.
4228c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
4238c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4248c2ecf20Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_SYN    |   contact_id   |    reserved    | 4
4258c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4268c2ecf20Sopenharmony_ci * |                             reserved                              | 8
4278c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4288c2ecf20Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
4298c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4308c2ecf20Sopenharmony_ci * |                             reserved                              | 40
4318c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4328c2ecf20Sopenharmony_ci *
4338c2ecf20Sopenharmony_ci * Multi-touch shape event - touch point's shape has changed its shape.
4348c2ecf20Sopenharmony_ci * Shape is approximated by an ellipse through the major and minor axis
4358c2ecf20Sopenharmony_ci * lengths: major is the longer diameter of the ellipse and minor is the
4368c2ecf20Sopenharmony_ci * shorter one. Center of the ellipse is reported via
4378c2ecf20Sopenharmony_ci * XENKBD_MT_EV_DOWN/XENKBD_MT_EV_MOTION events.
4388c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
4398c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4408c2ecf20Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_SHAPE  |   contact_id   |    reserved    | 4
4418c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4428c2ecf20Sopenharmony_ci * |                             reserved                              | 8
4438c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4448c2ecf20Sopenharmony_ci * |                               major                               | 12
4458c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4468c2ecf20Sopenharmony_ci * |                               minor                               | 16
4478c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4488c2ecf20Sopenharmony_ci * |                             reserved                              | 20
4498c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4508c2ecf20Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
4518c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4528c2ecf20Sopenharmony_ci * |                             reserved                              | 40
4538c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4548c2ecf20Sopenharmony_ci *
4558c2ecf20Sopenharmony_ci * major - unt32_t, length of the major axis, pixels
4568c2ecf20Sopenharmony_ci * minor - unt32_t, length of the minor axis, pixels
4578c2ecf20Sopenharmony_ci *
4588c2ecf20Sopenharmony_ci * Multi-touch orientation event - touch point's shape has changed
4598c2ecf20Sopenharmony_ci * its orientation: calculated as a clockwise angle between the major axis
4608c2ecf20Sopenharmony_ci * of the ellipse and positive Y axis in degrees, [-180; +180].
4618c2ecf20Sopenharmony_ci *         0                1                 2               3        octet
4628c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4638c2ecf20Sopenharmony_ci * |  _TYPE_MTOUCH  |  _MT_EV_ORIENT |   contact_id   |    reserved    | 4
4648c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4658c2ecf20Sopenharmony_ci * |                             reserved                              | 8
4668c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4678c2ecf20Sopenharmony_ci * |           orientation           |            reserved             | 12
4688c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4698c2ecf20Sopenharmony_ci * |                             reserved                              | 16
4708c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4718c2ecf20Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
4728c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4738c2ecf20Sopenharmony_ci * |                             reserved                              | 40
4748c2ecf20Sopenharmony_ci * +----------------+----------------+----------------+----------------+
4758c2ecf20Sopenharmony_ci *
4768c2ecf20Sopenharmony_ci * orientation - int16_t, clockwise angle of the major axis
4778c2ecf20Sopenharmony_ci */
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_cistruct xenkbd_mtouch {
4808c2ecf20Sopenharmony_ci	uint8_t type;			/* XENKBD_TYPE_MTOUCH */
4818c2ecf20Sopenharmony_ci	uint8_t event_type;		/* XENKBD_MT_EV_??? */
4828c2ecf20Sopenharmony_ci	uint8_t contact_id;
4838c2ecf20Sopenharmony_ci	uint8_t reserved[5];		/* reserved for the future use */
4848c2ecf20Sopenharmony_ci	union {
4858c2ecf20Sopenharmony_ci		struct {
4868c2ecf20Sopenharmony_ci			int32_t abs_x;	/* absolute X position, pixels */
4878c2ecf20Sopenharmony_ci			int32_t abs_y;	/* absolute Y position, pixels */
4888c2ecf20Sopenharmony_ci		} pos;
4898c2ecf20Sopenharmony_ci		struct {
4908c2ecf20Sopenharmony_ci			uint32_t major;	/* length of the major axis, pixels */
4918c2ecf20Sopenharmony_ci			uint32_t minor;	/* length of the minor axis, pixels */
4928c2ecf20Sopenharmony_ci		} shape;
4938c2ecf20Sopenharmony_ci		int16_t orientation;	/* clockwise angle of the major axis */
4948c2ecf20Sopenharmony_ci	} u;
4958c2ecf20Sopenharmony_ci};
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci#define XENKBD_IN_EVENT_SIZE 40
4988c2ecf20Sopenharmony_ci
4998c2ecf20Sopenharmony_ciunion xenkbd_in_event {
5008c2ecf20Sopenharmony_ci	uint8_t type;
5018c2ecf20Sopenharmony_ci	struct xenkbd_motion motion;
5028c2ecf20Sopenharmony_ci	struct xenkbd_key key;
5038c2ecf20Sopenharmony_ci	struct xenkbd_position pos;
5048c2ecf20Sopenharmony_ci	struct xenkbd_mtouch mtouch;
5058c2ecf20Sopenharmony_ci	char pad[XENKBD_IN_EVENT_SIZE];
5068c2ecf20Sopenharmony_ci};
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci/*
5098c2ecf20Sopenharmony_ci *****************************************************************************
5108c2ecf20Sopenharmony_ci *                            Frontend to backend events
5118c2ecf20Sopenharmony_ci *****************************************************************************
5128c2ecf20Sopenharmony_ci *
5138c2ecf20Sopenharmony_ci * Out events may be sent only when requested by backend, and receipt
5148c2ecf20Sopenharmony_ci * of an unknown out event is an error.
5158c2ecf20Sopenharmony_ci * No out events currently defined.
5168c2ecf20Sopenharmony_ci
5178c2ecf20Sopenharmony_ci * All event packets have the same length (40 octets)
5188c2ecf20Sopenharmony_ci * All event packets have common header:
5198c2ecf20Sopenharmony_ci *          0         octet
5208c2ecf20Sopenharmony_ci * +-----------------+
5218c2ecf20Sopenharmony_ci * |       type      |
5228c2ecf20Sopenharmony_ci * +-----------------+
5238c2ecf20Sopenharmony_ci * type - uint8_t, event code
5248c2ecf20Sopenharmony_ci */
5258c2ecf20Sopenharmony_ci
5268c2ecf20Sopenharmony_ci#define XENKBD_OUT_EVENT_SIZE 40
5278c2ecf20Sopenharmony_ci
5288c2ecf20Sopenharmony_ciunion xenkbd_out_event {
5298c2ecf20Sopenharmony_ci	uint8_t type;
5308c2ecf20Sopenharmony_ci	char pad[XENKBD_OUT_EVENT_SIZE];
5318c2ecf20Sopenharmony_ci};
5328c2ecf20Sopenharmony_ci
5338c2ecf20Sopenharmony_ci/*
5348c2ecf20Sopenharmony_ci *****************************************************************************
5358c2ecf20Sopenharmony_ci *                            Shared page
5368c2ecf20Sopenharmony_ci *****************************************************************************
5378c2ecf20Sopenharmony_ci */
5388c2ecf20Sopenharmony_ci
5398c2ecf20Sopenharmony_ci#define XENKBD_IN_RING_SIZE 2048
5408c2ecf20Sopenharmony_ci#define XENKBD_IN_RING_LEN (XENKBD_IN_RING_SIZE / XENKBD_IN_EVENT_SIZE)
5418c2ecf20Sopenharmony_ci#define XENKBD_IN_RING_OFFS 1024
5428c2ecf20Sopenharmony_ci#define XENKBD_IN_RING(page) \
5438c2ecf20Sopenharmony_ci	((union xenkbd_in_event *)((char *)(page) + XENKBD_IN_RING_OFFS))
5448c2ecf20Sopenharmony_ci#define XENKBD_IN_RING_REF(page, idx) \
5458c2ecf20Sopenharmony_ci	(XENKBD_IN_RING((page))[(idx) % XENKBD_IN_RING_LEN])
5468c2ecf20Sopenharmony_ci
5478c2ecf20Sopenharmony_ci#define XENKBD_OUT_RING_SIZE 1024
5488c2ecf20Sopenharmony_ci#define XENKBD_OUT_RING_LEN (XENKBD_OUT_RING_SIZE / XENKBD_OUT_EVENT_SIZE)
5498c2ecf20Sopenharmony_ci#define XENKBD_OUT_RING_OFFS (XENKBD_IN_RING_OFFS + XENKBD_IN_RING_SIZE)
5508c2ecf20Sopenharmony_ci#define XENKBD_OUT_RING(page) \
5518c2ecf20Sopenharmony_ci	((union xenkbd_out_event *)((char *)(page) + XENKBD_OUT_RING_OFFS))
5528c2ecf20Sopenharmony_ci#define XENKBD_OUT_RING_REF(page, idx) \
5538c2ecf20Sopenharmony_ci	(XENKBD_OUT_RING((page))[(idx) % XENKBD_OUT_RING_LEN])
5548c2ecf20Sopenharmony_ci
5558c2ecf20Sopenharmony_cistruct xenkbd_page {
5568c2ecf20Sopenharmony_ci	uint32_t in_cons, in_prod;
5578c2ecf20Sopenharmony_ci	uint32_t out_cons, out_prod;
5588c2ecf20Sopenharmony_ci};
5598c2ecf20Sopenharmony_ci
5608c2ecf20Sopenharmony_ci#endif /* __XEN_PUBLIC_IO_KBDIF_H__ */
561