Expand description

Batteries included embedded USB HID library for usb-device. Includes concrete Keyboard (boot and NKRO), Mouse and Consumer Control implementations as well as support for building your own HID classes.

This library has been tested on the RP2040 but should work on any platform supported by usb-device.

Devices created with this library should work with any USB host. It has been tested on Windows, Linux, MacOS and Android.

Note: Managed interfaces that support HID idle, such as device::keyboard::NKROBootKeyboardInterface and device::keyboard::BootKeyboardInterface, require their tick() method calling every 1ms/at 1kHz.

use usbd_human_interface_device::page::Keyboard;
use usbd_human_interface_device::device::keyboard::{KeyboardLedsReport, NKROBootKeyboardInterface};
use usbd_human_interface_device::prelude::*;

let usb_alloc = UsbBusAllocator::new(usb_bus);

let mut keyboard = UsbHidClassBuilder::new()
    .add_interface(
        NKROBootKeyboardInterface::default_config(),
    )
    .build(&usb_alloc);

let mut usb_dev = UsbDeviceBuilder::new(&usb_alloc, UsbVidPid(0x1209, 0x0001))
    .manufacturer("usbd-human-interface-device")
    .product("NKRO Keyboard")
    .serial_number("TEST")
    .build();

let mut tick_timer = timer.count_down();
tick_timer.start(1.millis());

loop {
    let keys = if pin.is_high().unwrap() {
            [Keyboard::A]
        } else {
            [Keyboard::NoEventIndicated]
    };

    keyboard.interface().write_report(keys).ok();

    //tick once per ms/at 1kHz
    if tick_timer.wait().is_ok() {
        keyboard.interface().tick().unwrap();
    }

    if usb_dev.poll(&mut [&mut keyboard]) {
        match keyboard.interface().read_report() {

            Ok(l) => {
                update_leds(l);
            }
            _ => {}

        }
    }
}

Features

  • Keyboard implementations - standard boot compliant keyboard, boot compatible NKRO(N-Key Roll Over) keyboard
  • Mouse - standard boot compliant mouse, boot compatible mouse with scroll wheel and pan
  • Consumer Control - fixed function media control device, arbitrary consumer control device
  • Enums defining the Consumer, Desktop, Game, Keyboard, LED, Simulation and Telephony HID usage pages
  • Support for multi-interface devices
  • Support for HID idle
  • Support for HID protocol changing
  • Support for both single and multiple reports

Examples

See examples for demonstration of how to use this library on the RP2040 (Raspberry Pi Pico)

Modules

  • Concrete implementation of Human Interface Devices
  • Abstract Human Interface Device Class for implementing any HID compliant device
  • Abstract Human Interface Device Interfaces
  • USB HID usage pages
  • The USB HID Prelude.

Enums