| # 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 |