Skip to main content
The Wii Remote (Wiimote) communicates with the Wii console (and Dolphin) via Bluetooth using the HID (Human Interface Device) protocol. This document details the Bluetooth communication protocol based on actual packet captures.

Device Information

Device Name: Nintendo RVL-CNT-01
Device Type: Bluetooth HID device
Bluetooth Profile: HID (0x1124)
Profile Version: 0x100

Bluetooth Connection Process

Discovery and Inquiry

The Wiimote must first be discovered through Bluetooth inquiry:
During inquiry, the Wiimote continues to send periodic button state updates even before connection is established.

Connection Establishment

Once discovered, establish connection using the Wiimote’s Bluetooth address:

Feature Discovery

After connection, query device features:

Device Naming

L2CAP Channels

The Wiimote uses L2CAP (Logical Link Control and Adaptation Protocol) for data communication.

Channel Establishment

SDP Channel (PSM 1) - Service Discovery:
HID Control Channel (PSM 0x11):
HID Interrupt Channel (PSM 0x13):

Channel Configuration

After connection, configure channel parameters:
The Wiimote uses an MTU (Maximum Transmission Unit) of 185 bytes for L2CAP communication.

Service Discovery Protocol (SDP)

The Wiimote exposes two SDP service records:

Service Record 0x10000 (HID Service)

HID-Specific Attributes:

Service Record 0x10001 (PnP Information)

Attributes:

HID Descriptor

The Wiimote’s HID descriptor (attribute 0x0206) defines its report structure:

Report IDs

The descriptor defines multiple report types: Output Reports (0x91): Input Reports (0x81):

Data Communication

The Wiimote continuously sends button state updates through the HID interrupt channel:

Button State Packet Format

Example button states:
  • a1 30 00 10 - Button 1 pressed
  • a1 30 00 00 - No buttons pressed
  • a1 30 10 00 - Button 2 pressed
The Wiimote sends button state updates continuously, even when no buttons are pressed, to maintain connection and provide real-time input.

Connection Teardown

Disconnect L2CAP Channel

Packet Flow Control

Bluetooth uses flow control to manage packet transmission:
This event indicates that 2 packets have been successfully transmitted and the host can send more data.

Implementation Notes for Dolphin

Connection Handling

  1. Perform Bluetooth inquiry to discover Wiimote
  2. Create ACL connection to Wiimote’s Bluetooth address
  3. Query device features and set link policy
  4. Establish L2CAP channels for SDP, HID control, and HID interrupt
  5. Parse HID descriptor to understand report formats

Data Reception

  1. Listen on HID interrupt channel (PSM 0x13)
  2. Parse report ID to determine data format
  3. Extract button states, accelerometer data, IR data, extension data
  4. Update emulated Wiimote state

Timing Considerations

  • Wiimote sends updates approximately every 5-10ms
  • ACL packet fragmentation occurs for larger reports
  • Flow control events must be respected to avoid packet loss
When implementing Wiimote emulation, ensure proper handling of ACL packet fragmentation (flags 0x02 for first packet, 0x01 for continuation) to correctly reassemble L2CAP frames.

Reference Materials

The Wiimote uses standard Bluetooth HID protocols defined in:
  • Bluetooth Core Specification
  • HID Profile Specification v1.0
  • USB HID Usage Tables
For complete protocol details, refer to HID_SPEC_V10.rar in the source documentation.