NodeLoop
HID Report Descriptor Visualizer & Builder

HID Report Descriptor Visualizer & Builder (USB HID Tool)

The missing bridge between raw HID hex dumps and working firmware. Decode any descriptor, edit it visually, and export ready-to-use arrays for TinyUSB or STM32.

Templates

Start from a known-good HID descriptor and customize it.

HEX → Visual

Paste bytes to decode.

Paste HEX bytes, C arrays, or dumps like 0x05, 0x01, 0x09, 0x06. Default: HEX bytes (00FF), with or without 0x (e.g. 05 01 09 06 A1 01). Use d:10 for explicit decimal bytes (and 3-digit numbers like 128 are treated as decimal).

Visual → Code

Structure Builder

Click any item to edit its value or flags. Move items to shape the report.

Live Explanation

Report Summary

Frictionless handoff

Share & export

Share a permalink for reviews, paste a Markdown summary into a ticket, or export a header file for firmware.

Email this export (PDF + share link).

Quick Start

1

Paste a hex/C dump in “HEX → Visual”.

2

Edit items (Usage Page, Usage, Report Size/Count, Input flags).

3

Validate size in “Report Summary” (bytes per report ID).

4

Export HEX/C/TinyUSB/STM32 and paste into firmware.

What This Tool Teaches

  • Usage Page / Usage: how the host interprets fields.
  • Collections: how reports are grouped (Application/Physical).
  • Size math: Report Size × Report Count = bits on the wire.
  • Flags: Data vs Constant, Variable vs Array, Absolute vs Relative.

The “Live Explanation” panel decodes every change into plain English.

Common Use Cases

  • Custom keyboards (6KRO / NKRO), macro pads.
  • Mice (buttons + wheel), trackballs.
  • Joysticks/gamepads (axes + buttons).
  • Media keys (Consumer Control).
  • Vendor-specific sensors and instruments.

FAQ

What is a HID report descriptor (and why is it so painful)?

A HID report descriptor is a compact bytecode that describes the structure of the data your device sends/receives (buttons, axes, keys, LEDs, etc.). It's painful because it's terse, stateful, and most people debug it by copying hex without understanding.

I pasted a hex dump. How do I know it decodes correctly?

This tool parses short items, reconstructs the item stream, and shows the interpreted tags (Usage Page, Usage, Collection, Report Size/Count, Input/Output/Feature). If the byte stream is truncated or invalid, it reports an error instead of guessing.

Why does the Report Summary say my report is bigger than expected?

Most size bugs come from a mismatch between Report Size and Report Count. HID sizes are in bits, and padding fields (Constant) also count. The summary is computed from Report Size × Report Count for each Input/Output/Feature item per Report ID.

What's the difference between Array and Variable for keyboard inputs?

Array is typically used for keycode arrays (like 6KRO: 6 bytes of keycodes). Variable is used for independent bitfields (like modifier keys or NKRO bitmaps). Picking the wrong one often breaks host interpretation.

Do I need Report ID?

Only if your device exposes multiple reports (or multiple top-level Application Collections) that need distinct layouts. Report ID adds a leading byte to the report payload and must match what your firmware and host code expect.

Is this tool compatible with TinyUSB?

The tool exports a byte array you can paste into TinyUSB as a report descriptor. You still need to ensure your interface descriptors and report sizes match your device class configuration.

Is this tool compatible with STM32 USB Device (Cube) HID?

It exports a C array snippet compatible with STM32-style HID report descriptor storage. You must also set the correct report IN/OUT sizes in the rest of your USB stack.

Can this tool validate my entire USB descriptor set?

Not yet. V1 focuses on HID report descriptors (the part everyone struggles to read). Full USB device/config/interface descriptor tooling can come later.

Related tools