167 lines
6.4 KiB
Markdown
167 lines
6.4 KiB
Markdown
|
# Usage
|
||
|
## Two options to use the uinput command:
|
||
|
### 1. Interactive through stdin:
|
||
|
type `uinput -` into the terminal, then type/paste commands to send to the binary.
|
||
|
Use Ctrl+D to signal end of stream to the binary (EOF).
|
||
|
|
||
|
This mode can be also used from an app to send uinput events.
|
||
|
For an example, see the cts test case at: [InputTestCase.java][2]
|
||
|
|
||
|
When using another program to control uinput in interactive mode, registering a
|
||
|
new input device (for example, a bluetooth joystick) should be the first step.
|
||
|
After the device is added, you need to wait for the _onInputDeviceAdded_
|
||
|
(see [InputDeviceListener][1]) notification before issuing commands
|
||
|
to the device.
|
||
|
Failure to do so will cause missed events and inconsistent behavior.
|
||
|
|
||
|
### 2. Using a file as an input:
|
||
|
type `uinput <filename>`, and the file will be used an an input to the binary.
|
||
|
You must add a sufficient delay after a "register" command to ensure device
|
||
|
is ready. The interactive mode is the recommended method of communicating
|
||
|
with the uinput binary.
|
||
|
|
||
|
All of the input commands should be in pseudo-JSON format as documented below.
|
||
|
See examples [here][3].
|
||
|
|
||
|
The file can have multiple commands one after the other (which is not strictly
|
||
|
legal JSON format, as this would imply multiple root elements).
|
||
|
|
||
|
## Command description
|
||
|
|
||
|
1. `register`
|
||
|
Register a new uinput device
|
||
|
|
||
|
| Field | Type | Description |
|
||
|
|:-------------:|:-------------:|:-------------------------- |
|
||
|
| id | integer | Device id |
|
||
|
| command | string | Must be set to "register" |
|
||
|
| name | string | Device name |
|
||
|
| vid | 16-bit integer| Vendor id |
|
||
|
| pid | 16-bit integer| Product id |
|
||
|
| bus | string | Bus that device should use |
|
||
|
| configuration | int array | uinput device configuration|
|
||
|
| ff_effects_max| integer | ff_effects_max value |
|
||
|
| abs_info | array | ABS axes information |
|
||
|
|
||
|
Device ID is used for matching the subsequent commands to a specific device
|
||
|
to avoid ambiguity when multiple devices are registered.
|
||
|
|
||
|
Device bus is used to determine how the uinput device is connected to the host.
|
||
|
The options are "usb" and "bluetooth".
|
||
|
|
||
|
Device configuration is used to configure uinput device. "type" field provides the UI_SET_*
|
||
|
control code, and data is a vector of control values to be sent to uinput device, depends on
|
||
|
the control code.
|
||
|
|
||
|
| Field | Type | Description |
|
||
|
|:-------------:|:-------------:|:-------------------------- |
|
||
|
| type | integer | UI_SET_ control type |
|
||
|
| data | int array | control values |
|
||
|
|
||
|
Device ff_effects_max must be provided if FFBIT is set.
|
||
|
|
||
|
Device abs_info fields are provided to set the device axes information. It is an array of below
|
||
|
objects:
|
||
|
| Field | Type | Description |
|
||
|
|:-------------:|:-------------:|:-------------------------- |
|
||
|
| code | integer | Axis code |
|
||
|
| info | object | ABS information object |
|
||
|
|
||
|
ABS information object is defined as below:
|
||
|
| Field | Type | Description |
|
||
|
|:-------------:|:-------------:|:-------------------------- |
|
||
|
| value | integer | Latest reported value |
|
||
|
| minimum | integer | Minimum value for the axis |
|
||
|
| maximum | integer | Maximum value for the axis |
|
||
|
| fuzz | integer | fuzz value for noise filter|
|
||
|
| flat | integer | values to be discarded |
|
||
|
| resolution | integer | resolution of axis |
|
||
|
|
||
|
See [struct input_absinfo][4]) definitions.
|
||
|
|
||
|
Example:
|
||
|
```json
|
||
|
|
||
|
{
|
||
|
"id": 1,
|
||
|
"command": "register",
|
||
|
"name": "Keyboard (Test)",
|
||
|
"vid": 0x18d2,
|
||
|
"pid": 0x2c42,
|
||
|
"bus": "usb",
|
||
|
"configuration":[
|
||
|
{"type":100, "data":[1, 21]}, // UI_SET_EVBIT : EV_KEY and EV_FF
|
||
|
{"type":101, "data":[11, 2, 3, 4]}, // UI_SET_KEYBIT : KEY_0 KEY_1 KEY_2 KEY_3
|
||
|
{"type":107, "data":[80]} // UI_SET_FFBIT : FF_RUMBLE
|
||
|
],
|
||
|
"ff_effects_max" : 1,
|
||
|
"abs_info": [
|
||
|
{"code":1, "info": {"value":20, "minimum":-255,
|
||
|
"maximum":255, "fuzz":0, "flat":0, "resolution":1}
|
||
|
},
|
||
|
{"code":8, "info": {"value":-50, "minimum":-255,
|
||
|
"maximum":255, "fuzz":0, "flat":0, "resolution":1}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
|
||
|
```
|
||
|
2. `delay`
|
||
|
Add a delay to command processing
|
||
|
|
||
|
| Field | Type | Description |
|
||
|
|:-------------:|:-------------:|:-------------------------- |
|
||
|
| id | integer | Device id |
|
||
|
| command | string | Must be set to "delay" |
|
||
|
| duration | integer | Delay in milliseconds |
|
||
|
|
||
|
Example:
|
||
|
```json
|
||
|
{
|
||
|
"id": 1,
|
||
|
"command": "delay",
|
||
|
"duration": 10
|
||
|
}
|
||
|
```
|
||
|
|
||
|
3. `inject`
|
||
|
Send an array of uinput event packets [type, code, value] to the uinput device
|
||
|
|
||
|
| Field | Type | Description |
|
||
|
|:-------------:|:-------------:|:-------------------------- |
|
||
|
| id | integer | Device id |
|
||
|
| command | string | Must be set to "inject" |
|
||
|
| events | integer array | events to inject |
|
||
|
|
||
|
The "events" parameter is an array of integers, encapsulates evdev input_event type, code and value,
|
||
|
see the example below.
|
||
|
|
||
|
Example:
|
||
|
```json
|
||
|
{
|
||
|
"id": 1,
|
||
|
"command": "inject",
|
||
|
"events": [0x01, 0xb, 0x1, // EV_KEY, KEY_0, DOWN
|
||
|
0x00, 0x00, 0x00, // EV_SYN, SYN_REPORT, 0
|
||
|
0x01, 0x0b, 0x00, // EV_KEY, KEY_0, UP
|
||
|
0x00, 0x00, 0x00, // EV_SYN, SYN_REPORT, 0
|
||
|
0x01, 0x2, 0x1, // EV_KEY, KEY_1, DOWN
|
||
|
0x00, 0x00, 0x01, // EV_SYN, SYN_REPORT, 0
|
||
|
0x01, 0x02, 0x00, // EV_KEY, KEY_1, UP
|
||
|
0x00, 0x00, 0x01 // EV_SYN, SYN_REPORT, 0
|
||
|
]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Notes
|
||
|
1. As soon as EOF is reached (either in interactive mode, or in file mode),
|
||
|
the device that was created will be unregistered. There is no
|
||
|
explicit command for unregistering a device.
|
||
|
2. The `getevent` utility can used to print out the key events
|
||
|
for debugging purposes.
|
||
|
|
||
|
[1]: https://developer.android.com/reference/android/hardware/input/InputManager.InputDeviceListener.html
|
||
|
[2]: ../../../../cts/tests/tests/hardware/src/android/hardware/input/cts/tests/InputTestCase.java
|
||
|
[3]: ../../../../cts/tests/tests/hardware/res/raw/
|
||
|
[4]: ../../../../bionic/libc/kernel/uapi/linux/input.h
|