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.