Joy-Con 2 / Pro 2 / NSO GC2
Status: hardware-validated (Joy-Con 2 L; las demás variantes comparten el protocolo).
Los controles de segunda generación - Joy-Con 2 L/R, Pro Controller 2 y el NSO GameCube 2 - usan Bluetooth Low Energy, no HID sobre Bluetooth Classic. Son los únicos controles Nintendo aquí con magnetómetro, lo que habilita la fusión 9-DOF.
Hardware
Sección titulada «Hardware»| Componente | Parte | Rango / escala |
|---|---|---|
| IMU (6 ejes) | TDK InvenSense ICM-42670-P | gyro ≈ ±1994 dps (0.001062 rad/s por raw), accel ±8 g (4096 = 1 g) |
| Magnetómetro | Asahi Kasei AK09919 | 3 ejes, ±4900 µT, 16-bit (~0.15 µT de resolución) |
| Cargador de batería | TI bq25619 | |
| Amplificador de audio | MAX98388/89 |
El Joy-Con derecho también lleva un controlador NFC, que es irrelevante para el tracking.
Emparejamiento
Sección titulada «Emparejamiento»El “special handshake” que bloquea el diálogo de emparejamiento de Windows es una peculiaridad de UX, no criptografía. Conéctate directamente al control sin emparejar que está anunciándose - no lo emparejes a través de la configuración Bluetooth del sistema operativo. Las reconexiones rápidas bloquean la radio durante varios minutos, así que el driver respeta un backoff.
Filtro de advertisement
Sección titulada «Filtro de advertisement»- ID de fabricante Nintendo
0x0553. - Prefijo de manufacturer-data
01 00 03 7E(primeros 4 bytes). - El descubrimiento no debe condicionarse al byte 4 del advert (una conjetura
por variante no verificada que deja controles indescubribles). Cualquier advert
0553+01 00 03 7Ese trata como un dispositivo Switch 2; Izquierda/Derecha se resuelve a partir del USB PID escaneado en el advert.
Topología GATT
Sección titulada «Topología GATT»Servicio ab7de9be-89fe-49ad-828f-118f09df7fd0 (handle 0x0008):
| Rol | UUID | Handle |
|---|---|---|
Common input report (0x05) |
ab7de9be-89fe-49ad-828f-118f09df7fd2 |
0x000A |
Joy-Con L input (0x07) |
cc1bbbb5-7354-4d32-a716-a81cb241a32a |
0x000E |
Joy-Con R input (0x08) |
d5a9e01e-2ffc-4cca-b20c-8b67142bf442 |
0x000E |
Pro Controller 2 input (0x09) |
7492866c-ec3e-4619-8258-32755ffcc0f8 |
0x000E |
NSO GC2 input (0x0A) |
8261cba1-9435-420c-84d6-f0c75a2c8e4d |
0x000E |
| Write commands | 649d4ac9-8eb7-4e6c-af44-1ea54fe5f005 |
- |
| Output / rumble | 289326cb-a471-485d-a8f4-240c14f18241 |
0x0012 |
| Command response (notify) | c765a961-d9d8-4d36-a20a-5315b111836a |
- |
USB PIDs
Sección titulada «USB PIDs»| PID | Dispositivo |
|---|---|
2066 |
Joy-Con 2 Right |
2067 |
Joy-Con 2 Left |
2068 |
Joy-Con 2 Pair (grip mode) |
2069 |
Switch 2 Pro Controller |
2073 |
Switch 2 GameCube Controller |
Input report 0x05 (formato común de 62 bytes)
Sección titulada «Input report 0x05 (formato común de 62 bytes)»| Offset | Tamaño | Campo |
|---|---|---|
0x00 |
4 | Contador (uint32 LE, +1 por paquete - úsalo para detección de drops) |
0x04 |
4 | Bitfield de botones |
0x0A |
3 | Stick izquierdo (empaquetado 12-bit) |
0x0D |
3 | Stick derecho |
0x10 |
8 | Datos de mouse (solo Joy-Con) |
0x19 |
6 | Magnetómetro X/Y/Z (int16 LE, feature bit 7) |
0x1F |
2 | Voltaje de batería mV (uint16 LE) |
0x21 |
1 | Estado de carga (0x34 cargando, 0x20 lleno) |
0x22 |
2 | Corriente de batería (feature bit 5) |
0x2A |
18 | Bloque de movimiento (feature bit 2) |
0x3C |
1 | Trigger izquierdo (solo NSO GC2) |
0x3D |
1 | Trigger derecho (solo NSO GC2) |
Bloque de movimiento (0x2A)
Sección titulada «Bloque de movimiento (0x2A)»| Sub-offset | Abs | Tamaño | Campo |
|---|---|---|---|
| +0 | 0x2A |
4 | Timestamp de movimiento |
| +4 | 0x2E |
2 | Temperatura (25 + raw/127 °C) |
| +6 | 0x30 |
2 | Accel X (int16 LE, 4096 = 1 g) |
| +8 | 0x32 |
2 | Accel Y |
| +10 | 0x34 |
2 | Accel Z |
| +12 | 0x36 |
2 | Gyro X (int16 LE) |
| +14 | 0x38 |
2 | Gyro Y |
| +16 | 0x3A |
2 | Gyro Z |
La tasa efectiva del IMU es ~62 Hz (paquetes de 16 ms) en el common report.
Connection interval
Sección titulada «Connection interval»Estos controles nunca emiten un Connection Parameter Update Request - el host debe solicitar un intervalo corto. Un intervalo de host por defecto de ~60 ms limita el reporte a ~16.7 Hz; solicitar un intervalo optimizado para throughput (~5 ms) restaura la tasa completa. En Windows 11 el driver lo solicita justo después de conectar; en Linux el intervalo lo negocia el sistema, ajustado vía la configuración de Bluetooth. La ruta se degrada con elegancia - transmite al intervalo que el sistema operativo conceda en lugar de fallar.
Comandos
Sección titulada «Comandos»Se escriben en la característica de comando (WriteWithoutResponse, pad mínimo de
8 bytes). Header: CMD | 0x91 | 0x01 | SUBCMD | 0x00 | LEN | 0x00 | 0x00 | DATA…
| CMD | Propósito |
|---|---|
0x02 |
Lectura/escritura de flash (calibración de fábrica / usuario) |
0x03 |
Init (selección de input-report) |
0x06 |
Apagar / reiniciar |
0x09 |
Player LED |
0x0A |
Preset de vibración / sonido |
0x0B |
Consulta de batería |
0x0C |
Feature select (habilitar IMU / mag) |
0x15 |
NO USAR - escritura de persistencia de emparejamiento; la llamada equivocada puede brickear el emparejamiento |
Bitmask de features (CMD 0x0C, data byte 0)
Sección titulada «Bitmask de features (CMD 0x0C, data byte 0)»| Bit | Mask | Feature |
|---|---|---|
| 0 | 0x01 |
Estado de botones |
| 1 | 0x02 |
Sticks analógicos |
| 2 | 0x04 |
IMU (accel + gyro) |
| 4 | 0x10 |
Mouse (solo Joy-Con) |
| 5 | 0x20 |
Rumble + corriente de batería |
| 7 | 0x80 |
Magnetómetro (9-DOF) |
Secuencia canónica de habilitación:
0C 91 01 02 00 04 00 00 <mask> 00 00 00- fija el feature mask- espera 500 ms
0C 91 01 04 00 04 00 00 <mask> 00 00 00- activa las features
Masks: 0x04 IMU, 0x80 mag, 0xFF todo.
Mapa de memoria (CMD 0x02 lectura de flash)
Sección titulada «Mapa de memoria (CMD 0x02 lectura de flash)»| Dirección | Contenido |
|---|---|
0x13000-0x14FFF |
Bloque de datos de fábrica |
0x13002 |
Número de serie |
0x13012 |
USB product ID (id de variante autoritativo) |
0x13040 + 4/8/12 |
3 × float32 gyro bias |
0x13080 / 0x130C0 |
calibración de stick izquierdo / derecho |
0x13100 + 12/16/20 |
3 × float32 accel bias |
0x1FA000 |
Info de emparejamiento BLE (host + link key, hasta 2 hosts) |
0x1FD000 |
flag de shipment |
El chip aplica la calibración de fábrica del IMU internamente, así que no hay calibración consumible por el host para leer de cara al tracking - el estimador de rest-bias de la fusión lo cubre.
Convención de ejes
Sección titulada «Convención de ejes»Body frame (x, z, -y), gravedad +Z boca arriba. Las variantes standalone (sin
grip) agregan:
| Variante | Remap |
|---|---|
| Joy-Con 2 L | (x, y, z) → ( z, y, -x) (+90° sobre Y) |
| Joy-Con 2 R | (x, y, z) → (-z, y, x) (−90° sobre Y) |
El magnetómetro comparte el PCB del IMU, así que usa el mismo remap base.
Gestos de reset
Sección titulada «Gestos de reset»| Gesto | Bit | Acción |
|---|---|---|
| Home (corto) | byte 0x05, bit 0x10 |
Reset Yaw |
| Home (mantener ≥1 s) | byte 0x05, bit 0x10 (temporizado) |
Reset Full |
| Capture | byte 0x05, bit 0x20 |
Reset Yaw |
- Un bloque de movimiento de alta tasa aparte (reports
0x07-0x0A, 40 bytes) está encriptado e inutilizable sin una key derivada del emparejamiento, así que se usa el common report en texto plano0x05en su lugar. - La autocalibración basada en movimiento reestima el gyro bias cuando el control se mantiene quieto (nunca resta basada en quietud, lo que rompería la fusión).
- El periférico desaparece del scan BLE tras emparejarse; reinicia el adaptador si no se ve dentro de 30 s.