usb_hid – USB Human Interface Device

The usb_hid module allows you to output data as a HID device.

Available on these boards
  • 8086 Commander
  • @sarfata shIRtty
  • ARAMCON Badge 2019
  • ARAMCON2 Badge
  • ATMegaZero ESP32-S2
  • Adafruit BLM Badge
  • Adafruit CLUE nRF52840 Express
  • Adafruit Camera
  • Adafruit Circuit Playground Bluefruit
  • Adafruit Circuit Playground Express 4-H
  • Adafruit CircuitPlayground Express
  • Adafruit CircuitPlayground Express with Crickit libraries
  • Adafruit CircuitPlayground Express with displayio
  • Adafruit EdgeBadge
  • Adafruit Feather Bluefruit Sense
  • Adafruit Feather ESP32-S2 TFT
  • Adafruit Feather ESP32S2
  • Adafruit Feather ESP32S3 No PSRAM
  • Adafruit Feather M0 Adalogger
  • Adafruit Feather M0 Basic
  • Adafruit Feather M0 Express
  • Adafruit Feather M0 Express with Crickit libraries
  • Adafruit Feather M4 CAN
  • Adafruit Feather M4 Express
  • Adafruit Feather MIMXRT1011
  • Adafruit Feather RP2040
  • Adafruit Feather STM32F405 Express
  • Adafruit Feather nRF52840 Express
  • Adafruit FunHouse
  • Adafruit Gemma M0
  • Adafruit Gemma M0 PyCon 2018
  • Adafruit Grand Central M4 Express
  • Adafruit Hallowing M4 Express
  • Adafruit ItsyBitsy M0 Express
  • Adafruit ItsyBitsy M4 Express
  • Adafruit ItsyBitsy RP2040
  • Adafruit ItsyBitsy nRF52840 Express
  • Adafruit KB2040
  • Adafruit LED Glasses Driver nRF52840
  • Adafruit Macropad RP2040
  • Adafruit MagTag
  • Adafruit Matrix Portal M4
  • Adafruit Metro ESP32S2
  • Adafruit Metro M0 Express
  • Adafruit Metro M4 Airlift Lite
  • Adafruit Metro M4 Express
  • Adafruit Metro nRF52840 Express
  • Adafruit Monster M4SK
  • Adafruit NeoKey Trinkey M0
  • Adafruit NeoPixel Trinkey M0
  • Adafruit ProxLight Trinkey M0
  • Adafruit PyGamer
  • Adafruit PyPortal
  • Adafruit PyPortal Pynt
  • Adafruit PyPortal Titano
  • Adafruit PyRuler
  • Adafruit Pybadge
  • Adafruit QT Py ESP32-S3 no psram
  • Adafruit QT Py ESP32S2
  • Adafruit QT Py M0
  • Adafruit QT Py M0 Haxpress
  • Adafruit QT Py RP2040
  • Adafruit QT2040 Trinkey
  • Adafruit Rotary Trinkey M0
  • Adafruit Slide Trinkey M0
  • Adafruit Trellis M4 Express
  • Adafruit Trinket M0
  • AloriumTech Evo M51
  • Arduino MKR Zero
  • Arduino MKR1300
  • Arduino Nano 33 BLE
  • Arduino Nano 33 IoT
  • Arduino Nano RP2040 Connect
  • Arduino Zero
  • Artisense Reference Design RD00
  • AtelierDuMaker nRF52840 Breakout
  • BLE-SS dev board Multi Sensor
  • BastBLE
  • BastWiFi
  • BlueMicro833
  • BlueMicro840
  • CP Sapling M0
  • CP Sapling M0 w/ SPI Flash
  • CP32-M4
  • Cedar Grove StringCar M0 Express
  • Challenger NB RP2040 WiFi
  • Challenger RP2040 LTE
  • Challenger RP2040 WiFi
  • Circuit Playground Express Digi-Key PyCon 2019
  • CircuitBrains Basic
  • CircuitBrains Deluxe
  • CrumpS2
  • Cytron Maker Feather AIoT S3
  • Cytron Maker Nano RP2040
  • Cytron Maker Pi RP2040
  • Diodes Delight Piunora
  • DynaLoRa_USB
  • ESP 12k NodeMCU
  • ESP32-S2-DevKitC-1-N4
  • ESP32-S2-DevKitC-1-N4R2
  • ESP32-S3-Box-2.5
  • ESP32-S3-DevKitC-1-N8
  • ESP32-S3-DevKitC-1-N8R2
  • ESP32-S3-DevKitC-1-N8R8
  • ESP32-S3-DevKitM-1-N8
  • ESP32-S3-USB-OTG-N8
  • Electronic Cats Bast Pro Mini M0
  • Electronic Cats CatWAN USBStick
  • Electronic Cats Hunter Cat NFC
  • Electronic Cats NFC Copy Cat
  • Electronut Labs Blip
  • Electronut Labs Papyr
  • EncoderPad RP2040
  • Escornabot Makech
  • Espruino Pico
  • Espruino Wifi
  • Feather ESP32S2 without PSRAM
  • Feather MIMXRT1011
  • Feather MIMXRT1062
  • FeatherS2
  • FeatherS2 Neo
  • FeatherS2 PreRelease
  • FeatherS3
  • Fluff M0
  • Fomu
  • Franzininho WIFI w/Wroom
  • Franzininho WIFI w/Wrover
  • Gravitech Cucumber M
  • Gravitech Cucumber MS
  • Gravitech Cucumber R
  • Gravitech Cucumber RS
  • HMI-DevKit-1.1
  • Hacked Feather M0 Express with 8Mbyte SPI flash
  • HalloWing M0 Express
  • HexKyS2
  • HiiBot BlueFi
  • IMXRT1010-EVK
  • IkigaiSense Vita nRF52840
  • IoTs2
  • J&J Studios datum-Distance
  • J&J Studios datum-IMU
  • J&J Studios datum-Light
  • J&J Studios datum-Weather
  • Kaluga 1
  • LILYGO TTGO T8 ESP32-S2 w/Display
  • LoC BeR M4 base board
  • MDBT50Q-DB-40
  • MDBT50Q-RX Dongle
  • MORPHEANS MorphESP-240
  • MakerDiary nRF52840 MDK
  • MakerDiary nRF52840 MDK USB Dongle
  • Makerdiary M60 Keyboard
  • Makerdiary Pitaya Go
  • Makerdiary nRF52840 M.2 Developer Kit
  • Melopero Shake RP2040
  • Meow Meow
  • Metro MIMXRT1011
  • MicroDev microS2
  • Mini SAM M4
  • NUCLEO STM32F746
  • NUCLEO STM32F767
  • NUCLEO STM32H743
  • OPENMV-H7 R1
  • Oak Dev Tech BREAD2040
  • Oak Dev Tech Cast-Away RP2040
  • Oak Dev Tech PixelWing ESP32S2
  • Open Hardware Summit 2020 Badge
  • PCA10056 nRF52840-DK
  • PCA10059 nRF52840 Dongle
  • PCA10100 nRF52833 DK
  • PYB LR Nano V2
  • Particle Argon
  • Particle Boron
  • Particle Xenon
  • PewPew 10.2
  • PicoPlanet
  • Pimoroni Badger 2040
  • Pimoroni Interstate 75
  • Pimoroni Keybow 2040
  • Pimoroni Motor 2040
  • Pimoroni PGA2040
  • Pimoroni Pico LiPo (16MB)
  • Pimoroni Pico LiPo (4MB)
  • Pimoroni PicoSystem
  • Pimoroni Plasma 2040
  • Pimoroni Servo 2040
  • Pimoroni Tiny 2040 (2MB)
  • Pimoroni Tiny 2040 (8MB)
  • ProS3
  • PyCubedv04
  • PyCubedv04-MRAM
  • PyCubedv05
  • PyCubedv05-MRAM
  • PyKey 18 Numpad
  • PyKey 44 Ergo
  • PyKey 60
  • PyKey 87 TKL
  • PyboardV1_1
  • RP2.65-F
  • RP2040 Stamp
  • Raspberry Pi 4B
  • Raspberry Pi Compute Module 4
  • Raspberry Pi Compute Module 4 IO Board
  • Raspberry Pi Pico
  • Raspberry Pi Zero
  • Raspberry Pi Zero 2W
  • Raspberry Pi Zero W
  • Robo HAT MM1 M4
  • S2Mini
  • S2Pico
  • SAM E54 Xplained Pro
  • SAM32v26
  • SSCI ISP1807 Dev Board
  • SSCI ISP1807 Micro Board
  • ST STM32F746G Discovery
  • STM32F411E_DISCO
  • STM32F412G_DISCO
  • Saola 1 w/Wroom
  • Saola 1 w/Wrover
  • Seeed XIAO nRF52840 Sense
  • Seeeduino Wio Terminal
  • Seeeduino XIAO
  • Seeeduino XIAO KB
  • Seeeduino XIAO RP2040
  • Serpente
  • Silicognition LLC M4-Shim
  • Simmel
  • SparkFun LUMIDrive
  • SparkFun MicroMod RP2040 Processor
  • SparkFun MicroMod SAMD51 Processor
  • SparkFun MicroMod nRF52840 Processor
  • SparkFun Pro Micro RP2040
  • SparkFun Pro nRF52840 Mini
  • SparkFun Qwiic Micro
  • SparkFun RedBoard Turbo
  • SparkFun SAMD21 Dev Breakout
  • SparkFun SAMD21 Mini Breakout
  • SparkFun STM32 MicroMod Processor
  • SparkFun Teensy MicroMod Processor
  • SparkFun Thing Plus - RP2040
  • SparkFun Thing Plus - SAMD51
  • SparkFun Thing Plus - STM32
  • Sprite_v2b
  • StackRduino M0 PRO
  • TG-Boards' Datalore IP M4
  • TG-Watch
  • Targett Module Clip w/Wroom
  • Targett Module Clip w/Wrover
  • Teensy 4.0
  • Teensy 4.1
  • Teknikio Bluebird
  • The Open Book Feather
  • TinkeringTech ScoutMakes Azul
  • TinyS2
  • TinyS3
  • Trinket M0 Haxpress
  • UARTLogger II
  • W5100S-EVB-Pico
  • WarmBit BluePixel nRF52840
  • Waveshare RP2040-Zero
  • XinaBox CC03
  • XinaBox CS11
  • iLabs Challenger 840
  • iMX RT 1020 EVK
  • iMX RT 1060 EVK
  • snekboard
  • nanoESP32-S2 w/Wrover
  • nanoESP32-S2 w/Wroom
  • ndGarage[n°] Bit6: FeatherSnow-v2
  • ndGarage[n°]Bit6:FeatherSnow
  • nice!nano
  • senseBox MCU
  • stm32f411ce-blackpill
  • stm32f411ce-blackpill-with-flash
  • uChip

usb_hid.devices :Tuple[Device, Ellipsis]

Tuple of all active HID device interfaces. The default set of devices is Device.KEYBOARD, Device.MOUSE, Device.CONSUMER_CONTROL, On boards where usb_hid is disabled by default, devices is an empty tuple.

If a boot device is enabled by usb_hid.enable(), and the host has requested a boot device, the devices tuple is replaced when starts with a single-element tuple containing a Device that describes the boot device chosen (keyboard or mouse). The request for a boot device overrides any other HID devices.

usb_hid.disable() None

Do not present any USB HID devices to the host computer. Can be called in, before USB is connected. The HID composite device is normally enabled by default, but on some boards with limited endpoints, including STM32F4, it is disabled by default. You must turn off another USB device such as usb_cdc or storage to free up endpoints for use by usb_hid.

usb_hid.enable(devices: Optional[Sequence[Device]], boot_device: int = 0) None

Specify which USB HID devices that will be available. Can be called in, before USB is connected.

  • devices (Sequence) – Device objects. If devices is empty, HID is disabled. The order of the Devices may matter to the host. For instance, for MacOS, put the mouse device before any Gamepad or Digitizer HID device or else it will not work.

  • boot_device (int) – If non-zero, inform the host that support for a a boot HID device is available. If boot_device=1, a boot keyboard is available. If boot_device=2, a boot mouse is available. No other values are allowed. See below.

If you enable too many devices at once, you will run out of USB endpoints. The number of available endpoints varies by microcontroller. CircuitPython will go into safe mode after running to inform you if not enough endpoints are available.

Boot Devices

Boot devices implement a fixed, predefined report descriptor, defined in, Appendix B. A USB host can request to use the boot device if the USB device says it is available. Usually only a BIOS or other kind of limited-functionality host needs boot keyboard support.

For example, to make a boot keyboard available, you can use this code:

usb_hid.enable((Device.KEYBOARD), boot_device=1)  # 1 for a keyboard

If the host requests the boot keyboard, the report descriptor provided by Device.KEYBOARD will be ignored, and the predefined report descriptor will be used. But if the host does not request the boot keyboard, the descriptor provided by Device.KEYBOARD will be used.

The HID boot device must usually be the first or only device presented by CircuitPython. The HID device will be USB interface number 0. To make sure it is the first device, disable other USB devices, including CDC and MSC (CIRCUITPY). If you specify a non-zero boot_device, and it is not the first device, CircuitPython will enter safe mode to report this error.

usb_hid.get_boot_device() int

the boot device requested by the host, if any. Returns 0 if the host did not request a boot device, or if usb_hid.enable() was called with boot_device=0, the default, which disables boot device support. If the host did request a boot device, returns the value of boot_device set in usb_hid.enable(): 1 for a boot keyboard, or 2 for boot mouse. However, the standard devices provided by CircuitPython, Device.KEYBOARD and Device.MOUSE, describe reports that match the boot device reports, so you don’t need to check this if you are using those devices.

Rtype int

class usb_hid.Device(*, report_descriptor: circuitpython_typing.ReadableBuffer, usage_page: int, usage: int, report_ids: Sequence[int], in_report_lengths: Sequence[int], out_report_lengths: Sequence[int])

HID Device specification

Create a description of a USB HID device. The actual device is created when you pass a Device to usb_hid.enable().

  • report_descriptor (ReadableBuffer) – The USB HID Report descriptor bytes. The descriptor is not not verified for correctness; it is up to you to make sure it is not malformed.

  • usage_page (int) – The Usage Page value from the descriptor. Must match what is in the descriptor.

  • usage (int) – The Usage value from the descriptor. Must match what is in the descriptor.

  • report_ids (Sequence[int]) – Sequence of report ids used by the descriptor. If the report_descriptor does not specify any report IDs, use (0,).

  • in_report_lengths (Sequence[int]) – Sequence of sizes in bytes of the HID reports sent to the host. The sizes are in order of the report_ids. Use a size of 0 for a report that is not an IN report. “IN” is with respect to the host.

  • out_report_lengths (int) – Sequence of sizes in bytes of the HID reports received from the host. The sizes are in order of the report_ids. Use a size of 0 for a report that is not an OUT report. “OUT” is with respect to the host.

report_ids, in_report_lengths, and out_report_lengths must all have the same number of elements.

Here is an example of a Device with a descriptor that specifies two report IDs, 3 and 4. Report ID 3 sends an IN report of length 5, and receives an OUT report of length 6. Report ID 4 sends an IN report of length 2, and does not receive an OUT report:

device = usb_hid.Device(
    descriptor=b"...",         # Omitted for brevity.
    report_ids=(3, 4),
    in_report_lengths=(5, 2),
    out_report_lengths=(6, 0),

Standard keyboard device supporting keycodes 0x00-0xDD, modifiers 0xE-0xE7, and five LED indicators. Uses Report ID 1 for its IN and OUT reports.

MOUSE :Device

Standard mouse device supporting five mouse buttons, X and Y relative movements from -127 to 127 in each report, and a relative mouse wheel change from -127 to 127 in each report. Uses Report ID 2 for its IN report.


Consumer Control device supporting sent values from 1-652, with no rollover. Uses Report ID 3 for its IN report.

last_received_report :bytes

The HID OUT report as a bytes (read-only). None if nothing received. Same as get_last_received_report() with no argument.

Deprecated: will be removed in CircutPython 8.0.0. Use get_last_received_report() instead.

usage_page :int

The device usage page identifier, which designates a category of device. (read-only)

usage :int

The device usage identifier, which designates a specific kind of device. (read-only)

For example, Keyboard is 0x06 within the generic desktop usage page 0x01. Mouse is 0x02 within the same usage page.

send_report(buf: circuitpython_typing.ReadableBuffer, report_id: Optional[int] = None) None

Send an HID report. If the device descriptor specifies zero or one report id’s, you can supply None (the default) as the value of report_id. Otherwise you must specify which report id to use when sending the report.

get_last_received_report(report_id: Optional[int] = None) Optional[bytes]

Get the last received HID OUT or feature report for the given report ID. The report ID may be omitted if there is no report ID, or only one report ID. Return None if nothing received. After returning a report, subsequent calls will return None until next report is received.