Skip to content

Commit

Permalink
tools: libinput-record: record the hid report descriptor where available
Browse files Browse the repository at this point in the history
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
  • Loading branch information
whot authored and bentiss committed Jan 2, 2019
1 parent 29e83bc commit b8a0455
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 0 deletions.
9 changes: 9 additions & 0 deletions tools/libinput-record-verify-yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,15 @@ def test_evdev_properties(self):
properties = evdev['properties']
self.assertTrue(isinstance(properties, list))

def test_hid(self):
devices = self.yaml['devices']
for d in devices:
hid = d['hid']
self.assertTrue(isinstance(hid, list))
for byte in hid:
self.assertGreaterEqual(byte, 0)
self.assertLessEqual(byte, 255)

def test_udev_sections_exist(self):
sections = ['properties']
devices = self.yaml['devices']
Expand Down
47 changes: 47 additions & 0 deletions tools/libinput-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -1614,6 +1614,52 @@ print_evdev_description(struct record_context *ctx, struct record_device *dev)
indent_pop(ctx);
}

static inline void
print_hid_report_descriptor(struct record_context *ctx,
struct record_device *dev)
{
const char *prefix = "/dev/input/event";
const char *node;
char syspath[PATH_MAX];
unsigned char buf[1024];
int len;
int fd;
bool first = true;

/* we take the shortcut rather than the proper udev approach, the
report_descriptor is available in sysfs and two devices up from
our device. 2 digits for the event number should be enough.
This approach won't work for /dev/input/by-id devices. */
if (!strneq(dev->devnode, prefix, strlen(prefix)) ||
strlen(dev->devnode) > strlen(prefix) + 2)
return;

node = &dev->devnode[strlen(prefix)];
len = snprintf(syspath,
sizeof(syspath),
"/sys/class/input/event%s/device/device/report_descriptor",
node);
if (len < 55 || len > 56)
return;

fd = open(syspath, O_RDONLY);
if (fd == -1)
return;

iprintf(ctx, "hid: [");

while ((len = read(fd, buf, sizeof(buf))) > 0) {
for (int i = 0; i < len; i++) {
/* YAML requires decimal */
noiprintf(ctx, "%s%u",first ? "" : ", ", buf[i]);
first = false;
}
}
noiprintf(ctx, " ]\n");

close(fd);
}

static inline void
print_udev_properties(struct record_context *ctx, struct record_device *dev)
{
Expand Down Expand Up @@ -1778,6 +1824,7 @@ print_device_description(struct record_context *ctx, struct record_device *dev)
iprintf(ctx, "- node: %s\n", dev->devnode);

print_evdev_description(ctx, dev);
print_hid_report_descriptor(ctx, dev);
print_udev_properties(ctx, dev);
print_device_quirks(ctx, dev);
print_libinput_description(ctx, dev);
Expand Down
4 changes: 4 additions & 0 deletions tools/libinput-record.man
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ devices:
57: [0, 65535, 0, 0, 0]
58: [0, 255, 0, 0, 0]
properties: [0, 2, 4]
hid: [12, 23, 34, 45, ...]
udev:
properties:
- ID_INPUT_MOUSE=1
Expand Down Expand Up @@ -225,6 +226,9 @@ the device node recorded
.B evdev
A dictionary with the evdev device information.
.TP 8
.B hid
A list of integers representing the HID report descriptor bytes.
.TP 8
.B udev
A dictionary with the udev device information.
.TP 8
Expand Down

0 comments on commit b8a0455

Please sign in to comment.