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']
}
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)
{
struct udev *udev = NULL;
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);