linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] Documentation: Add evdev type and code definitions
@ 2011-01-07 21:28 Chase Douglas
  2011-01-07 21:53 ` Dmitry Torokhov
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Chase Douglas @ 2011-01-07 21:28 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Henrik Rydberg, Chris Bagwell, Peter Hutterer, Nikolai Kondrashov,
	linux-input, linux-kernel

This commit adds the file Documentation/input/evdev-codes.txt.

Cc: Henrik Rydberg <rydberg@euromail.se>
Cc: Chris Bagwell <chris@cnpbagwell.com>
Cc: Peter Hutterer <peter.hutterer@who-t.net>
Cc: Nikolai Kondrashov <spbnick@gmail.com>
Cc: linux-input@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
---
 Documentation/input/evdev-codes.txt |  206 +++++++++++++++++++++++++++++++++++
 1 files changed, 206 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/input/evdev-codes.txt

diff --git a/Documentation/input/evdev-codes.txt b/Documentation/input/evdev-codes.txt
new file mode 100644
index 0000000..8d7262c
--- /dev/null
+++ b/Documentation/input/evdev-codes.txt
@@ -0,0 +1,206 @@
+The evdev protocol uses a map of types and codes to express input device values
+to userspace. This document describes the types and codes and how and when they
+may be used.
+
+The evdev protocol is a stateful protocol. Events are emitted only when values
+of evdev codes have changed. However, the state is maintained within the Linux
+input subsystem; drivers do not need to maintain the state and may attempt to
+emit unchanged values without harm. Userspace may obtain the current state of
+evdev code values using the EVIOCGABS ioctl defined in linux/input.h.
+
+Types:
+==========
+Types are groupings of codes under a logical input construct. Each type has a
+set of applicable codes to be used in generating events. See the Codes section
+for details on valid codes for each type.
+
+* EV_SYN:
+  - Used as markers to separate events. Events may be separated in time or in
+    space, such as with the multitouch protocol.
+
+* EV_KEY:
+  - Used to describe keyboard and other key-like input events.
+
+* EV_REL:
+  - Used to describe relative input events, e.g. moving the mouse 5 units to the
+    left.
+
+* EV_ABS:
+  - Used to describe absolute input events, e.g. describing the coordinates of a
+    touch on a touchscreen.
+
+* EV_MSC:
+  - Used to describe miscellaneous input events that do not fit into other
+    types.
+
+* EV_SW:
+  - Used to describe binary state input switches.
+
+* EV_LED:
+  - Used to turn LEDs on devices on and off.
+
+* EV_SND:
+  - Used to output sound to devices.
+
+* EV_REP:
+  - Used for autorepeating devices.
+
+* EV_FF:
+  - Used to send force feedback commands to an input device.
+
+* EV_PWR:
+  - A special type for power button and switch input.
+
+* EV_FF_STATUS:
+  - Used to receive force feedback device status.
+
+Codes:
+==========
+Codes define the precise type of event.
+
+EV_SYN:
+----------
+EV_SYN event values are undefined. Their usage is
+defined only by when they are sent in the evdev event stream.
+
+* SYN_REPORT:
+  - Used to synchronize and separate events into frames of time. For example,
+    motion of a mouse may set the REL_X and REL_Y values for one motion, then
+    emit a SYN_REPORT. The next motion will emit more REL_X and REL_Y values and
+    send another SYN_REPORT.
+
+* SYN_CONFIG:
+  - TBD
+
+* SYN_MT_REPORT:
+  - Used to synchronize and separate touch events. See the
+    multi-touch-protocol.txt document for more information.
+
+EV_KEY:
+----------
+EV_KEY events take the form KEY_<name> or BTN_<name>. For example, KEY_A is used
+to represent the 'A' key on a keyboard. When a key is depressed, an event with
+the key's code is emitted with value 1. When the key is released, an event is
+emitted with value 0. Some hardware send events when a key is repeated. These
+events have a value of 2. In general, KEY_<name> is used for keyboard keys, and
+BTN_<name> is used for other types of momentary switch events.
+
+A few EV_KEY codes have special meanings:
+
+* BTN_TOOL_<name>:
+  - These codes are used in conjunction with input trackpads, tablets, and
+    touchscreens. These devices may be used with fingers, pens, or other tools.
+    When an event occurs and a tool is used, the corresponding BTN_TOOL_<name>
+    code should be set to a value of 1. When the tool is no longer interacting
+    with the input device, the BTN_TOOL_<name> code should be reset to 0. All
+    trackpads, tablets, and touchscreens should use at least one BTN_TOOL_<name>
+    code when events are generated.
+
+* BTN_TOUCH:
+    BTN_TOUCH is used for touch contact. While an input tool is determined to be
+    within meaningful physical contact, the value of this property must be set
+    to 1. Meaningful physical contact may mean any contact, or it may mean
+    contact conditioned by an implementation defined property. For example, a
+    touchpad may set the value to 1 only when the touch pressure rises above a
+    certain value. BTN_TOUCH may be combined with BTN_TOOL_<name> codes. For
+    example, a pen tablet may set BTN_TOOL_PEN to 1 and BTN_TOUCH to 0 while the
+    pen is hovering over but not touching the tablet surface.
+
+Note: For appropriate function of the legacy mousedev emulation driver,
+BTN_TOUCH must be the first evdev code emitted in a synchronization frame.
+
+Note: Historically a touch device with BTN_TOOL_FINGER and BTN_TOUCH was
+interpreted as a touchpad by userspace, while a similar device without
+BTN_TOOL_FINGER was interpreted as a touchscreen. For backwards compatibility
+with current userspace it is recommended to follow this distinction. In the
+future, this distinction will be deprecated and the device properties ioctl
+EVIOCGPROP, defined in linux/input.h, will be used to convey the device type.
+
+* BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP:
+  - These codes denote one, two, three, and four finger interaction on a
+    trackpad or touchscreen. For example, if the user uses two fingers and moves
+    them on the touchpad in an effort to scroll content on screen,
+    BTN_TOOL_DOUBLETAP should be set to value 1 for the duration of the motion.
+    Note that these codes and the BTN_TOOL_<name> and BTN_TOUCH codes are
+    orthogonal in purpose. A trackpad event generated by finger touches should
+    generate events for one code from each group. At most only one of these
+    codes should have a value of 1 during any synchronization frame.
+
+Note: Historically some drivers emitted multiple of the finger count codes with
+a value of 1 in the same synchronization frame. This usage is deprecated.
+
+Note: In multitouch drivers, the input_mt_report_finger_count() function should
+be used to emit these codes. Please see multi-touch-protocol.txt for details.
+
+* KEY_SUSPEND, KEY_POWER:
+  - These codes are reserved for the EV_PWR type.
+
+EV_REL:
+----------
+EV_REL events describe relative changes in a property. For example, a mouse may
+move to the left by a certain number of units, but its absolute position in
+space is unknown. If the absolute position is known, EV_ABS codes should be used
+instead of EV_REL codes.
+
+A few EV_REL codes have special meanings:
+
+* REL_WHEEL, REL_HWHEEL:
+  - These codes are used for vertical and horizontal scroll wheels,
+    respectively.
+
+EV_ABS:
+----------
+EV_ABS events describe absolute changes in a property. For example, a touchpad
+may emit coordinates for a touch location.
+
+A few EV_ABS codes have special meanings:
+
+* ABS_DISTANCE:
+  - Used to describe the distance of a tool from an interaction surface. This
+    should only be used while the tool is hovering, meaning in close proximity
+    of the device. If the input device may be used freely in three dimensions,
+    consider ABS_Z instead.
+
+* ABS_MT_<name>:
+  - Used to describe multitouch input events. Please see
+    multi-touch-protocol.txt for details.
+
+EV_SW:
+----------
+EV_SW events describe stateful binary switches. For example, the SW_LID code is
+used to denote when a laptop lid is closed.
+
+EV_MSC:
+----------
+EV_MSC events are used for input and output events that do not fall under other
+categories.
+
+EV_LED:
+----------
+EV_LED events are used for input and output to set and query the state of
+various LEDs on devices.
+
+EV_REP:
+----------
+EV_REP events are used for specifying autorepeating events.
+
+EV_SND:
+----------
+EV_SND events are used for sending sound commands to simple sound output
+devices.
+
+EV_FF:
+----------
+EV_FF events are used to initialize a force feedback capable device and to cause
+such device to feedback.
+
+EV_PWR:
+----------
+EV_PWR events are a special type of key event used specifically for monitoring
+power buttons and switches. The two codes in use are:
+
+* KEY_POWER:
+  - Used to denote a power button event.
+
+* KEY_SUSPEND:
+  - Used to denote a suspend button event.
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] Documentation: Add evdev type and code definitions
  2011-01-07 21:28 [PATCH v2] Documentation: Add evdev type and code definitions Chase Douglas
@ 2011-01-07 21:53 ` Dmitry Torokhov
  2011-01-07 22:03   ` Chase Douglas
  2011-01-07 22:06 ` Nikolai Kondrashov
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Dmitry Torokhov @ 2011-01-07 21:53 UTC (permalink / raw)
  To: Chase Douglas
  Cc: Henrik Rydberg, Chris Bagwell, Peter Hutterer, Nikolai Kondrashov,
	linux-input, linux-kernel

Hi Chase,

On Fri, Jan 07, 2011 at 04:28:15PM -0500, Chase Douglas wrote:
> +
> +* KEY_SUSPEND, KEY_POWER:
> +  - These codes are reserved for the EV_PWR type.
> +

This is not correct, KEY_SUSPEND and KEY_POWER are valid events for
EV_KEY type. We need to figure out what to do with drivers who like to do
EV_PWR/KEY_PWR though.

The whole EV_PWR business is iffy. IIRC/IIUC it was envisioned to semd
powwer events _to_ the devices to implement device-level PM. We'll have
to revisit it at some point.


> +EV_REL:
> +----------
> +EV_REL events describe relative changes in a property. For example, a mouse may
> +move to the left by a certain number of units, but its absolute position in
> +space is unknown. If the absolute position is known, EV_ABS codes should be used
> +instead of EV_REL codes.
> +
> +A few EV_REL codes have special meanings:
> +
> +* REL_WHEEL, REL_HWHEEL:
> +  - These codes are used for vertical and horizontal scroll wheels,
> +    respectively.
> +
> +EV_ABS:
> +----------
> +EV_ABS events describe absolute changes in a property. For example, a touchpad
> +may emit coordinates for a touch location.
> +
> +A few EV_ABS codes have special meanings:
> +
> +* ABS_DISTANCE:
> +  - Used to describe the distance of a tool from an interaction surface. This
> +    should only be used while the tool is hovering, meaning in close proximity
> +    of the device. If the input device may be used freely in three dimensions,
> +    consider ABS_Z instead.
> +
> +* ABS_MT_<name>:
> +  - Used to describe multitouch input events. Please see
> +    multi-touch-protocol.txt for details.
> +
> +EV_SW:
> +----------
> +EV_SW events describe stateful binary switches. For example, the SW_LID code is
> +used to denote when a laptop lid is closed.

Please add that drivers should refresh switch state upon binding to a
device and also upon resume.

> +
> +EV_MSC:
> +----------
> +EV_MSC events are used for input and output events that do not fall under other
> +categories.
> +
> +EV_LED:
> +----------
> +EV_LED events are used for input and output to set and query the state of
> +various LEDs on devices.
> +
> +EV_REP:
> +----------
> +EV_REP events are used for specifying autorepeating events.
> +
> +EV_SND:
> +----------
> +EV_SND events are used for sending sound commands to simple sound output
> +devices.
> +
> +EV_FF:
> +----------
> +EV_FF events are used to initialize a force feedback capable device and to cause
> +such device to feedback.
> +
> +EV_PWR:
> +----------
> +EV_PWR events are a special type of key event used specifically for monitoring
> +power buttons and switches. The two codes in use are:
> +
> +* KEY_POWER:
> +  - Used to denote a power button event.
> +
> +* KEY_SUSPEND:
> +  - Used to denote a suspend button event.

Just replace this with TBA for now.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] Documentation: Add evdev type and code definitions
  2011-01-07 21:53 ` Dmitry Torokhov
@ 2011-01-07 22:03   ` Chase Douglas
  2011-01-07 22:42     ` Dmitry Torokhov
  0 siblings, 1 reply; 10+ messages in thread
From: Chase Douglas @ 2011-01-07 22:03 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Henrik Rydberg, Chris Bagwell, Peter Hutterer, Nikolai Kondrashov,
	linux-input, linux-kernel

On 01/07/2011 04:53 PM, Dmitry Torokhov wrote:
> Hi Chase,
> 
> On Fri, Jan 07, 2011 at 04:28:15PM -0500, Chase Douglas wrote:
>> +
>> +* KEY_SUSPEND, KEY_POWER:
>> +  - These codes are reserved for the EV_PWR type.
>> +
> 
> This is not correct, KEY_SUSPEND and KEY_POWER are valid events for
> EV_KEY type. We need to figure out what to do with drivers who like to do
> EV_PWR/KEY_PWR though.
> 
> The whole EV_PWR business is iffy. IIRC/IIUC it was envisioned to semd
> powwer events _to_ the devices to implement device-level PM. We'll have
> to revisit it at some point.

Ahh. Ok, I'll remove this tidbit.

>> +EV_REL:
>> +----------
>> +EV_REL events describe relative changes in a property. For example, a mouse may
>> +move to the left by a certain number of units, but its absolute position in
>> +space is unknown. If the absolute position is known, EV_ABS codes should be used
>> +instead of EV_REL codes.
>> +
>> +A few EV_REL codes have special meanings:
>> +
>> +* REL_WHEEL, REL_HWHEEL:
>> +  - These codes are used for vertical and horizontal scroll wheels,
>> +    respectively.
>> +
>> +EV_ABS:
>> +----------
>> +EV_ABS events describe absolute changes in a property. For example, a touchpad
>> +may emit coordinates for a touch location.
>> +
>> +A few EV_ABS codes have special meanings:
>> +
>> +* ABS_DISTANCE:
>> +  - Used to describe the distance of a tool from an interaction surface. This
>> +    should only be used while the tool is hovering, meaning in close proximity
>> +    of the device. If the input device may be used freely in three dimensions,
>> +    consider ABS_Z instead.
>> +
>> +* ABS_MT_<name>:
>> +  - Used to describe multitouch input events. Please see
>> +    multi-touch-protocol.txt for details.
>> +
>> +EV_SW:
>> +----------
>> +EV_SW events describe stateful binary switches. For example, the SW_LID code is
>> +used to denote when a laptop lid is closed.
> 
> Please add that drivers should refresh switch state upon binding to a
> device and also upon resume.

I've not written any switch evdev drivers, can you clarify what you
mean, maybe give me something to paste in?

Are you meaning that the switch state may have physically changed, and
that the driver should query the physical state to be sure, or do you
mean that the driver must send a new event even if the state has not
changed?

>> +
>> +EV_MSC:
>> +----------
>> +EV_MSC events are used for input and output events that do not fall under other
>> +categories.
>> +
>> +EV_LED:
>> +----------
>> +EV_LED events are used for input and output to set and query the state of
>> +various LEDs on devices.
>> +
>> +EV_REP:
>> +----------
>> +EV_REP events are used for specifying autorepeating events.
>> +
>> +EV_SND:
>> +----------
>> +EV_SND events are used for sending sound commands to simple sound output
>> +devices.
>> +
>> +EV_FF:
>> +----------
>> +EV_FF events are used to initialize a force feedback capable device and to cause
>> +such device to feedback.
>> +
>> +EV_PWR:
>> +----------
>> +EV_PWR events are a special type of key event used specifically for monitoring
>> +power buttons and switches. The two codes in use are:
>> +
>> +* KEY_POWER:
>> +  - Used to denote a power button event.
>> +
>> +* KEY_SUSPEND:
>> +  - Used to denote a suspend button event.
> 
> Just replace this with TBA for now.

Will do.

Thanks!

-- Chase

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] Documentation: Add evdev type and code definitions
  2011-01-07 21:28 [PATCH v2] Documentation: Add evdev type and code definitions Chase Douglas
  2011-01-07 21:53 ` Dmitry Torokhov
@ 2011-01-07 22:06 ` Nikolai Kondrashov
  2011-01-07 22:15   ` Chase Douglas
  2011-01-08  1:15 ` Chris Bagwell
  2011-01-09 14:51 ` Henrik Rydberg
  3 siblings, 1 reply; 10+ messages in thread
From: Nikolai Kondrashov @ 2011-01-07 22:06 UTC (permalink / raw)
  To: Chase Douglas
  Cc: Dmitry Torokhov, Henrik Rydberg, Chris Bagwell, Peter Hutterer,
	linux-input, linux-kernel

On 01/08/2011 12:28 AM, Chase Douglas wrote:
> +* BTN_TOOL_<name>:
> +  - These codes are used in conjunction with input trackpads, tablets, and
> +    touchscreens. These devices may be used with fingers, pens, or other tools.
> +    When an event occurs and a tool is used, the corresponding BTN_TOOL_<name>
> +    code should be set to a value of 1. When the tool is no longer interacting
> +    with the input device, the BTN_TOOL_<name>  code should be reset to 0. All
> +    trackpads, tablets, and touchscreens should use at least one BTN_TOOL_<name>
> +    code when events are generated.

There are some tablets (namely UC-Logic ones), which do not indicate tool
proximity. Yet they may have both a pen and a mouse. They just send reports
with separate report IDs. Currently it is solved by using
HID_QUIRK_MULTI_INPUT and not sending any BTN_TOOL_* events.

Should the documentation reflect the fact that some tablets do not send any
BTN_TOOL_* events, or should the drivers be updated to synthesise them?

Note that in the latter case there will never be a BTN_TOOL_* with
zero value when the tool leaves the digitizing area, but only when the tools
are switched (if ever).

Sincerely,
Nick

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] Documentation: Add evdev type and code definitions
  2011-01-07 22:06 ` Nikolai Kondrashov
@ 2011-01-07 22:15   ` Chase Douglas
  2011-01-07 22:26     ` Nikolai Kondrashov
  0 siblings, 1 reply; 10+ messages in thread
From: Chase Douglas @ 2011-01-07 22:15 UTC (permalink / raw)
  To: Nikolai Kondrashov
  Cc: Dmitry Torokhov, Henrik Rydberg, Chris Bagwell, Peter Hutterer,
	linux-input, linux-kernel

On 01/07/2011 05:06 PM, Nikolai Kondrashov wrote:
> On 01/08/2011 12:28 AM, Chase Douglas wrote:
>> +* BTN_TOOL_<name>:
>> +  - These codes are used in conjunction with input trackpads, tablets, and
>> +    touchscreens. These devices may be used with fingers, pens, or other tools.
>> +    When an event occurs and a tool is used, the corresponding BTN_TOOL_<name>
>> +    code should be set to a value of 1. When the tool is no longer interacting
>> +    with the input device, the BTN_TOOL_<name>  code should be reset to 0. All
>> +    trackpads, tablets, and touchscreens should use at least one BTN_TOOL_<name>
>> +    code when events are generated.
> 
> There are some tablets (namely UC-Logic ones), which do not indicate tool
> proximity. Yet they may have both a pen and a mouse. They just send reports
> with separate report IDs. Currently it is solved by using
> HID_QUIRK_MULTI_INPUT and not sending any BTN_TOOL_* events.
> 
> Should the documentation reflect the fact that some tablets do not send any
> BTN_TOOL_* events, or should the drivers be updated to synthesise them?

I think it should be stated more obviously that all evdev codes are
optional except for specific cases, such as BTN_TOUCH for any type of
touch device. My understanding is that BTN_TOOL_<name> is optional.

Perhaps I should do something like the following for all the evdev codes:

* <evdev code>:
  - Usage: Required|Optional|Required when ... etc.
  - <description>

> Note that in the latter case there will never be a BTN_TOOL_* with
> zero value when the tool leaves the digitizing area, but only when the tools
> are switched (if ever).

Hmm.. That seems incorrect to me. Why wouldn't it follow the behavior
outlined above?

-- Chase

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] Documentation: Add evdev type and code definitions
  2011-01-07 22:15   ` Chase Douglas
@ 2011-01-07 22:26     ` Nikolai Kondrashov
  2011-01-07 22:36       ` Chase Douglas
  0 siblings, 1 reply; 10+ messages in thread
From: Nikolai Kondrashov @ 2011-01-07 22:26 UTC (permalink / raw)
  To: Chase Douglas
  Cc: Dmitry Torokhov, Henrik Rydberg, Chris Bagwell, Peter Hutterer,
	linux-input, linux-kernel

On 01/08/2011 01:15 AM, Chase Douglas wrote:
> Hmm.. That seems incorrect to me. Why wouldn't it follow the behavior
> outlined above?
Because the tablet doesn't report when the tool enters/leaves the proximity.
It just starts/stops sending the coordinates.

A leave timer could be used, though. Maybe we could ignore the case when the
mouse is laying still on the tablet or the pen is held very steadily in
place and just tell that tool left the surface.

Maybe it will be beneficial to have it synthesised after all, as it would
probably ease the integration with xf86-input-wacom and will keep the evdev
protocol more consistent.

Sincerely,
Nick

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] Documentation: Add evdev type and code definitions
  2011-01-07 22:26     ` Nikolai Kondrashov
@ 2011-01-07 22:36       ` Chase Douglas
  0 siblings, 0 replies; 10+ messages in thread
From: Chase Douglas @ 2011-01-07 22:36 UTC (permalink / raw)
  To: Nikolai Kondrashov
  Cc: Dmitry Torokhov, Henrik Rydberg, Chris Bagwell, Peter Hutterer,
	linux-input, linux-kernel

On 01/07/2011 05:26 PM, Nikolai Kondrashov wrote:
> On 01/08/2011 01:15 AM, Chase Douglas wrote:
>> Hmm.. That seems incorrect to me. Why wouldn't it follow the behavior
>> outlined above?
> Because the tablet doesn't report when the tool enters/leaves the proximity.
> It just starts/stops sending the coordinates.
> 
> A leave timer could be used, though. Maybe we could ignore the case when the
> mouse is laying still on the tablet or the pen is held very steadily in
> place and just tell that tool left the surface.
> 
> Maybe it will be beneficial to have it synthesised after all, as it would
> probably ease the integration with xf86-input-wacom and will keep the evdev
> protocol more consistent.

I think I understand now, and it sounds pretty broken :). Do we want to
codify such behaviour, or leave it out as a special case? I don't see
this document as a definitive guide to evdev usage and driver
development, just a reference and best practices guide, so I'm inclined
to say the latter.

-- Chase

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] Documentation: Add evdev type and code definitions
  2011-01-07 22:03   ` Chase Douglas
@ 2011-01-07 22:42     ` Dmitry Torokhov
  0 siblings, 0 replies; 10+ messages in thread
From: Dmitry Torokhov @ 2011-01-07 22:42 UTC (permalink / raw)
  To: Chase Douglas
  Cc: Henrik Rydberg, Chris Bagwell, Peter Hutterer, Nikolai Kondrashov,
	linux-input, linux-kernel

On Fri, Jan 07, 2011 at 05:03:50PM -0500, Chase Douglas wrote:
> On 01/07/2011 04:53 PM, Dmitry Torokhov wrote:
> > Hi Chase,
> > 
> > On Fri, Jan 07, 2011 at 04:28:15PM -0500, Chase Douglas wrote:
> >> +
> >> +EV_SW:
> >> +----------
> >> +EV_SW events describe stateful binary switches. For example, the SW_LID code is
> >> +used to denote when a laptop lid is closed.
> > 
> > Please add that drivers should refresh switch state upon binding to a
> > device and also upon resume.
> 
> I've not written any switch evdev drivers, can you clarify what you
> mean, maybe give me something to paste in?
> 
> Are you meaning that the switch state may have physically changed, and
> that the driver should query the physical state to be sure, or do you

Right, switch state might be physically changed while the device/system
was asleep and thus we need to ensure that kernel's (and userspace)
switch state is consistent with physical state.

Same should be done in the very beginnning, while registering input
device - it is quite possible that we start with some switches in
"on" state.

Technically speaking, some keys might be depressed as well, but we
ignore this possibility and assume that everything is released because
it is simpler, we expect that all depressed keys will be released
shortly anyway, and not all devices allow to query current state of a
button (i.e. devices that only transmit state change).

> mean that the driver must send a new event even if the state has not
> changed?

The drive should send the events and input core will filter them out if
state still matches the old state.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] Documentation: Add evdev type and code definitions
  2011-01-07 21:28 [PATCH v2] Documentation: Add evdev type and code definitions Chase Douglas
  2011-01-07 21:53 ` Dmitry Torokhov
  2011-01-07 22:06 ` Nikolai Kondrashov
@ 2011-01-08  1:15 ` Chris Bagwell
  2011-01-09 14:51 ` Henrik Rydberg
  3 siblings, 0 replies; 10+ messages in thread
From: Chris Bagwell @ 2011-01-08  1:15 UTC (permalink / raw)
  To: Chase Douglas
  Cc: Dmitry Torokhov, Henrik Rydberg, Peter Hutterer,
	Nikolai Kondrashov, linux-input, linux-kernel

Hi Chase,

On Fri, Jan 7, 2011 at 3:28 PM, Chase Douglas
<chase.douglas@canonical.com> wrote:
> This commit adds the file Documentation/input/evdev-codes.txt.
>
> Cc: Henrik Rydberg <rydberg@euromail.se>
> Cc: Chris Bagwell <chris@cnpbagwell.com>
> Cc: Peter Hutterer <peter.hutterer@who-t.net>
> Cc: Nikolai Kondrashov <spbnick@gmail.com>
> Cc: linux-input@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
> ---
>  Documentation/input/evdev-codes.txt |  206 +++++++++++++++++++++++++++++++++++
>  1 files changed, 206 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/input/evdev-codes.txt
>
> diff --git a/Documentation/input/evdev-codes.txt b/Documentation/input/evdev-codes.txt
> new file mode 100644
> index 0000000..8d7262c
> --- /dev/null
> +++ b/Documentation/input/evdev-codes.txt
> @@ -0,0 +1,206 @@
> +The evdev protocol uses a map of types and codes to express input device values
> +to userspace. This document describes the types and codes and how and when they
> +may be used.
> +
> +The evdev protocol is a stateful protocol. Events are emitted only when values
> +of evdev codes have changed. However, the state is maintained within the Linux
> +input subsystem; drivers do not need to maintain the state and may attempt to
> +emit unchanged values without harm. Userspace may obtain the current state of
> +evdev code values using the EVIOCGABS ioctl defined in linux/input.h.
> +
> +Types:
> +==========
> +Types are groupings of codes under a logical input construct. Each type has a
> +set of applicable codes to be used in generating events. See the Codes section
> +for details on valid codes for each type.
> +
> +* EV_SYN:
> +  - Used as markers to separate events. Events may be separated in time or in
> +    space, such as with the multitouch protocol.
> +
> +* EV_KEY:
> +  - Used to describe keyboard and other key-like input events.
> +
> +* EV_REL:
> +  - Used to describe relative input events, e.g. moving the mouse 5 units to the
> +    left.
> +
> +* EV_ABS:
> +  - Used to describe absolute input events, e.g. describing the coordinates of a
> +    touch on a touchscreen.
> +
> +* EV_MSC:
> +  - Used to describe miscellaneous input events that do not fit into other
> +    types.
> +
> +* EV_SW:
> +  - Used to describe binary state input switches.
> +
> +* EV_LED:
> +  - Used to turn LEDs on devices on and off.
> +
> +* EV_SND:
> +  - Used to output sound to devices.
> +
> +* EV_REP:
> +  - Used for autorepeating devices.
> +
> +* EV_FF:
> +  - Used to send force feedback commands to an input device.
> +
> +* EV_PWR:
> +  - A special type for power button and switch input.
> +
> +* EV_FF_STATUS:
> +  - Used to receive force feedback device status.
> +
> +Codes:
> +==========
> +Codes define the precise type of event.
> +
> +EV_SYN:
> +----------
> +EV_SYN event values are undefined. Their usage is
> +defined only by when they are sent in the evdev event stream.
> +
> +* SYN_REPORT:
> +  - Used to synchronize and separate events into frames of time. For example,
> +    motion of a mouse may set the REL_X and REL_Y values for one motion, then
> +    emit a SYN_REPORT. The next motion will emit more REL_X and REL_Y values and
> +    send another SYN_REPORT.
> +
> +* SYN_CONFIG:
> +  - TBD
> +
> +* SYN_MT_REPORT:
> +  - Used to synchronize and separate touch events. See the
> +    multi-touch-protocol.txt document for more information.
> +
> +EV_KEY:
> +----------
> +EV_KEY events take the form KEY_<name> or BTN_<name>. For example, KEY_A is used
> +to represent the 'A' key on a keyboard. When a key is depressed, an event with
> +the key's code is emitted with value 1. When the key is released, an event is
> +emitted with value 0. Some hardware send events when a key is repeated. These
> +events have a value of 2. In general, KEY_<name> is used for keyboard keys, and
> +BTN_<name> is used for other types of momentary switch events.
> +
> +A few EV_KEY codes have special meanings:
> +
> +* BTN_TOOL_<name>:
> +  - These codes are used in conjunction with input trackpads, tablets, and
> +    touchscreens. These devices may be used with fingers, pens, or other tools.
> +    When an event occurs and a tool is used, the corresponding BTN_TOOL_<name>
> +    code should be set to a value of 1. When the tool is no longer interacting
> +    with the input device, the BTN_TOOL_<name> code should be reset to 0. All
> +    trackpads, tablets, and touchscreens should use at least one BTN_TOOL_<name>
> +    code when events are generated.
> +
> +* BTN_TOUCH:
> +    BTN_TOUCH is used for touch contact. While an input tool is determined to be
> +    within meaningful physical contact, the value of this property must be set
> +    to 1. Meaningful physical contact may mean any contact, or it may mean
> +    contact conditioned by an implementation defined property. For example, a
> +    touchpad may set the value to 1 only when the touch pressure rises above a
> +    certain value. BTN_TOUCH may be combined with BTN_TOOL_<name> codes. For
> +    example, a pen tablet may set BTN_TOOL_PEN to 1 and BTN_TOUCH to 0 while the
> +    pen is hovering over but not touching the tablet surface.
> +
> +Note: For appropriate function of the legacy mousedev emulation driver,
> +BTN_TOUCH must be the first evdev code emitted in a synchronization frame.
> +
> +Note: Historically a touch device with BTN_TOOL_FINGER and BTN_TOUCH was
> +interpreted as a touchpad by userspace, while a similar device without
> +BTN_TOOL_FINGER was interpreted as a touchscreen. For backwards compatibility
> +with current userspace it is recommended to follow this distinction. In the
> +future, this distinction will be deprecated and the device properties ioctl
> +EVIOCGPROP, defined in linux/input.h, will be used to convey the device type.
> +
> +* BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP:
> +  - These codes denote one, two, three, and four finger interaction on a
> +    trackpad or touchscreen. For example, if the user uses two fingers and moves
> +    them on the touchpad in an effort to scroll content on screen,
> +    BTN_TOOL_DOUBLETAP should be set to value 1 for the duration of the motion.
> +    Note that these codes and the BTN_TOOL_<name> and BTN_TOUCH codes are
> +    orthogonal in purpose. A trackpad event generated by finger touches should
> +    generate events for one code from each group. At most only one of these
> +    codes should have a value of 1 during any synchronization frame.

I think the "Note" sentence needs an update.  I can interpret it as
defining 3 groups but only 2 exist.

Maybe: "Note that all BTN_TOOL_<name> codes (include these finger
touch codes) and the BTN_TOUCH code are orthogonal in purpose. "

Thats my only comment.  This doc will be great to have!

I'll propose a couple of example event sequences to add once this gets
committed.

Chris
> +
> +Note: Historically some drivers emitted multiple of the finger count codes with
> +a value of 1 in the same synchronization frame. This usage is deprecated.
> +
> +Note: In multitouch drivers, the input_mt_report_finger_count() function should
> +be used to emit these codes. Please see multi-touch-protocol.txt for details.
> +
> +* KEY_SUSPEND, KEY_POWER:
> +  - These codes are reserved for the EV_PWR type.
> +
> +EV_REL:
> +----------
> +EV_REL events describe relative changes in a property. For example, a mouse may
> +move to the left by a certain number of units, but its absolute position in
> +space is unknown. If the absolute position is known, EV_ABS codes should be used
> +instead of EV_REL codes.
> +
> +A few EV_REL codes have special meanings:
> +
> +* REL_WHEEL, REL_HWHEEL:
> +  - These codes are used for vertical and horizontal scroll wheels,
> +    respectively.
> +
> +EV_ABS:
> +----------
> +EV_ABS events describe absolute changes in a property. For example, a touchpad
> +may emit coordinates for a touch location.
> +
> +A few EV_ABS codes have special meanings:
> +
> +* ABS_DISTANCE:
> +  - Used to describe the distance of a tool from an interaction surface. This
> +    should only be used while the tool is hovering, meaning in close proximity
> +    of the device. If the input device may be used freely in three dimensions,
> +    consider ABS_Z instead.
> +
> +* ABS_MT_<name>:
> +  - Used to describe multitouch input events. Please see
> +    multi-touch-protocol.txt for details.
> +
> +EV_SW:
> +----------
> +EV_SW events describe stateful binary switches. For example, the SW_LID code is
> +used to denote when a laptop lid is closed.
> +
> +EV_MSC:
> +----------
> +EV_MSC events are used for input and output events that do not fall under other
> +categories.
> +
> +EV_LED:
> +----------
> +EV_LED events are used for input and output to set and query the state of
> +various LEDs on devices.
> +
> +EV_REP:
> +----------
> +EV_REP events are used for specifying autorepeating events.
> +
> +EV_SND:
> +----------
> +EV_SND events are used for sending sound commands to simple sound output
> +devices.
> +
> +EV_FF:
> +----------
> +EV_FF events are used to initialize a force feedback capable device and to cause
> +such device to feedback.
> +
> +EV_PWR:
> +----------
> +EV_PWR events are a special type of key event used specifically for monitoring
> +power buttons and switches. The two codes in use are:
> +
> +* KEY_POWER:
> +  - Used to denote a power button event.
> +
> +* KEY_SUSPEND:
> +  - Used to denote a suspend button event.
> --
> 1.7.1
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2] Documentation: Add evdev type and code definitions
  2011-01-07 21:28 [PATCH v2] Documentation: Add evdev type and code definitions Chase Douglas
                   ` (2 preceding siblings ...)
  2011-01-08  1:15 ` Chris Bagwell
@ 2011-01-09 14:51 ` Henrik Rydberg
  3 siblings, 0 replies; 10+ messages in thread
From: Henrik Rydberg @ 2011-01-09 14:51 UTC (permalink / raw)
  To: Chase Douglas
  Cc: Dmitry Torokhov, Chris Bagwell, Peter Hutterer,
	Nikolai Kondrashov, linux-input, linux-kernel

On Fri, Jan 07, 2011 at 04:28:15PM -0500, Chase Douglas wrote:
> This commit adds the file Documentation/input/evdev-codes.txt.
> 
> Cc: Henrik Rydberg <rydberg@euromail.se>
> Cc: Chris Bagwell <chris@cnpbagwell.com>
> Cc: Peter Hutterer <peter.hutterer@who-t.net>
> Cc: Nikolai Kondrashov <spbnick@gmail.com>
> Cc: linux-input@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Signed-off-by: Chase Douglas <chase.douglas@canonical.com>

Hi Chase, thanks for the update! Minor comment below, otherwise

Acked-by: Henrik Rydberg <rydberg@euromail.se>

> ---
>  Documentation/input/evdev-codes.txt |  206 +++++++++++++++++++++++++++++++++++
>  1 files changed, 206 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/input/evdev-codes.txt
> 
> diff --git a/Documentation/input/evdev-codes.txt b/Documentation/input/evdev-codes.txt
> new file mode 100644
> index 0000000..8d7262c
> --- /dev/null
> +++ b/Documentation/input/evdev-codes.txt
> @@ -0,0 +1,206 @@
> +The evdev protocol uses a map of types and codes to express input device values
> +to userspace. This document describes the types and codes and how and when they
> +may be used.
> +
> +The evdev protocol is a stateful protocol. Events are emitted only when values
> +of evdev codes have changed. However, the state is maintained within the Linux
> +input subsystem; drivers do not need to maintain the state and may attempt to
> +emit unchanged values without harm. Userspace may obtain the current state of
> +evdev code values using the EVIOCGABS ioctl defined in linux/input.h.

GABS is only to retrieve EV_ABS type events, there is also GKEY, GLED,
GSND, GSW, GBIT and GPROP. Perhaps simply changing "EVIOCGABS" to
"EVIOCG*" would suffice. The same information is also available under
/sys/class/input/eventX/device/, as files in the capabilities/ and
properties/ directories.

> +
> +Types:
> +==========
> +Types are groupings of codes under a logical input construct. Each type has a
> +set of applicable codes to be used in generating events. See the Codes section
> +for details on valid codes for each type.
> +
> +* EV_SYN:
> +  - Used as markers to separate events. Events may be separated in time or in
> +    space, such as with the multitouch protocol.
> +
> +* EV_KEY:
> +  - Used to describe keyboard and other key-like input events.
> +
> +* EV_REL:
> +  - Used to describe relative input events, e.g. moving the mouse 5 units to the
> +    left.
> +
> +* EV_ABS:
> +  - Used to describe absolute input events, e.g. describing the coordinates of a
> +    touch on a touchscreen.
> +
> +* EV_MSC:
> +  - Used to describe miscellaneous input events that do not fit into other
> +    types.
> +
> +* EV_SW:
> +  - Used to describe binary state input switches.
> +
> +* EV_LED:
> +  - Used to turn LEDs on devices on and off.
> +
> +* EV_SND:
> +  - Used to output sound to devices.
> +
> +* EV_REP:
> +  - Used for autorepeating devices.
> +
> +* EV_FF:
> +  - Used to send force feedback commands to an input device.
> +
> +* EV_PWR:
> +  - A special type for power button and switch input.
> +
> +* EV_FF_STATUS:
> +  - Used to receive force feedback device status.
> +
> +Codes:
> +==========
> +Codes define the precise type of event.
> +
> +EV_SYN:
> +----------
> +EV_SYN event values are undefined. Their usage is
> +defined only by when they are sent in the evdev event stream.
> +
> +* SYN_REPORT:
> +  - Used to synchronize and separate events into frames of time. For example,
> +    motion of a mouse may set the REL_X and REL_Y values for one motion, then
> +    emit a SYN_REPORT. The next motion will emit more REL_X and REL_Y values and
> +    send another SYN_REPORT.
> +
> +* SYN_CONFIG:
> +  - TBD
> +
> +* SYN_MT_REPORT:
> +  - Used to synchronize and separate touch events. See the
> +    multi-touch-protocol.txt document for more information.
> +
> +EV_KEY:
> +----------
> +EV_KEY events take the form KEY_<name> or BTN_<name>. For example, KEY_A is used
> +to represent the 'A' key on a keyboard. When a key is depressed, an event with
> +the key's code is emitted with value 1. When the key is released, an event is
> +emitted with value 0. Some hardware send events when a key is repeated. These
> +events have a value of 2. In general, KEY_<name> is used for keyboard keys, and
> +BTN_<name> is used for other types of momentary switch events.
> +
> +A few EV_KEY codes have special meanings:
> +
> +* BTN_TOOL_<name>:
> +  - These codes are used in conjunction with input trackpads, tablets, and
> +    touchscreens. These devices may be used with fingers, pens, or other tools.
> +    When an event occurs and a tool is used, the corresponding BTN_TOOL_<name>
> +    code should be set to a value of 1. When the tool is no longer interacting
> +    with the input device, the BTN_TOOL_<name> code should be reset to 0. All
> +    trackpads, tablets, and touchscreens should use at least one BTN_TOOL_<name>
> +    code when events are generated.
> +
> +* BTN_TOUCH:
> +    BTN_TOUCH is used for touch contact. While an input tool is determined to be
> +    within meaningful physical contact, the value of this property must be set
> +    to 1. Meaningful physical contact may mean any contact, or it may mean
> +    contact conditioned by an implementation defined property. For example, a
> +    touchpad may set the value to 1 only when the touch pressure rises above a
> +    certain value. BTN_TOUCH may be combined with BTN_TOOL_<name> codes. For
> +    example, a pen tablet may set BTN_TOOL_PEN to 1 and BTN_TOUCH to 0 while the
> +    pen is hovering over but not touching the tablet surface.
> +
> +Note: For appropriate function of the legacy mousedev emulation driver,
> +BTN_TOUCH must be the first evdev code emitted in a synchronization frame.
> +
> +Note: Historically a touch device with BTN_TOOL_FINGER and BTN_TOUCH was
> +interpreted as a touchpad by userspace, while a similar device without
> +BTN_TOOL_FINGER was interpreted as a touchscreen. For backwards compatibility
> +with current userspace it is recommended to follow this distinction. In the
> +future, this distinction will be deprecated and the device properties ioctl
> +EVIOCGPROP, defined in linux/input.h, will be used to convey the device type.
> +
> +* BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP:
> +  - These codes denote one, two, three, and four finger interaction on a
> +    trackpad or touchscreen. For example, if the user uses two fingers and moves
> +    them on the touchpad in an effort to scroll content on screen,
> +    BTN_TOOL_DOUBLETAP should be set to value 1 for the duration of the motion.
> +    Note that these codes and the BTN_TOOL_<name> and BTN_TOUCH codes are
> +    orthogonal in purpose. A trackpad event generated by finger touches should
> +    generate events for one code from each group. At most only one of these
> +    codes should have a value of 1 during any synchronization frame.
> +
> +Note: Historically some drivers emitted multiple of the finger count codes with
> +a value of 1 in the same synchronization frame. This usage is deprecated.
> +
> +Note: In multitouch drivers, the input_mt_report_finger_count() function should
> +be used to emit these codes. Please see multi-touch-protocol.txt for details.
> +
> +* KEY_SUSPEND, KEY_POWER:
> +  - These codes are reserved for the EV_PWR type.
> +
> +EV_REL:
> +----------
> +EV_REL events describe relative changes in a property. For example, a mouse may
> +move to the left by a certain number of units, but its absolute position in
> +space is unknown. If the absolute position is known, EV_ABS codes should be used
> +instead of EV_REL codes.
> +
> +A few EV_REL codes have special meanings:
> +
> +* REL_WHEEL, REL_HWHEEL:
> +  - These codes are used for vertical and horizontal scroll wheels,
> +    respectively.
> +
> +EV_ABS:
> +----------
> +EV_ABS events describe absolute changes in a property. For example, a touchpad
> +may emit coordinates for a touch location.
> +
> +A few EV_ABS codes have special meanings:
> +
> +* ABS_DISTANCE:
> +  - Used to describe the distance of a tool from an interaction surface. This
> +    should only be used while the tool is hovering, meaning in close proximity
> +    of the device. If the input device may be used freely in three dimensions,
> +    consider ABS_Z instead.
> +
> +* ABS_MT_<name>:
> +  - Used to describe multitouch input events. Please see
> +    multi-touch-protocol.txt for details.
> +
> +EV_SW:
> +----------
> +EV_SW events describe stateful binary switches. For example, the SW_LID code is
> +used to denote when a laptop lid is closed.
> +
> +EV_MSC:
> +----------
> +EV_MSC events are used for input and output events that do not fall under other
> +categories.
> +
> +EV_LED:
> +----------
> +EV_LED events are used for input and output to set and query the state of
> +various LEDs on devices.
> +
> +EV_REP:
> +----------
> +EV_REP events are used for specifying autorepeating events.
> +
> +EV_SND:
> +----------
> +EV_SND events are used for sending sound commands to simple sound output
> +devices.
> +
> +EV_FF:
> +----------
> +EV_FF events are used to initialize a force feedback capable device and to cause
> +such device to feedback.
> +
> +EV_PWR:
> +----------
> +EV_PWR events are a special type of key event used specifically for monitoring
> +power buttons and switches. The two codes in use are:
> +
> +* KEY_POWER:
> +  - Used to denote a power button event.
> +
> +* KEY_SUSPEND:
> +  - Used to denote a suspend button event.

Great document.

Thanks,
Henrik

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2011-01-09 14:52 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-07 21:28 [PATCH v2] Documentation: Add evdev type and code definitions Chase Douglas
2011-01-07 21:53 ` Dmitry Torokhov
2011-01-07 22:03   ` Chase Douglas
2011-01-07 22:42     ` Dmitry Torokhov
2011-01-07 22:06 ` Nikolai Kondrashov
2011-01-07 22:15   ` Chase Douglas
2011-01-07 22:26     ` Nikolai Kondrashov
2011-01-07 22:36       ` Chase Douglas
2011-01-08  1:15 ` Chris Bagwell
2011-01-09 14:51 ` Henrik Rydberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).