| # Usage |
| ## Two options to use the hid command: |
| ### 1. Interactive through stdin: |
| type `hid -` 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 HID events. |
| For an example, see the cts test case at: [InputTestCase.java][2] |
| |
| When using another program to control hid 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 behaviour. |
| In the current implementation of the hid command, the hid binary will wait |
| for the file descriptor to the uhid node to send the UHID_START and UHID_OPEN |
| signals before returning. However, this is not sufficient. These signals |
| only notify the readiness of the kernel driver, |
| but do not take into account the inputflinger framework. |
| |
| |
| ### 2. Using a file as an input: |
| type `hid <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 hid 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 uhid 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 | |
| | descriptor | byte array | USB HID report descriptor | |
| |
| 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 uhid device is connected to the host. |
| The options are "usb" and "bluetooth". |
| |
| USB HID report descriptor should be generated according the the USB HID spec |
| and can be checked by reverse parsing using a variety of tools, for example |
| [usbdescreqparser][5]. |
| |
| Example: |
| ```json |
| { |
| "id": 1, |
| "command": "register", |
| "name": "Odie (Test)", |
| "vid": 0x18d1, |
| "pid": 0x2c40, |
| "bus": "usb", |
| "descriptor": [0x05, 0x01, 0x09, 0x05, 0xa1, 0x01, 0x85, 0x01, 0x05, 0x09, 0x0a, 0x01, 0x00, |
| 0x0a, 0x02, 0x00, 0x0a, 0x04, 0x00, 0x0a, 0x05, 0x00, 0x0a, 0x07, 0x00, 0x0a, 0x08, 0x00, |
| 0x0a, 0x0e, 0x00, 0x0a, 0x0f, 0x00, 0x0a, 0x0d, 0x00, 0x05, 0x0c, 0x0a, 0x24, 0x02, 0x0a, |
| 0x23, 0x02, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x0b, 0x81, 0x02, 0x75, 0x01, 0x95, |
| 0x01, 0x81, 0x03, 0x05, 0x01, 0x75, 0x04, 0x95, 0x01, 0x25, 0x07, 0x46, 0x3b, 0x01, 0x66, |
| 0x14, 0x00, 0x09, 0x39, 0x81, 0x42, 0x66, 0x00, 0x00, 0x09, 0x01, 0xa1, 0x00, 0x09, 0x30, |
| 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x05, 0x02, 0x09, 0xc5, 0x09, 0xc4, 0x15, 0x00, 0x26, |
| 0xff, 0x00, 0x35, 0x00, 0x46, 0xff, 0x00, 0x75, 0x08, 0x95, 0x06, 0x81, 0x02, 0xc0, 0x85, |
| 0x02, 0x05, 0x08, 0x0a, 0x01, 0x00, 0x0a, 0x02, 0x00, 0x0a, 0x03, 0x00, 0x0a, 0x04, 0x00, |
| 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x04, 0x91, 0x02, 0x75, 0x04, 0x95, 0x01, 0x91, |
| 0x03, 0xc0, 0x05, 0x0c, 0x09, 0x01, 0xa1, 0x01, 0x85, 0x03, 0x05, 0x01, 0x09, 0x06, 0xa1, |
| 0x02, 0x05, 0x06, 0x09, 0x20, 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, |
| 0x02, 0x06, 0xbc, 0xff, 0x0a, 0xad, 0xbd, 0x75, 0x08, 0x95, 0x06, 0x81, 0x02, 0xc0, 0xc0] |
| } |
| ``` |
| 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. `report` |
| Send a report to the HID device |
| |
| | Field | Type | Description | |
| |:-------------:|:-------------:|:-------------------------- | |
| | id | integer | Device id | |
| | command | string | Must be set to "report" | |
| | report | byte array | Report data to send | |
| |
| Example: |
| ```json |
| { |
| "id": 1, |
| "command": "report", |
| "report": [0x01, 0x01, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x00] |
| } |
| ``` |
| |
| ### Sending a joystick button press event |
| To send a button press event on a joystick device: |
| 1. Register the joystick device |
| 2. Send button down event with coordinates ABS_X, ABS_Y, ABS_Z, and ABS_RZ |
| at the center of the range. If the coordinates are not centered, this event |
| will generate a motion event within the input framework, in addition to the |
| button press event. The range can be determined from the uhid report descriptor. |
| 3. Send the button up event with the same coordinates as in 2. |
| 4. Check that the button press event was received. |
| |
| ### 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 linux input subsystem does not generate events for those values |
| that remain unchanged. For example, if there are two events sent to the driver, |
| and both events have the same value of ABS_X, then ABS_X coordinate |
| will not be reported. |
| 3. The description of joystick actions is available [here][6]. |
| 4. Joysticks are split axes. When an analog stick is in a resting state, |
| the reported coordinates are at the center of the range. |
| 5. 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]: https://developer.android.com/training/game-controllers/controller-input.html#button |
| [5]: http://eleccelerator.com/usbdescreqparser/ |
| [6]: https://developer.android.com/training/game-controllers/controller-input.html |