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.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/dolphin-emu/dolphin/llms.txt
Use this file to discover all available pages before exploring further.
Device Information
Device Name:Nintendo RVL-CNT-01Device 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:Link Policy Configuration
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: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 Service Details
HID Service Details
| Attribute ID | Type | Value | Description |
|---|---|---|---|
| 0x0200 | uint | 0x100 | HID Parser Version |
| 0x0201 | uint | 0x111 | Device Subclass |
| 0x0202 | uint | 0x4 | Country Code |
| 0x0203 | uint | 0x33 | Virtual Cable |
| 0x0204 | bool | 0x0 | Reconnect Initiate |
| 0x0205 | bool | 0x1 | Normally Connectable |
| 0x0206 | data | (HID descriptor) | HID Descriptor List |
| 0x0207 | data | 0x409, 0x100 | Language ID Base List |
| 0x0208 | bool | 0x0 | SDP Disable |
| 0x0209 | bool | 0x1 | Battery Power |
| 0x020a | bool | 0x1 | Remote Wake |
| 0x020b | uint | 0x100 | Profile Version |
| 0x020c | uint | 0xc80 | Supervision Timeout |
| 0x020d | bool | 0x0 | Normally Connectable |
| 0x020e | bool | 0x0 | Boot Device |
Service Record 0x10001 (PnP Information)
PnP Service Details
PnP Service Details
| Attribute ID | Type | Value |
|---|---|---|
| 0x0200 | uint | 0x100 |
| 0x0201 | uint | 0x57e |
| 0x0202 | uint | 0x306 |
| 0x0203 | uint | 0x600 |
| 0x0204 | bool | 0x1 |
| 0x0205 | uint | 0x2 |
HID Descriptor
The Wiimote’s HID descriptor (attribute 0x0206) defines its report structure:Report IDs
The descriptor defines multiple report types: Output Reports (0x91):| Report ID | Size | Description |
|---|---|---|
| 0x10 | 1 byte | Command |
| 0x11 | 1 byte | Command |
| 0x12 | 2 bytes | Command |
| 0x13 | 1 byte | Command |
| 0x14 | 1 byte | Command |
| 0x15 | 1 byte | Command |
| 0x16 | 21 bytes | Command |
| 0x17 | 6 bytes | Command |
| 0x18 | 21 bytes | Command |
| 0x19 | 1 byte | Command |
| 0x1a | 1 byte | Command |
| Report ID | Size | Description |
|---|---|---|
| 0x20 | 6 bytes | Core buttons |
| 0x21 | 21 bytes | Core buttons + accelerometer |
| 0x22 | 4 bytes | Core buttons (IR basic) |
| 0x30 | 2 bytes | Core buttons |
| 0x31 | 5 bytes | Core buttons + accelerometer |
| 0x32 | 10 bytes | Core buttons + 8 extension bytes |
| 0x33 | 17 bytes | Core buttons + accelerometer + 12 IR bytes |
| 0x34 | 21 bytes | Core buttons + 19 extension bytes |
| 0x35 | 21 bytes | Core buttons + accelerometer + 16 extension bytes |
| 0x36 | 21 bytes | Core buttons + 10 IR bytes + 9 extension bytes |
| 0x37 | 21 bytes | Core buttons + accelerometer + 10 IR bytes + 6 extension bytes |
| 0x3d | 21 bytes | Extension only |
| 0x3e | 21 bytes | Interleaved core buttons + accelerometer |
| 0x3f | 21 bytes | Interleaved core buttons + accelerometer + IR |
Data Communication
The Wiimote continuously sends button state updates through the HID interrupt channel:Button State Packet Format
a1 30 00 10- Button 1 presseda1 30 00 00- No buttons presseda1 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
Disconnect ACL Link
Packet Flow Control
Bluetooth uses flow control to manage packet transmission:Implementation Notes for Dolphin
Connection Handling
- Perform Bluetooth inquiry to discover Wiimote
- Create ACL connection to Wiimote’s Bluetooth address
- Query device features and set link policy
- Establish L2CAP channels for SDP, HID control, and HID interrupt
- Parse HID descriptor to understand report formats
Data Reception
- Listen on HID interrupt channel (PSM 0x13)
- Parse report ID to determine data format
- Extract button states, accelerometer data, IR data, extension data
- 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
Reference Materials
The Wiimote uses standard Bluetooth HID protocols defined in:- Bluetooth Core Specification
- HID Profile Specification v1.0
- USB HID Usage Tables
HID_SPEC_V10.rar in the source documentation.