---
name: "uhid"
section: "4"
platform: "openbsd"
package: "man"
version: "8.0-current-20261101"
release: "OpenBSD 8.0-current (2026-11-01)"
platforms: ["linux", "freebsd", "openbsd"]
url: "https://new.carta.tech/uhid"
---

# uhid(4)

USB generic HID support

## NAME

**uhid** – USB generic HID support

## SYNOPSIS

**uhid\* at uhidev?**

**#include \<dev/usb/usb.h\>**

## DESCRIPTION

The **uhid** driver provides support for all HID (Human Interface Device) interfaces in USB devices that do not have a special driver.

The device handles the following [ioctl(2)](/ioctl/2.md) calls:

- USB\_GET\_DEVICEINFO *struct*, *usb\_device\_info*, *\*devinfo*

  Get summarized information about the device.

- USB\_GET\_REPORT\_ID *int*, *\*repid*

  Get the report identifier used by this HID report.

- USB\_GET\_REPORT\_DESC *struct*, *usb\_ctl\_report\_desc*, *\*repdesc*

  Get the HID report descriptor. Using this descriptor the exact layout and meaning of data to/from the device can be found. The report descriptor is delivered without any processing.

  ```
  struct usb_ctl_report_desc {
      int     ucrd_size;
      u_char  ucrd_data[1024];	/* filled data size will vary */
  };
  ```

- USB\_GET\_REPORT *struct*, *usb\_ctl\_report*, *\*rep*

  Get a report from the device without waiting for data on the interrupt pipe. The *ucr\_report* field indicates which report is requested. It should be UHID\_INPUT\_REPORT, UHID\_OUTPUT\_REPORT, or UHID\_FEATURE\_REPORT.

  ```
  struct usb_ctl_report {
  	int	ucr_report;
  	u_char	ucr_data[1024];	/* filled data size will vary */
  };
  ```

- USB\_SET\_REPORT *struct*, *usb\_ctl\_report*, *\*rep*

  Set a report in the device. The report field indicates which report is to be set. It should be UHID\_INPUT\_REPORT, UHID\_OUTPUT\_REPORT, or UHID\_FEATURE\_REPORT.

The generic ioctls FIONBIO and FIOASYNC are supported by **uhid**.

Use [read(2)](/read/2.md) to get data from the device. Data should be read in chunks of the size prescribed by the report descriptor.

Use [write(2)](/write/2.md) to send data to the device. Equivalent to issuing an [ioctl(2)](/ioctl/2.md) USB\_SET\_REPORT request with the report set to UHID\_OUTPUT\_REPORT. Data should be written in chunks of the size prescribed by the report descriptor.

## FILES

- */dev/uhid\**

  ## ERRORS

If [ioctl(2)](/ioctl/2.md) fails, [errno(2)](/errno/2.md) is set to one of the following:

- \[EIO\]

  The device could not fulfill a USB\_GET\_REPORT or USB\_SET\_REPORT request.

- \[EINVAL\]

  The report specified by the *ucr\_report* field in a USB\_GET\_REPORT or USB\_SET\_REPORT request was invalid.

- \[ENOTTY\]

  Unrecognized command.

If [read(2)](/read/2.md) fails, [errno(2)](/errno/2.md) is set to one of the following:

- \[EIO\]

  The device has already been detached.

- \[EWOULDBLOCK\]

  Non-blocking I/O was selected and no data were available.

If [write(2)](/write/2.md) fails, [errno(2)](/errno/2.md) is set to one of the following:

- \[EIO\]

  The device has already been detached or the same device does not have a corresponding output report.

- \[EMSGSIZE\]

  The size of the supplied data exceeds the size of the output report.

## SEE ALSO

[usbhidctl(1)](/usbhidctl/1.md), [usbhid(3)](/usbhid/3.md), [intro(4)](/intro/4.md), [uhidev(4)](/uhidev/4.md), [usb(4)](/usb/4.md)

## HISTORY

The **uhid** driver appeared in OpenBSD 2.6.
