forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.9 KiB
85 lines
2.9 KiB
.. include:: <isonum.txt> |
|
|
|
=================== |
|
The userio Protocol |
|
=================== |
|
|
|
|
|
:Copyright: |copy| 2015 Stephen Chandler Paul <[email protected]> |
|
|
|
Sponsored by Red Hat |
|
|
|
|
|
Introduction |
|
============= |
|
|
|
This module is intended to try to make the lives of input driver developers |
|
easier by allowing them to test various serio devices (mainly the various |
|
touchpads found on laptops) without having to have the physical device in front |
|
of them. userio accomplishes this by allowing any privileged userspace program |
|
to directly interact with the kernel's serio driver and control a virtual serio |
|
port from there. |
|
|
|
Usage overview |
|
============== |
|
|
|
In order to interact with the userio kernel module, one simply opens the |
|
/dev/userio character device in their applications. Commands are sent to the |
|
kernel module by writing to the device, and any data received from the serio |
|
driver is read as-is from the /dev/userio device. All of the structures and |
|
macros you need to interact with the device are defined in <linux/userio.h> and |
|
<linux/serio.h>. |
|
|
|
Command Structure |
|
================= |
|
|
|
The struct used for sending commands to /dev/userio is as follows:: |
|
|
|
struct userio_cmd { |
|
__u8 type; |
|
__u8 data; |
|
}; |
|
|
|
``type`` describes the type of command that is being sent. This can be any one |
|
of the USERIO_CMD macros defined in <linux/userio.h>. ``data`` is the argument |
|
that goes along with the command. In the event that the command doesn't have an |
|
argument, this field can be left untouched and will be ignored by the kernel. |
|
Each command should be sent by writing the struct directly to the character |
|
device. In the event that the command you send is invalid, an error will be |
|
returned by the character device and a more descriptive error will be printed |
|
to the kernel log. Only one command can be sent at a time, any additional data |
|
written to the character device after the initial command will be ignored. |
|
|
|
To close the virtual serio port, just close /dev/userio. |
|
|
|
Commands |
|
======== |
|
|
|
USERIO_CMD_REGISTER |
|
~~~~~~~~~~~~~~~~~~~ |
|
|
|
Registers the port with the serio driver and begins transmitting data back and |
|
forth. Registration can only be performed once a port type is set with |
|
USERIO_CMD_SET_PORT_TYPE. Has no argument. |
|
|
|
USERIO_CMD_SET_PORT_TYPE |
|
~~~~~~~~~~~~~~~~~~~~~~~~ |
|
|
|
Sets the type of port we're emulating, where ``data`` is the port type being |
|
set. Can be any of the macros from <linux/serio.h>. For example: SERIO_8042 |
|
would set the port type to be a normal PS/2 port. |
|
|
|
USERIO_CMD_SEND_INTERRUPT |
|
~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
|
|
Sends an interrupt through the virtual serio port to the serio driver, where |
|
``data`` is the interrupt data being sent. |
|
|
|
Userspace tools |
|
=============== |
|
|
|
The userio userspace tools are able to record PS/2 devices using some of the |
|
debugging information from i8042, and play back the devices on /dev/userio. The |
|
latest version of these tools can be found at: |
|
|
|
https://github.com/Lyude/ps2emu
|
|
|