Implementation Notes

NetBSD maps every uhidev device to one or more uhid devices. Each uhid device only supports one report ID. The parent device uhidev creates one uhid device per report ID found in the hardware's report descriptor.

In the event there are no report ID(s) found within the report descriptor, only one uhid device with a report ID of 0 is created.

In order to remain compatible with existing hidapi APIs, all the uhid devices created by the parent uhidev device must be opened under the same hid_device instance to ensure that we can route reports to their appropriate uhid device.

Internally the uhid driver will insert the report ID as needed so we must also omit the report ID in any situation where the hidapi API expects it to be included in the report data stream.

Given the design of uhid, it must be augmented with extra platform specific APIs to ensure that the exact relationship between uhidev devices and uhid devices can be determined.

The NetBSD implementation does this via the drvctl kernel driver. At present there is no known way to do this on OpenBSD for a uhid implementation to be at the same level as the NetBSD one.