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.