:mod:`usb_hid`
==============
.. py:module:: usb_hid
.. autoapi-nested-parse::
USB Human Interface Device
The `usb_hid` module allows you to output data as a HID device.
.. raw:: html
Available on these boards
- 8086 Commander
- @sarfata shIRtty
- ARAMCON Badge 2019
- ARAMCON2 Badge
- ATMegaZero ESP32-S2
- Adafruit BLM Badge
- Adafruit CLUE nRF52840 Express
- 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 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 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
- BDMICRO VINA-D21
- BDMICRO VINA-D51
- BLE-SS dev board Multi Sensor
- BastBLE
- BastWiFi
- BlueMicro840
- CP Sapling M0
- CP Sapling M0 w/ SPI Flash
- CP32-M4
- Capable Robot Programmable USB Hub
- 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 Nano RP2040
- Cytron Maker Pi RP2040
- DynOSSAT-EDU-EPS
- DynOSSAT-EDU-OBC
- DynaLoRa_USB
- ESP 12k NodeMCU
- 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
- 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
- HiiBot BlueFi
- IMXRT1010-EVK
- IkigaiSense Vita nRF52840
- 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
- MEOWBIT
- 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 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
- PewPew 13
- PicoPlanet
- Pimoroni Interstate 75
- Pimoroni Keybow 2040
- Pimoroni PGA2040
- Pimoroni Pico LiPo (16MB)
- Pimoroni Pico LiPo (4MB)
- Pimoroni PicoSystem
- Pimoroni Plasma 2040
- Pimoroni Tiny 2040
- PyCubedv04
- PyCubedv04-MRAM
- PyCubedv05
- PyCubedv05-MRAM
- PyKey60
- PyboardV1_1
- RP2040 Stamp
- Raspberry Pi 4B
- Raspberry Pi Compute Module 4 IO Board
- Raspberry Pi Pico
- Raspberry Pi Zero 2W
- Robo HAT MM1 M4
- S2Mini
- S2Pico
- SAM E54 Xplained Pro
- SAM32v26
- ST STM32F746G Discovery
- STM32F411E_DISCO
- STM32F412G_DISCO
- STM32F4_DISCO
- Saola 1 w/Wroom
- Saola 1 w/Wrover
- Seeeduino Wio Terminal
- Seeeduino XIAO
- Seeeduino XIAO KB
- 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 Thing Plus - RP2040
- SparkFun Thing Plus - SAMD51
- Sprite_v2b
- StackRduino M0 PRO
- TG-Boards' Datalore IP M4
- TG-Watch
- THUNDERPACK_v11
- Targett Module Clip w/Wroom
- Targett Module Clip w/Wrover
- Teensy 4.0
- Teensy 4.1
- Teknikio Bluebird
- The Open Book Feather
- Thingz - Galaxia
- TinkeringTech ScoutMakes Azul
- TinyS2
- Trinket M0 Haxpress
- UARTLogger II
- WarmBit BluePixel nRF52840
- XinaBox CC03
- XinaBox CS11
- iMX RT 1020 EVK
- iMX RT 1060 EVK
- keithp.com 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
.. py:data:: devices
:annotation: :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 ``code.py`` 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.
.. py:function:: disable() -> None
Do not present any USB HID devices to the host computer.
Can be called in ``boot.py``, 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`.
.. py:function:: enable(devices: Optional[Sequence[Device]], boot_device: int = 0) -> None
Specify which USB HID devices that will be available.
Can be called in ``boot.py``, before USB is connected.
:param Sequence devices: `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.
:param int boot_device: 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 ``boot.py`` to inform you if
not enough endpoints are available.
**Boot Devices**
Boot devices implement a fixed, predefined report descriptor, defined in
https://www.usb.org/sites/default/files/hid1_12.pdf, 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.
.. py:function:: get_boot_device() -> int
:return: 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:
.. py:class:: Device(*, descriptor: _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()`.
:param ReadableBuffer report_descriptor: 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.
:param int usage_page: The Usage Page value from the descriptor. Must match what is in the descriptor.
:param int usage: The Usage value from the descriptor. Must match what is in the descriptor.
:param Sequence[int] report_ids: Sequence of report ids used by the descriptor.
If the ``report_descriptor`` does not specify any report IDs, use ``(0,)``.
:param Sequence[int] in_report_lengths: 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.
:param int out_report_lengths: 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),
)
.. py:attribute:: KEYBOARD
:annotation: :Device
Standard keyboard device supporting keycodes 0x00-0xDD, modifiers 0xE-0xE7, and five LED indicators.
Uses Report ID 1 for its IN and OUT reports.
.. py:attribute:: MOUSE
:annotation: :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.
.. py:attribute:: CONSUMER_CONTROL
:annotation: :Device
Consumer Control device supporting sent values from 1-652, with no rollover.
Uses Report ID 3 for its IN report.
.. py:attribute:: last_received_report
:annotation: :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.
.. py:attribute:: usage_page
:annotation: :int
The device usage page identifier, which designates a category of device. (read-only)
.. py:attribute:: usage
:annotation: :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.
.. py:method:: send_report(buf: _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.
.. py:method:: get_last_received_report(report_id: Optional[int] = None) -> 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.