Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 1 | .. include:: <isonum.txt> |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 2 | |
Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 3 | =================== |
| 4 | The userio Protocol |
| 5 | =================== |
| 6 | |
| 7 | |
| 8 | :Copyright: |copy| 2015 Stephen Chandler Paul <thatslyude@gmail.com> |
| 9 | |
| 10 | Sponsored by Red Hat |
| 11 | |
| 12 | |
| 13 | Introduction |
| 14 | ============= |
| 15 | |
| 16 | This module is intended to try to make the lives of input driver developers |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 17 | easier by allowing them to test various serio devices (mainly the various |
| 18 | touchpads found on laptops) without having to have the physical device in front |
| 19 | of them. userio accomplishes this by allowing any privileged userspace program |
| 20 | to directly interact with the kernel's serio driver and control a virtual serio |
| 21 | port from there. |
| 22 | |
Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 23 | Usage overview |
| 24 | ============== |
| 25 | |
| 26 | In order to interact with the userio kernel module, one simply opens the |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 27 | /dev/userio character device in their applications. Commands are sent to the |
| 28 | kernel module by writing to the device, and any data received from the serio |
| 29 | driver is read as-is from the /dev/userio device. All of the structures and |
| 30 | macros you need to interact with the device are defined in <linux/userio.h> and |
| 31 | <linux/serio.h>. |
| 32 | |
Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 33 | Command Structure |
| 34 | ================= |
| 35 | |
| 36 | The struct used for sending commands to /dev/userio is as follows:: |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 37 | |
| 38 | struct userio_cmd { |
| 39 | __u8 type; |
| 40 | __u8 data; |
| 41 | }; |
| 42 | |
Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 43 | ``type`` describes the type of command that is being sent. This can be any one |
| 44 | of the USERIO_CMD macros defined in <linux/userio.h>. ``data`` is the argument |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 45 | that goes along with the command. In the event that the command doesn't have an |
| 46 | argument, this field can be left untouched and will be ignored by the kernel. |
| 47 | Each command should be sent by writing the struct directly to the character |
| 48 | device. In the event that the command you send is invalid, an error will be |
| 49 | returned by the character device and a more descriptive error will be printed |
| 50 | to the kernel log. Only one command can be sent at a time, any additional data |
| 51 | written to the character device after the initial command will be ignored. |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 52 | |
Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 53 | To close the virtual serio port, just close /dev/userio. |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 54 | |
Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 55 | Commands |
| 56 | ======== |
| 57 | |
| 58 | USERIO_CMD_REGISTER |
| 59 | ~~~~~~~~~~~~~~~~~~~ |
| 60 | |
| 61 | Registers the port with the serio driver and begins transmitting data back and |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 62 | forth. Registration can only be performed once a port type is set with |
| 63 | USERIO_CMD_SET_PORT_TYPE. Has no argument. |
| 64 | |
Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 65 | USERIO_CMD_SET_PORT_TYPE |
| 66 | ~~~~~~~~~~~~~~~~~~~~~~~~ |
| 67 | |
| 68 | Sets the type of port we're emulating, where ``data`` is the port type being |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 69 | set. Can be any of the macros from <linux/serio.h>. For example: SERIO_8042 |
| 70 | would set the port type to be a normal PS/2 port. |
| 71 | |
Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 72 | USERIO_CMD_SEND_INTERRUPT |
| 73 | ~~~~~~~~~~~~~~~~~~~~~~~~~ |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 74 | |
Mauro Carvalho Chehab | 730518f | 2017-04-04 17:48:53 -0700 | [diff] [blame] | 75 | Sends an interrupt through the virtual serio port to the serio driver, where |
| 76 | ``data`` is the interrupt data being sent. |
| 77 | |
| 78 | Userspace tools |
| 79 | =============== |
| 80 | |
| 81 | The userio userspace tools are able to record PS/2 devices using some of the |
Stephen Chandler Paul | 5523662e | 2015-10-24 13:10:29 -0700 | [diff] [blame] | 82 | debugging information from i8042, and play back the devices on /dev/userio. The |
| 83 | latest version of these tools can be found at: |
| 84 | |
| 85 | https://github.com/Lyude/ps2emu |