Input
The input subsystem provides an API for dispatching input events from input devices to the application.
Input Events
The subsystem is built around the input_event structure. An input
event represents a change in an individual event entity, for example the state
of a single button, or a movement in a single axis.
The input_event structure describes the specific event, and
includes a synchronization bit to indicate that the device reached a stable
state, for example when the events corresponding to multiple axes of a
multi-axis device have been reported.
Input Devices
An input device can report input events directly using input_report()
or any related function; for example buttons or other on-off input entities
would use input_report_key().
Complex devices may use a combination of multiple events, and set the sync
bit once the output is stable.
The input_report* functions take a device pointer, which is
used to indicate which device reported the event and can be used by subscribers
to only receive events from a specific device. If there’s no actual device
associated with the event, it can be set to NULL, in which case only
subscribers with no device filter will receive the event.
Application API
An application can register a callback using the
INPUT_CALLBACK_DEFINE macro. If a device node is specified, the
callback is only invoked for events from the specific device, otherwise the
callback will receive all the events in the system. This is the only type of
filtering supported, any more complex filtering logic has to be implemented in
the callback itself.
The subsystem can operate synchronously or by using an event queue, depending
on the CONFIG_INPUT_MODE option. If the input thread is used,
all the events are added to a queue and executed in a common input thread.
If the thread is not used, the callback are invoked directly in the input
driver context.
The synchronous mode can be used in a simple application to keep a minimal footprint, or in a complex application with an existing event model, where the callback is just a wrapper to pipe back the event in a more complex application specific event system.
HID code mapping
A common use case for input devices is to use them to generate HID reports. For
this purpose, the input_to_hid_code() and
input_to_hid_modifier() functions can be used to map input codes to HID
codes and modifiers.
Kscan Compatibility
Input devices generating X/Y/Touch events can be used in existing applications
based on the Keyboard Scan API by enabling both
CONFIG_INPUT and CONFIG_KSCAN, defining a
zephyr,kscan-input node as a child node of the corresponding
input device and pointing the zephyr,keyboard-scan chosen node to the
compatibility device node, for example:
chosen {
    zephyr,keyboard-scan = &kscan_input;
};
ft5336@38 {
    ...
    kscan_input: kscan-input {
        compatible = "zephyr,kscan-input";
    };
};
Driver Documentation
API Reference
- group input_interface
- Input Interface. - Since
- 3.4 
- Version
- 0.1.0 
 - Defines - 
INPUT_CALLBACK_DEFINE(_dev, _callback)
- Register a callback structure for input events. - The - _devfield can be used to only invoke callback for events generated by a specific device. Setting dev to NULL causes callback to be invoked for every event.- Parameters:
- _dev – device pointer or NULL. 
- _callback – The callback function. 
 
 
 - Functions - 
int input_report(const struct device *dev, uint8_t type, uint16_t code, int32_t value, bool sync, k_timeout_t timeout)
- Report a new input event. - This causes all the callbacks for the specified device to be executed, either synchronously or through the input thread if utilized. - Parameters:
- dev – Device generating the event or NULL. 
- type – Event type (see INPUT_EV_CODES). 
- code – Event code (see INPUT_KEY_CODES, INPUT_BTN_CODES, INPUT_ABS_CODES, INPUT_REL_CODES, INPUT_MSC_CODES). 
- value – Event value. 
- sync – Set the synchronization bit for the event. 
- timeout – Timeout for reporting the event, ignored if - CONFIG_INPUT_MODE_SYNCHRONOUSis used.
 
- Return values:
- 0 – if the message has been processed. 
- negative – if - CONFIG_INPUT_MODE_THREADis enabled and the message failed to be enqueued.
 
 
 - 
static inline int input_report_key(const struct device *dev, uint16_t code, int32_t value, bool sync, k_timeout_t timeout)
- Report a new INPUT_EV_KEY input event, note that value is converted to either 0 or 1. - See also - input_report() for more details. 
 - 
static inline int input_report_rel(const struct device *dev, uint16_t code, int32_t value, bool sync, k_timeout_t timeout)
- Report a new INPUT_EV_REL input event. - See also - input_report() for more details. 
 - 
static inline int input_report_abs(const struct device *dev, uint16_t code, int32_t value, bool sync, k_timeout_t timeout)
- Report a new INPUT_EV_ABS input event. - See also - input_report() for more details. 
 - 
bool input_queue_empty(void)
- Returns true if the input queue is empty. - This can be used to batch input event processing until the whole queue has been emptied. Always returns true if - CONFIG_INPUT_MODE_SYNCHRONOUSis enabled.
 - 
int16_t input_to_hid_code(uint16_t input_code)
- Convert an input code to HID code. - Takes an input code as input and returns the corresponding HID code as output. The return value is -1 if the code is not found, if found it can safely be casted to a uint8_t type. - Parameters:
- input_code – Event code (see INPUT_KEY_CODES). 
 
- Return values:
- the – HID code corresponding to the input code. 
- -1 – if there’s no HID code for the specified input code. 
 
 
 - 
uint8_t input_to_hid_modifier(uint16_t input_code)
- Convert an input code to HID modifier. - Takes an input code as input and returns the corresponding HID modifier as output or 0. - Parameters:
- input_code – Event code (see INPUT_KEY_CODES). 
 
- Return values:
- the – HID modifier corresponding to the input code. 
- 0 – if there’s no HID modifier for the specified input code. 
 
 
 - 
struct input_event
- #include <input.h>Input event structure. This structure represents a single input event, for example a key or button press for a single button, or an absolute or relative coordinate for a single axis. Public Members - 
uint8_t sync
- Sync flag. 
 - 
uint8_t type
- Event type (see INPUT_EV_CODES). 
 - 
uint16_t code
- Event code (see INPUT_KEY_CODES, INPUT_BTN_CODES, INPUT_ABS_CODES, INPUT_REL_CODES, INPUT_MSC_CODES). 
 - 
int32_t value
- Event value. 
 
- 
uint8_t sync
 
Input Event Definitions
- group input_events
- Input event types. - 
INPUT_EV_KEY
- Key event. 
 - 
INPUT_EV_REL
- Relative coordinate event. 
 - 
INPUT_EV_ABS
- Absolute coordinate event. 
 - 
INPUT_EV_MSC
- Miscellaneous event. 
 - 
INPUT_EV_VENDOR_START
- Vendor specific event start. 
 - 
INPUT_EV_VENDOR_STOP
- Vendor specific event stop. 
 - Input event KEY codes. - 
INPUT_KEY_RESERVED
- Reserved, do not use. 
 - 
INPUT_KEY_0
- 0 Key 
 - 
INPUT_KEY_1
- 1 Key 
 - 
INPUT_KEY_2
- 2 Key 
 - 
INPUT_KEY_3
- 3 Key 
 - 
INPUT_KEY_4
- 4 Key 
 - 
INPUT_KEY_5
- 5 Key 
 - 
INPUT_KEY_6
- 6 Key 
 - 
INPUT_KEY_7
- 7 Key 
 - 
INPUT_KEY_8
- 8 Key 
 - 
INPUT_KEY_9
- 9 Key 
 - 
INPUT_KEY_A
- A Key. 
 - 
INPUT_KEY_APOSTROPHE
- Apostrophe Key. 
 - 
INPUT_KEY_B
- B Key. 
 - 
INPUT_KEY_BACK
- Back Key. 
 - 
INPUT_KEY_BACKSLASH
- Backslash Key. 
 - 
INPUT_KEY_BACKSPACE
- Backspace Key. 
 - 
INPUT_KEY_BLUETOOTH
- Bluetooth Key. 
 - 
INPUT_KEY_BRIGHTNESSDOWN
- Brightness Up Key. 
 - 
INPUT_KEY_BRIGHTNESSUP
- Brightneess Down Key. 
 - 
INPUT_KEY_C
- C Key. 
 - 
INPUT_KEY_CAPSLOCK
- Caps Lock Key. 
 - 
INPUT_KEY_COFFEE
- Screen Saver Key. 
 - 
INPUT_KEY_COMMA
- Comma Key. 
 - 
INPUT_KEY_COMPOSE
- Compose Key. 
 - 
INPUT_KEY_CONNECT
- Connect Key. 
 - 
INPUT_KEY_D
- D Key. 
 - 
INPUT_KEY_DELETE
- Delete Key. 
 - 
INPUT_KEY_DOT
- Dot Key. 
 - 
INPUT_KEY_DOWN
- Down Key. 
 - 
INPUT_KEY_E
- E Key. 
 - 
INPUT_KEY_END
- End Key. 
 - 
INPUT_KEY_ENTER
- Enter Key. 
 - 
INPUT_KEY_EQUAL
- Equal Key. 
 - 
INPUT_KEY_ESC
- Escape Key. 
 - 
INPUT_KEY_F
- F Key. 
 - 
INPUT_KEY_F1
- F1 Key. 
 - 
INPUT_KEY_F10
- F10 Key. 
 - 
INPUT_KEY_F11
- F11 Key. 
 - 
INPUT_KEY_F12
- F12 Key. 
 - 
INPUT_KEY_F13
- F13 Key. 
 - 
INPUT_KEY_F14
- F14 Key. 
 - 
INPUT_KEY_F15
- F15 Key. 
 - 
INPUT_KEY_F16
- F16 Key. 
 - 
INPUT_KEY_F17
- F17 Key. 
 - 
INPUT_KEY_F18
- F18 Key. 
 - 
INPUT_KEY_F19
- F19 Key. 
 - 
INPUT_KEY_F2
- F2 Key. 
 - 
INPUT_KEY_F20
- F20 Key. 
 - 
INPUT_KEY_F21
- F21 Key. 
 - 
INPUT_KEY_F22
- F22 Key. 
 - 
INPUT_KEY_F23
- F23 Key. 
 - 
INPUT_KEY_F24
- F24 Key. 
 - 
INPUT_KEY_F3
- F3 Key. 
 - 
INPUT_KEY_F4
- F4 Key. 
 - 
INPUT_KEY_F5
- F5 Key. 
 - 
INPUT_KEY_F6
- F6 Key. 
 - 
INPUT_KEY_F7
- F7 Key. 
 - 
INPUT_KEY_F8
- F8 Key. 
 - 
INPUT_KEY_F9
- F9 Key. 
 - 
INPUT_KEY_FASTFORWARD
- Fast Forward Key. 
 - 
INPUT_KEY_FORWARD
- Forward Key. 
 - 
INPUT_KEY_G
- G Key. 
 - 
INPUT_KEY_GRAVE
- Grave (backtick) Key. 
 - 
INPUT_KEY_H
- H Key. 
 - 
INPUT_KEY_HOME
- Home Key. 
 - 
INPUT_KEY_I
- I Key. 
 - 
INPUT_KEY_INSERT
- Insert Key. 
 - 
INPUT_KEY_J
- J Key. 
 - 
INPUT_KEY_K
- K Key. 
 - 
INPUT_KEY_KP0
- Keypad 0 Key. 
 - 
INPUT_KEY_KP1
- Keypad 1 Key. 
 - 
INPUT_KEY_KP2
- Keypad 2 Key. 
 - 
INPUT_KEY_KP3
- Keypad 3 Key. 
 - 
INPUT_KEY_KP4
- Keypad 4 Key. 
 - 
INPUT_KEY_KP5
- Keypad 5 Key. 
 - 
INPUT_KEY_KP6
- Keypad 6 Key. 
 - 
INPUT_KEY_KP7
- Keypad 7 Key. 
 - 
INPUT_KEY_KP8
- Keypad 8 Key. 
 - 
INPUT_KEY_KP9
- Keypad 9 Key. 
 - 
INPUT_KEY_KPASTERISK
- Keypad Asterisk Key. 
 - 
INPUT_KEY_KPCOMMA
- Keypad Comma Key. 
 - 
INPUT_KEY_KPDOT
- Keypad Dot Key. 
 - 
INPUT_KEY_KPENTER
- Keypad Enter Key. 
 - 
INPUT_KEY_KPEQUAL
- Keypad Equal Key. 
 - 
INPUT_KEY_KPMINUS
- Keypad Minus Key. 
 - 
INPUT_KEY_KPPLUS
- Keypad Plus Key. 
 - 
INPUT_KEY_KPPLUSMINUS
- Keypad Plus Key. 
 - 
INPUT_KEY_KPSLASH
- Keypad Slash Key. 
 - 
INPUT_KEY_L
- L Key. 
 - 
INPUT_KEY_LEFT
- Left Key. 
 - 
INPUT_KEY_LEFTALT
- Left Alt Key. 
 - 
INPUT_KEY_LEFTBRACE
- Left Brace Key. 
 - 
INPUT_KEY_LEFTCTRL
- Left Ctrl Key. 
 - 
INPUT_KEY_LEFTMETA
- Left Meta Key. 
 - 
INPUT_KEY_LEFTSHIFT
- Left Shift Key. 
 - 
INPUT_KEY_M
- M Key. 
 - 
INPUT_KEY_MENU
- Menu Key. 
 - 
INPUT_KEY_MINUS
- Minus Key. 
 - 
INPUT_KEY_MUTE
- Mute Key. 
 - 
INPUT_KEY_N
- N Key. 
 - 
INPUT_KEY_NUMLOCK
- Num Lock Key. 
 - 
INPUT_KEY_O
- O Key. 
 - 
INPUT_KEY_P
- P Key. 
 - 
INPUT_KEY_PAGEDOWN
- Page Down Key. 
 - 
INPUT_KEY_PAGEUP
- Page UpKey. 
 - 
INPUT_KEY_PAUSE
- Pause Key. 
 - 
INPUT_KEY_PLAY
- Play Key. 
 - 
INPUT_KEY_POWER
- Power Key. 
 - 
INPUT_KEY_PRINT
- Print Key. 
 - 
INPUT_KEY_Q
- Q Key. 
 - 
INPUT_KEY_R
- R Key. 
 - 
INPUT_KEY_RIGHT
- Right Key. 
 - 
INPUT_KEY_RIGHTALT
- Right Alt Key. 
 - 
INPUT_KEY_RIGHTBRACE
- Right Brace Key. 
 - 
INPUT_KEY_RIGHTCTRL
- Right Ctrl Key. 
 - 
INPUT_KEY_RIGHTMETA
- Right Meta Key. 
 - 
INPUT_KEY_RIGHTSHIFT
- Right Shift Key. 
 - 
INPUT_KEY_S
- S Key. 
 - 
INPUT_KEY_SCALE
- Scale Key. 
 - 
INPUT_KEY_SCROLLLOCK
- Scroll Lock Key. 
 - 
INPUT_KEY_SEMICOLON
- Semicolon Key. 
 - 
INPUT_KEY_SLASH
- Slash Key. 
 - 
INPUT_KEY_SLEEP
- System Sleep Key. 
 - 
INPUT_KEY_SPACE
- Space Key. 
 - 
INPUT_KEY_SYSRQ
- SysReq Key. 
 - 
INPUT_KEY_T
- T Key. 
 - 
INPUT_KEY_TAB
- Tab Key. 
 - 
INPUT_KEY_U
- U Key. 
 - 
INPUT_KEY_UP
- Up Key. 
 - 
INPUT_KEY_UWB
- Ultra-Wideband Key. 
 - 
INPUT_KEY_V
- V Key. 
 - 
INPUT_KEY_VOLUMEDOWN
- Volume Down Key. 
 - 
INPUT_KEY_VOLUMEUP
- Volume Up Key. 
 - 
INPUT_KEY_W
- W Key. 
 - 
INPUT_KEY_WAKEUP
- System Wake Up Key. 
 - 
INPUT_KEY_WLAN
- Wireless LAN Key. 
 - 
INPUT_KEY_X
- X Key. 
 - 
INPUT_KEY_Y
- Y Key. 
 - 
INPUT_KEY_Z
- Z Key. 
 - Input event BTN codes. - 
INPUT_BTN_0
- 0 button 
 - 
INPUT_BTN_1
- 1 button 
 - 
INPUT_BTN_2
- 2 button 
 - 
INPUT_BTN_3
- 3 button 
 - 
INPUT_BTN_4
- 4 button 
 - 
INPUT_BTN_5
- 5 button 
 - 
INPUT_BTN_6
- 6 button 
 - 
INPUT_BTN_7
- 7 button 
 - 
INPUT_BTN_8
- 8 button 
 - 
INPUT_BTN_9
- 9 button 
 - 
INPUT_BTN_A
- A button. 
 - 
INPUT_BTN_B
- B button. 
 - 
INPUT_BTN_BACK
- Back button. 
 - 
INPUT_BTN_C
- C button. 
 - 
INPUT_BTN_DPAD_DOWN
- Directional pad Down. 
 - 
INPUT_BTN_DPAD_LEFT
- Directional pad Left. 
 - 
INPUT_BTN_DPAD_RIGHT
- Directional pad Right. 
 - 
INPUT_BTN_DPAD_UP
- Directional pad Up. 
 - 
INPUT_BTN_EAST
- East button. 
 - 
INPUT_BTN_EXTRA
- Extra button. 
 - 
INPUT_BTN_FORWARD
- Forward button. 
 - 
INPUT_BTN_GEAR_DOWN
- Gear Up button. 
 - 
INPUT_BTN_GEAR_UP
- Gear Down button. 
 - 
INPUT_BTN_LEFT
- Left button. 
 - 
INPUT_BTN_MIDDLE
- Middle button. 
 - 
INPUT_BTN_MODE
- Mode button. 
 - 
INPUT_BTN_NORTH
- North button. 
 - 
INPUT_BTN_RIGHT
- Right button. 
 - 
INPUT_BTN_SELECT
- Select button. 
 - 
INPUT_BTN_SIDE
- Side button. 
 - 
INPUT_BTN_SOUTH
- South button. 
 - 
INPUT_BTN_START
- Start button. 
 - 
INPUT_BTN_TASK
- Task button. 
 - 
INPUT_BTN_THUMBL
- Left thumbstick button. 
 - 
INPUT_BTN_THUMBR
- Right thumbstick button. 
 - 
INPUT_BTN_TL
- Left trigger (L1) 
 - 
INPUT_BTN_TL2
- Left trigger 2 (L2) 
 - 
INPUT_BTN_TOUCH
- Touchscreen touch. 
 - 
INPUT_BTN_TR
- Right trigger (R1) 
 - 
INPUT_BTN_TR2
- Right trigger 2 (R2) 
 - 
INPUT_BTN_WEST
- West button. 
 - 
INPUT_BTN_X
- X button. 
 - 
INPUT_BTN_Y
- Y button. 
 - 
INPUT_BTN_Z
- Z button. 
 - Input event ABS codes. - 
INPUT_ABS_BRAKE
- Absolute brake position. 
 - 
INPUT_ABS_GAS
- Absolute gas position. 
 - 
INPUT_ABS_MT_SLOT
- Absolute multitouch slot identifier. 
 - 
INPUT_ABS_RUDDER
- Absolute rudder position. 
 - 
INPUT_ABS_RX
- Absolute rotation around X axis. 
 - 
INPUT_ABS_RY
- Absolute rotation around Y axis. 
 - 
INPUT_ABS_RZ
- Absolute rotation around Z axis. 
 - 
INPUT_ABS_THROTTLE
- Absolute throttle position. 
 - 
INPUT_ABS_WHEEL
- Absolute wheel position. 
 - 
INPUT_ABS_X
- Absolute X coordinate. 
 - 
INPUT_ABS_Y
- Absolute Y coordinate. 
 - 
INPUT_ABS_Z
- Absolute Z coordinate. 
 - Input event REL codes. - 
INPUT_REL_DIAL
- Relative dial coordinate. 
 - 
INPUT_REL_HWHEEL
- Relative horizontal wheel coordinate. 
 - 
INPUT_REL_MISC
- Relative misc coordinate. 
 - 
INPUT_REL_RX
- Relative rotation around X axis. 
 - 
INPUT_REL_RY
- Relative rotation around Y axis. 
 - 
INPUT_REL_RZ
- Relative rotation around Z axis. 
 - 
INPUT_REL_WHEEL
- Relative wheel coordinate. 
 - 
INPUT_REL_X
- Relative X coordinate. 
 - 
INPUT_REL_Y
- Relative Y coordinate. 
 - 
INPUT_REL_Z
- Relative Z coordinate. 
 
- 
INPUT_EV_KEY
Analog Axis API Reference
- group input_analog_axis
- Analog axis API. - Typedefs - Functions - 
void analog_axis_set_raw_data_cb(const struct device *dev, analog_axis_raw_data_t cb)
- Set a raw data callback. - Set a callback to receive raw data for the specified analog axis device. This is meant to be use in the application to acquire the data to use for calibration. Set cb to NULL to disable the callback. - Parameters:
- dev – Analog axis device. 
- cb – An analog_axis_raw_data_t callback to use, NULL disable. 
 
 
 - 
int analog_axis_num_axes(const struct device *dev)
- Get the number of defined axes. - Return values:
- n – The number of defined axes for dev. 
 
 - 
int analog_axis_calibration_get(const struct device *dev, int channel, struct analog_axis_calibration *cal)
- Get the axis calibration data. - Parameters:
- dev – Analog axis device. 
- channel – Channel number. 
- cal – Pointer to an analog_axis_calibration structure that is going to get set with the current calibration data. 
 
- Return values:
- 0 – If successful. 
- -EINVAL – If the specified channel is not valid. 
 
 
 - 
int analog_axis_calibration_set(const struct device *dev, int channel, struct analog_axis_calibration *cal)
- Set the axis calibration data. - Parameters:
- dev – Analog axis device. 
- channel – Channel number. 
- cal – Pointer to an analog_axis_calibration structure with the new calibration data 
 
- Return values:
- 0 – If successful. 
- -EINVAL – If the specified channel is not valid. 
 
 
 - 
int analog_axis_calibration_save(const struct device *dev)
- Save the calibration data. - Save the calibration data permanently on the specifided device, requires the Settings subsystem to be configured and initialized. - Parameters:
- dev – Analog axis device. 
 
- Return values:
- 0 – If successful. 
- -errno – In case of any other error. 
 
 
 - 
struct analog_axis_calibration
- #include <input_analog_axis.h>Analog axis calibration data structure. Holds the calibration data for a single analog axis. Initial values are set from the devicetree and can be changed by the applicatoin in runtime using analog_axis_calibration_set and analog_axis_calibration_get. 
 
- 
void analog_axis_set_raw_data_cb(const struct device *dev, analog_axis_raw_data_t cb)