USB state module

The USB state module is responsible for tracking the USB connection. It is also responsible for transmitting data through USB on the application’s device.

Module events

Source Module

Input Event

This Module

Output Event

Sink Module

Source modules for config_event

config_event

usb_state

HID forward module

hid_report_event

HID state module

HID Service module

USB state module

Source modules for module_state_event

module_state_event

Buttons module

wake_up_event

HID forward module

Motion module

Power manager module

Wheel module

config_event

Sink modules for config_event

hid_report_sent_event

HID forward module

HID state module

Motion module

hid_report_subscription_event

HID forward module

HID state module

Motion module

module_state_event

Sink modules for module_state_event

usb_hid_event

HID state module

usb_state_event

Battery charger module

Motion module

Power manager module

hid_report_event

Bluetooth LE Quality of Service module

Bluetooth LE scanning module

Device Firmware Upgrade module

HID forward module

HID state module

HID Service module

USB state module

Note

See the Overview: Firmware architecture for more information about the event-based communication in the nRF Desktop application and about how to read this table.

Configuration

The module is enabled by selecting CONFIG_DESKTOP_USB_ENABLE. It depends on CONFIG_USB_DEVICE_HID.

When enabling the USB support for the device, set the following generic device options:

Additionally, you can also configure the options described in the following sections.

Low latency device configuration

For low latency devices, make sure that the device requests a polling rate of 1 ms by setting CONFIG_USB_HID_POLL_INTERVAL_MS to 1.

Boot protocol configuration

If the device is meant to support the boot protocol, set the following options:

  1. Enable CONFIG_USB_HID_BOOT_PROTOCOL.

  2. Set the CONFIG_USB_HID_PROTOCOL_CODE Kconfig option to one of the following values to use the device for forwarding either the HID boot keyboard or the HID boot mouse reports, respectively:

  • If you want to forward HID boot keyboard reports, set the option to 1.

  • If you want to forward HID boot mouse reports, set the option to 2.

USB device instance configuration

The nRF Desktop device can provide multiple instances of a HID-class USB device. The number of instances is controlled by CONFIG_USB_HID_DEVICE_COUNT.

  • The Bluetooth® Peripheral device will be able to use a single instance only.

  • The Bluetooth® Central device can use either a single instance or a number of instances equal to CONFIG_BT_MAX_PAIRED.

On the Bluetooth Central device, if only one instance is used, reports from all Peripherals connected to the Central are forwarded to the same instance. In other cases, reports from each of the bonded peripherals will be forwarded to a dedicated HID-class USB device instance. The same instance is used after reconnection.

USB wake-up configuration

The nRF Desktop device can work as a source of wake-up events for the host device if connected through the USB.

To use the feature, select CONFIG_USB_DEVICE_REMOTE_WAKEUP.

When host enters the suspended state, the USB will be suspended as well. With this feature enabled, this state change is used to suspend the nRF Desktop device (see Power manager module). When the nRF Desktop device wakes up from standby, the USB state module will issue a wake-up request on the USB.

Note

The USB wake-up request is transmitted to the host only if the host enables this request before suspending the USB.

Implementation details

The USB state module registers the CONFIG_USB_HID_DEVICE_COUNT instances of HID-class USB device and initializes the USB subsystem.

The necessary callbacks are connected to the module to ensure that the state of the USB connection is tracked. From the application’s viewpoint, USB can be in the following states:

  • USB_STATE_DISCONNECTED - USB cable is not connected.

  • USB_STATE_POWERED - The device is powered from USB but is not configured for the communication.

  • USB_STATE_ACTIVE - The device is ready to exchange data with the host.

  • USB_STATE_SUSPENDED - The host has requested the device to enter the suspended state.

These states are broadcast by the USB state module with a usb_state_event. When the device is connected to the host and configured for the communication, the module will broadcast the USB_STATE_ACTIVE state. The module will also subscribe to all HID reports available in the application for the selected protocol.

When the device is disconnected from the host, the module will unsubscribe from receiving the HID reports.

When the HID report data is transmitted through hid_report_event, the module will pass it to the associated endpoint. Upon data delivery, hid_report_sent_event is submitted by the module.

Note

Only one report can be transmitted by the module to a single instance of HID-class USB device at any given time. Different instances can transmit reports in parallel.

The USB state module is a transport for Configuration channel when the channel is enabled.

The module also handles an HID keyboard LED output report received through USB from the connected host. The module sends the report using hid_report_event, that is handled either by HID state module (for peripheral) or by the HID forward module (for dongle).