---
name: "uhid"
section: "4"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["linux", "freebsd", "openbsd"]
url: "https://new.carta.tech/uhid"
---

# uhid(4)

USB generic HID support

## NAME

**uhid** – USB generic HID support

## SYNOPSIS

**device** **uhid** **device** **hid** **device** **usb**

In [loader.conf(5)](/loader.conf/5.md): **uhid\_load="YES"**

In [loader.conf(5)](/loader.conf/5.md) or [sysctl.conf(5)](/sysctl.conf/5.md): **hw.usb.uhid.debug**

## 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\_REPORT\_ID (*int*)

  Get the report identifier used by this HID report.

- USB\_GET\_REPORT\_DESC (*struct usb\_gen\_descriptor*)

  Get the HID report descriptor. Copies a maximum of *ugd\_maxlen* bytes of the report descriptor data into the memory specified by *ugd\_data*. Upon return *ugd\_actlen* is set to the number of bytes copied. 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_gen_descriptor {
  	void   *ugd_data;
  	uint16_t ugd_maxlen;
  	uint16_t ugd_actlen;
  	uint8_t	ugd_report_type;
  	...
  };
  ```

- USB\_SET\_IMMED (*int*)

  Sets the device in a mode where each [read(2)](/read/2.md) will return the current value of the input report. Normally a [read(2)](/read/2.md) will only return the data that the device reports on its interrupt pipe. This call may fail if the device does not support this feature.

- USB\_GET\_REPORT (*struct usb\_gen\_descriptor*)

  Get a report from the device without waiting for data on the interrupt pipe. Copies a maximum of *ugd\_maxlen* bytes of the report data into the memory specified by *ugd\_data*. Upon return *ugd\_actlen* is set to the number of bytes copied. The *ugd\_report\_type* field indicates which report is requested. It should be UHID\_INPUT\_REPORT, UHID\_OUTPUT\_REPORT, or UHID\_FEATURE\_REPORT. This call may fail if the device does not support this feature.

- USB\_SET\_REPORT (*struct usb\_gen\_descriptor*)

  Set a report in the device. The *ugd\_report\_type* field indicates which report is to be set. It should be UHID\_INPUT\_REPORT, UHID\_OUTPUT\_REPORT, or UHID\_FEATURE\_REPORT. The value of the report is specified by the *ugd\_data* and the *ugd\_maxlen* fields. This call may fail if the device does not support this feature.

- USB\_GET\_DEVICEINFO (*struct usb\_device\_info*)

  Returns information about the device, like USB vendor ID and USB product ID. This call will not issue any USB transactions. Also refer to [ugen(4)](/ugen/4.md).

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. Data should be written in chunks of the size prescribed by the report descriptor.

## SYSCTL VARIABLES

The following variables are available as both [sysctl(8)](/sysctl/8.md) variables and [loader(8)](/loader/8.md) tunables:

- *hw.usb.uhid.debug*

  Debug output level, where 0 is debugging disabled and larger values increase debug message verbosity. Default is 0.

## FILES

- */dev/uhid?*

  ## SEE ALSO

[usbhidctl(1)](/usbhidctl/1.md), [usb(4)](/usb/4.md)

## HISTORY

The **uhid** driver appeared in NetBSD 1.4. This manual page was adopted from NetBSD by Tom Rhodes ⟨*trhodes@FreeBSD.org*⟩ in April 2002.
