Ir al contenido

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.

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.

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.

  • 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 7E se trata como un dispositivo Switch 2; Izquierda/Derecha se resuelve a partir del USB PID escaneado en el advert.

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 -
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)
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.

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.

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
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:

  1. 0C 91 01 02 00 04 00 00 <mask> 00 00 00 - fija el feature mask
  2. espera 500 ms
  3. 0C 91 01 04 00 04 00 00 <mask> 00 00 00 - activa las features

Masks: 0x04 IMU, 0x80 mag, 0xFF todo.

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.

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.

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 plano 0x05 en 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.