summaryrefslogtreecommitdiff
path: root/documentation/6.components/device-driver/input/input.md
blob: fa45817eabcbf1594b90db4dd8bcfcc6ef3533f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@page page_device_input Input subsystem

Device-tree binding and DM registration: @ref page_device_input_dm.

| Topic | Page |
| --- | --- |
| Userspace API | @ref page_device_input_uapi |
| Touch class bridge | @ref page_device_input_touch |
| Power / restart keys | @ref page_device_input_power |

# Input subsystem (API)

Header: `drivers/input.h`. Typical stack: low-level driver → **`rt_input_event` / reporters** → handlers (GUI, shell) or **`/dev/inputN`** (@ref page_device_input_uapi).

| Path | API |
| --- | --- |
| In-kernel listener | **`rt_input_add_handler`** |
| POSIX process (Smart) | **`open` / `read` / `ioctl` / `poll` on `/dev/inputN`** — @ref page_device_input_uapi |
| Legacy touch GUI | **`struct rt_touch_device`** — @ref page_device_input_touch |

## When to use the input core

| Use **`rt_input_*`** when… | Consider raw **`rt_device`** read when… |
| --- | --- |
| You want **Linux-like** `EV_KEY` / `EV_REL` / `EV_ABS` / multitouch slot semantics and multiple listeners. | You have a **single proprietary** app talking to a vendor IOCTL-only touch stack. |
| You need **polling** (`**rt_input_setup_polling**`) for GPIO keys without IRQ storms. | GPIO IRQ latency is fine and you do not need unified event routing. |

## Event contract

1. **`rt_input_set_capability`** before **`rt_input_device_register`** so users know which **`type`/`code`** pairs are valid.
2. For each hardware change, call **`rt_input_report_*`** then **`rt_input_sync`** to close the frame (**`SYN_REPORT`**). Missing **`sync`** merges events poorly for consumers.
3. **`rt_input_trigger`** routes through optional **`idev->trigger`**—use when you wrap another input device; otherwise **`rt_input_event`** is enough.

## Callback / context rules

- **`rt_input_add_handler` → `callback`**: invoked from **`rt_input_event`** path—assume **thread or workqueue** unless your driver documents IRQ delivery; keep **`callback` short**.
- **`poller->poll`**: runs on timer tick—**must not block** or take mutexes that can deadlock with the same thread calling **`rt_input_sync`**.
- **Touch helpers**: **`rt_input_setup_touch`** / **`rt_input_report_touch_*`** require **`RT_INPUT_TOUCHSCREEN`** — @ref page_device_input_touch.

## Registration lifecycle

- **`rt_input_device_register`**: registers underlying **`rt_device`**; failures leave partially init state—clean up partial setup in error paths.
- **`rt_input_remove_config`**: tears down polling/touch dynamic config before unregister if you toggled features at runtime.

## Pitfalls

- **ABS without `rt_input_set_absinfo`**: consumers cannot clamp—set min/max/resolution for axes you report.
- **Key autorepeat**: not automatic unless a layer implements it—do not assume Linux repeat behavior.
- **Re-entrancy**: posting events from inside a handler for the same device can recurse—prefer queueing.

## See also

- @ref page_device_input_dm
- @ref page_device_input_uapi
- @ref page_device_input_touch
- @ref page_device_input_power
- `components/drivers/include/drivers/input.h`
- `components/drivers/include/drivers/input_uapi.h`
- `dt-bindings/input/event-codes.h`