Joy-Con is the name for the Switch's primary game controllers. The Joy-Con are internally called Ukyo (Left) and Sakyo (Right).
Hardware
Ukyo
Component | Description |
---|---|
SoC | Broadcom BCM20734 |
IMU | STMicroelectronics LSM6DS3H |
PMIC | Texas Instruments BQ24072 |
Storage | Macronix International MX25U4033E 4 Mb CMOS Flash |
Sakyo
Component | Description |
---|---|
SoC | Broadcom BCM20734 |
MCU | STMicroelectronics STM32P411 |
NFC | STMicroelectronics ST21NFCB |
IMU | STMicroelectronics LSM6DS3H |
PMIC | Texas Instruments BQ24072 |
Storage | Macronix International MX25U4033E 4 Mb CMOS Flash |
Protocol
The Joy-Con can communicate wirelessly over Bluetooth or through the rails over UART. The latter uses a Nintendo proprietary protocol called "Nwcp".
NwcpPacket
Offset | Size | Description |
---|---|---|
0x0 | 0x5 | HciHeader |
0x5 | 0x7 | NwcpHeader |
0xC | Variable | Data |
HciHeader
This is a 5-byte packet header used by Broadcom's HCI Control Protocol.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | PacketType (always 0x19) |
0x1 | 0x1 | CommandCode |
0x2 | 0x1 | GroupCode (always 0x03) |
0x3 | 0x2 | PacketLength |
CommandCode
Value | Description |
---|---|
0x1 | SendToDevice |
0x81 | ReceiveFromDevice |
NwcpHeader
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | CommandType |
0x1 | 0x1 | DeviceCommand |
0x2 | 0x2 | DataSize |
0x4 | 0x1 | CommandResult |
0x5 | 0x1 | DataCrc (CRC8 over Data for DataSize bytes) |
0x6 | 0x1 | HeaderCrc (CRC8 over the previous 6 bytes) |
CommandType
Value | Description |
---|---|
0x91 | DeviceCommandIn |
0x92 | Hid |
0x93 | |
0x94 | DeviceCommandOut |
0x95 | |
0x9A | |
0xA3 | |
0xA5 | Handshake |
HidCommandInputReport
This is a 0x31-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | LatencyTimer |
0x2 | 0x1 | PowerInfo |
0x3 | 0x1 | RightPadButtonStatus |
0x4 | 0x1 | SharedButtonStatus |
0x5 | 0x1 | LeftPadButtonStatus |
0x6 | 0x3 | LeftAnalogStickData |
0x9 | 0x3 | RightAnalogStickData |
0xC | 0x1 | MotorStatus |
0xD | 0x1 | CommandAck |
0xE | 0x1 | CommandId |
0xF | 0x22 | CommandReply |
HidMcuUpdateInputReport
This is a 0x30-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | LatencyTimer |
0x2 | 0x1 | PowerInfo |
0x3 | 0x1 | RightPadButtonStatus |
0x4 | 0x1 | SharedButtonStatus |
0x5 | 0x1 | LeftPadButtonStatus |
0x6 | 0x3 | LeftAnalogStickData |
0x9 | 0x3 | RightAnalogStickData |
0xC | 0x1 | MotorStatus |
0xD | 0x23 | McuUpdateData |
HidBasicInputReport
This is a 0x31-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | LatencyTimer |
0x2 | 0x1 | PowerInfo |
0x3 | 0x1 | RightPadButtonStatus |
0x4 | 0x1 | SharedButtonStatus |
0x5 | 0x1 | LeftPadButtonStatus |
0x6 | 0x3 | LeftAnalogStickData |
0x9 | 0x3 | RightAnalogStickData |
0xC | 0x1 | MotorStatus |
0xD | 0x24 | BasicData |
HidMcuInputReport
This is a 0x16A-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | LatencyTimer |
0x2 | 0x1 | PowerInfo |
0x3 | 0x1 | RightPadButtonStatus |
0x4 | 0x1 | SharedButtonStatus |
0x5 | 0x1 | LeftPadButtonStatus |
0x6 | 0x3 | LeftAnalogStickData |
0x9 | 0x3 | RightAnalogStickData |
0xC | 0x1 | MotorStatus |
0xD | 0x6 | SensorAccelSample0 |
0x13 | 0x6 | SensorGyroSample0 |
0x19 | 0x6 | SensorAccelSample1 |
0x1F | 0x6 | SensorGyroSample1 |
0x25 | 0x6 | SensorAccelSample2 |
0x2B | 0x6 | SensorGyroSample2 |
0x31 | 0x139 | McuData |
HidAttachmentInputReport
This is a 0x16A-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | LatencyTimer |
0x2 | 0x1 | PowerInfo |
0x3 | 0x1 | RightPadButtonStatus |
0x4 | 0x1 | SharedButtonStatus |
0x5 | 0x1 | LeftPadButtonStatus |
0x6 | 0x3 | LeftAnalogStickData |
0x9 | 0x3 | RightAnalogStickData |
0xC | 0x1 | MotorStatus |
0xD | 0x6 | SensorAccelSample0 |
0x13 | 0x6 | SensorGyroSample0 |
0x19 | 0x6 | SensorAccelSample1 |
0x1F | 0x6 | SensorGyroSample1 |
0x25 | 0x6 | SensorAccelSample2 |
0x2B | 0x6 | SensorGyroSample2 |
0x31 | 0x139 | AttachmentData |
HidGenericInputReport
This is a 0xC-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x2 | ButtonStatus |
0x3 | 0x1 | StickHatData |
0x4 | 0x4 | LeftAnalogStickData |
0x8 | 0x4 | RightAnalogStickData |
HidCommandOutputReport
This is a 0x31-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | PacketNumber |
0x2 | 0x8 | MotorData |
0xA | 0x1 | CommandId |
0xB | 0x26 | CommandData |
HidMcuUpdateOutputReport
This is a 0x13E-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | PacketNumber |
0x2 | 0x8 | MotorData |
0xA | 0x134 | McuUpdateData |
HidBasicOutputReport
This is a 0xA-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | PacketNumber |
0x2 | 0x8 | MotorData |
HidMcuOutputReport
This is a 0x30-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | PacketNumber |
0x2 | 0x8 | MotorData |
0xA | 0x26 | McuData |
HidAttachmentOutputReport
This is a 0x30-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | ReportId |
0x1 | 0x1 | PacketNumber |
0x2 | 0x8 | MotorData |
0xA | 0x26 | AttachmentData |
HidReportId
Value | Description |
---|---|
0x01 | CommandOutputReport |
0x03 | McuUpdateOutputReport |
0x10 | BasicOutputReport |
0x11 | McuOutputReport |
0x12 | AttachmentOutputReport |
0x21 | CommandInputReport |
0x23 | McuUpdateInputReport |
0x30 | BasicInputReport |
0x31 | McuInputReport |
0x32 | AttachmentInputReport |
0x33 | |
0x3F | GenericInputReport |
0x70 | OtaEnableFwuReport |
0x71 | OtaSetupReadReport |
0x72 | OtaReadReport |
0x73 | OtaWriteReport |
0x74 | OtaEraseReport |
0x75 | OtaLaunchReport |
0x80 | ExtGripOutputReport |
0x81 | ExtGripInputReport |
0x82 |
DeviceCommand
Value | Description |
---|---|
0x01 | Inquiry |
0x02 | WriteChargerSettings |
0x03 | ReadChargerSettings |
0x04 | AttachmentEnable |
0x05 | IsAttachmentEnabled |
0x06 | GetBatteryVoltage |
0x07 | ReadWakeUpReason |
0x10 | CreateHidConnection |
0x11 | DisconnectHid |
0x12 | SetHidInterval |
0x13 | GetHidInterval |
0x18 | Pairing |
0x20 | UpdateUartBaudRate |
0x40 | Test |
HidCommand
Value | Description |
---|---|
0x01 | PairingOut |
0x02 | GetDeviceInfo |
0x03 | SetDataFormat |
0x04 | LRButtonDetection |
0x05 | Page |
0x06 | Reset |
0x07 | ClearPairingInfo |
0x08 | Shipment |
0x10 | SerialFlashRead |
0x11 | SerialFlashWrite |
0x12 | SerialFlashSectorErase |
0x20 | McuReset |
0x21 | McuWrite |
0x22 | McuResume |
0x24 | McuPollingEnable |
0x25 | McuPollingDisable |
0x28 | AttachmentWrite |
0x29 | AttachmentRead |
0x2A | AttachmentEnable |
0x2B | GetAttachmentInfo |
0x30 | SetIndicatorLed |
0x31 | GetIndicatorLed |
0x38 | SetNotificationLed |
0x40 | SensorSleep |
0x41 | SensorConfig |
0x42 | SensorWrite |
0x43 | SensorRead |
0x48 | MotorEnable |
0x50 | GetBatteryVoltage |
0x51 | WriteChargeSetting |
0x52 | ReadChargeSetting |
0x58 | ExtDevWrite |
0x59 | GetExtDevInfo |
0x5A | ExtDevPollingEnable |
0x5B | ExtDevPollingDisable |
0x5C | ExtDevInFormatConfig |
0x5D | |
0x60 | InternalAttachmentWrite |
0x61 | |
0x62 | InternalAttachmentEnable |
0x63 | InternalAttachmentPollingEnable |
0x64 | InternalAttachmentPollingDisable |
0x7A | AddButtonPlayData |
0x7B | StartStopButtonPlayData |
0x80 | Ack |
0x81 | PairingIn |
0x82 | DeviceInfo |
0x83 | LRButtonElapsedTime |
0x90 | SerialFlashData |
0xA0 | McuData |
0xA8 | AttachmentData |
0xA9 | AttachmentInfo |
0xAA | InternalAttachmentRead |
0xB0 | IndicatorLed |
0xC0 | SensorData |
0xD0 | BatteryVoltage |
0xD8 | ExtDevRead |
0xD9 | ExtDevInfo |
ExtGripCommand
Value | Description |
---|---|
0x01 | Inquiry |
0x02 | CreateHidConnection |
0x03 | DeleteHidConnection |
0x04 | StartHidData |
0x05 | StopHidData |
0x06 | |
0x07 | GetFirmwareVersion |
0x08 | |
0x91 | LoopbackTest |
0x92 | |
0xA0 | SetUartClockTrim |
Firmware
The firmware is stored inside the flash in Broadcom's PatchRAM format as follows:
Offset | Size | Description |
---|---|---|
0x0 | 0x1000 | PatchramConfiguration |
0x1000 | 0x1000 | OtaFailsafeSection |
0x2000 | 0x1000 | PairingInfo |
0x5000 | 0x1000 | ShipmentInfo |
0x6000 | 0x1000 | FactoryConfiguration |
0x8000 | 0x1000 | UserCalibration |
0x10000 | 0x18000 | OtaDynamicSection1 |
0x28000 | 0x18000 | OtaDynamicSection2 |
OtaFailsafeSection
Offset | Size | Description |
---|---|---|
0x0 | 0xFF4 | Reserved |
0xFF4 | 0x8 | Signature |
0xFFC | 0x4 | Ds2Offset |
ShipmentInfo
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | Shipment |
0x1 | 0xFFF | Reserved |
FactoryConfiguration
Offset | Size | Description |
---|---|---|
0x0 | 0x10 | IdentificationCode |
0x12 | 0x1 | Type |
0x1B | 0x1 | FormatVersion |
0x20 | 0x18 | Cal1 |
0x3D | 0x12 | Cal2 |
0x4F | 0x1 | Reserved |
0x50 | 0xD | Design |
0x80 | 0x18 | Model1 |
0x98 | 0x12 | Model2 |
0xAA | 0xF56 | Reserved |
Type
Value | Description |
---|---|
0x01 | JoyLeft |
0x02 | JoyRight |
0x03 | SwitchProController |
0x04 | (DeviceType 4) |
0x05 | (DeviceType 5) |
0x06 | Tarragon (DeviceType 6) |
0x07 | LarkHvc1 |
0x08 | LarkHvc2 |
0x09 | LarkNesLeft |
0x0A | LarkNesRight |
0x0B | Lucia |
0x0C | [12.0.0+] Lagon |
0x0D | [13.0.0+] Lager |
0x0E | [14.0.0+] (DeviceType 30) |
0x21 | FiftyLeft (DeviceType 14) |
0x22 | FiftyRight (DeviceType 18) |
Cal1
Offset | Size | Description |
---|---|---|
0x0 | 0x18 | SixAxisSensorCalibrationValue |
Cal2
Offset | Size | Description |
---|---|---|
0x0 | 0x9 | LeftAnalogStickCalibrationValue |
0x9 | 0x9 | RightAnalogStickCalibrationValue |
Design
Offset | Size | Description |
---|---|---|
0x0 | 0xC | ControllerColor |
0xC | 0x1 | DesignVariation |
ControllerColor
Offset | Size | Description |
---|---|---|
0x0 | 0x3 | Body color of controller in RGB Hex (see Joy-Con Colors) |
0x3 | 0x3 | Button color of controller in RGB Hex (see Joy-Con Colors) |
0x6 | 0x3 | Left grip color of controller in RGB Hex |
0x9 | 0x3 | Right grip color of controller in RGB Hex |
DesignVariation
Value | Name |
---|---|
0x0 | LuciaJ, LagerJ |
0x1 | LuciaE, LagerE |
0x2 | LuciaU, LagerU |
Model1
Offset | Size | Description |
---|---|---|
0x0 | 0x6 | SensorData |
0x6 | 0x12 | AnalogStickModuleParam |
Model2
Offset | Size | Description |
---|---|---|
0x0 | 0x12 | AnalogStickModuleParam |
UserCalibration
Offset | Size | Description |
---|---|---|
0x10 | 0x18 | UserCal1 |
0x28 | 0x18 | UserCal2 |
0x40 | 0xFC0 | Reserved |
UserCal1
Offset | Size | Description |
---|---|---|
0x0 | 0x2 | UserCalMagicNumber |
0x2 | 0x9 | LeftAnalogStickCalibrationValue |
0xB | 0x2 | UserCalMagicNumber |
0xD | 0x9 | RightAnalogStickCalibrationValue |
0x16 | 0x2 | UserCalMagicNumber |
UserCal2
Offset | Size | Description |
---|---|---|
0x0 | 0x18 | SixAxisSensorCalibrationValue |
Colors
HEX codes for the colors shown in the "Controllers" menu of the Switch UI can be found in a Joy-con SPI dump starting at offset 0x6050. Body color is first followed by button color and each is 3 bytes long. These values are able to be re-written with any HEX color value to make the Joy-cons show up as different colors in the UI. The following is a list of official HEX colors recovered from SPI dumps.
Developer Kit Joy-Con | Release | Body HEX | Button HEX |
---|---|---|---|
Black / ブラック | 2015.10.16 | #313131 | #0F0F0F |
Standard Retail Joy-Con Color | Release | Body HEX | Button HEX |
Gray / グレー | 2017.03.03 | #828282 | #0F0F0F |
Neon Red / ネオンレッド | 2017.03.03 | #FF3C28 | #1E0A0A |
Neon Blue / ネオンブルー | 2017.03.03 | #0AB9E6 | #001E1E |
Neon Yellow / ネオンイエロー | 2017.06.16 | #E6FF00 | #142800 |
Neon Green / ネオングリーン | 2017.07.21 | #1EDC00 | #002800 |
Neon Pink / ネオンピンク | 2017.07.21 | #FF3278 | #28001E |
Red / レッド | 2017.10.27 | #E10F00 | #280A0A |
Blue / ブルー | 2019.10.04 | #4655F5 | #00000A |
Neon Purple / ネオンパープル | 2019.10.04 | #B400E6 | #140014 |
Neon Orange / ネオンオレンジ | 2019.10.04 | #FAA005 | #0F0A00 |
White / ホワイト | 2021.10.08 | #E6E6E6 | #323232 |
Pastel Pink / パステルピンク | 2023.06.30 | #FFAFAF | #372D2D |
Pastel Yellow / パステルイエロー | 2023.06.30 | #F5FF82 | #32332D |
Pastel Purple / パステルパープル | 2023.06.30 | #F0CBEB | #373037 |
Pastel Green / パステルグリーン | 2023.06.30 | #BCFFC8 | #2D322D |
Special Edition Joy-Con Color | Release | Body HEX | Button HEX |
Nintendo Switch Gray Joy-Con / Nintendo Switch グレー | 2017.03.03 | #828282 | #0F0F0F |
Nintendo Switch Neon-Blue Left Joy-Con / Nintendo Switch ネオンブルー・ネオンレッド | 2017.03.03 | #0AB9E6 | #001E1E |
Nintendo Switch Neon-Red Right Joy-Con / Nintendo Switch ネオンブルー・ネオンレッド | 2017.03.03 | #FF3C28 | #1E0A0A |
Splatoon 2 Edition Neon-Green Left Joy-Con / スプラトゥーン2 | 2017.07.21 | #1EDC00 | #002800 |
Splatoon 2 Edition Neon-Pink Right Joy-Con / スプラトゥーン2 | 2017.07.21 | #FF3278 | #28001E |
Super Mario Odyssey Edition Red Joy-Con / スーパーマリオ オデッセイ | 2017.10.27 | #E10F00 | #280A0A |
Super Smash Bros. Ultimate Edition Gray Joy-Con / 大乱闘スマッシュブラザーズ | 2018.11.02 | #828282 | #0F0F0F |
Pokémon: Let's Go! Edition Eevee-Brown Left Joy-Con / ポケットモンスター Let's Go! イーブイ | 2018.11.16 | #C88C32 | #281900 |
Pokémon: Let's Go! Edition Pikachu-Yellow Right Joy-Con / ポケットモンスター Let's Go! ピカチュウ | 2018.11.16 | #FFDC00 | #322800 |
*Nintendo Labo Creators Contest Edition "Cardboard"-Colored Joy-Con | 2018. (...?) | #D7AA73 | #1E1914 |
**Dragon Quest XI S Lotto Edition Royal-Blue Joy-Con / ドラゴン クエスト XI S (ロト版) | 2019.09.27 | #1473FA | #00000F |
**Disney Tsum Tsum Festival Edition Neon-Purple Left Joy-Con / ディズニー ツムツム フェスティバル | 2019.10.10 | #B400E6 | #140014 |
**Disney Tsum Tsum Festival Edition Neon-Pink Right Joy-Con / ディズニー ツムツム フェスティバル | 2019.10.10 | #FF3278 | #28001E |
Animal Crossing: New Horizons Edition Pastel-Green Left Joy-Con / あつまれ どうぶつの森 | 2020.03.13 | #82FF96 | #0A1E0A |
Animal Crossing: New Horizons Edition Pastel-Blue Right Joy-Con / あつまれ どうぶつの森 | 2020.03.13 | #96F5F5 | #0A1E28 |
Fortnite Wildcat Edition Yellow Left Joy-Con / フォートナイト ワイルドキャット(山猫) | 2020.10.30 | #FFCC00 | #1A1100 |
Fortnite Wildcat Edition Dark-Blue Right Joy-Con / フォートナイト ワイルドキャット(山猫) | 2020.10.30 | #0084FF | #000F1E |
Mario Red × Blue Edition Red Joy-Con / マリオ レッド × ブルー | 2021.02.12 | #F04614 | #1E1914 |
Monster Hunter Rise Edition Gray Joy-Con / モンスターハンターライズ | 2021.03.26 | #818282 | #0E0F0F |
Fortnite Fleet Force Edition Dark-Blue Left Joy-Con / フォートナイト フリート フォース(力の艦隊) | 2021.06.04 | #0084FF | #000F1E |
Fortnite Fleet Force Edition Yellow Right Joy-Con / フォートナイト フリート フォース(力の艦隊) | 2021.06.04 | #FFCC00 | #1A1100 |
Legend of Zelda: Skyward Sword Edition Dark-Blue Left Joy-Con / ゼルダの伝説 スカイウォードソード | 2021.07.16 | #2D50F0 | #1E0F46 |
Legend of Zelda: Skyward Sword Edition Dark-Purple Right Joy-Con / ゼルダの伝説 スカイウォードソード | 2021.07.16 | #500FC8 | #00051E |
Nintendo Switch OLED Edition White Joy-Con / Nintendo Switch (有機ELモデル) ホワイト | 2021.10.08 | #E6E6E6 | #323232 |
Splatoon 3 OLED Edition Blue-Gradient Left Joy-Con / (有機ELモデル) スプラトゥーン3 | 2022.08.26 | #6455F5 | #28282D |
Splatoon 3 OLED Edition Neon-Yellow-Gradient Right Joy-Con / (有機ELモデル) スプラトゥーン3 | 2022.08.26 | #C3FA05 | #1E1E28 |
Pokémon: Scarlet × Violet OLED Edition Scarlet Left Joy-Con / (有機ELモデル) ポケットモンスター スカーレット・バイオレット | 2022.11.04 | #F07341 | #322D1E |
Pokémon: Scarlet × Violet OLED Edition Violet Right Joy-Con / (有機ELモデル) ポケットモンスター スカーレット・バイオレット | 2022.11.04 | #9650AA | #32322D |
Legend of Zelda: Tears of the Kingdom Edition Gold Joy-Con / (有機ELモデル) ゼルダの伝説 ティアーズ オブ ザ キングダム | 2023.04.28 | #D2BE69 | #32322D |
// *(Prize Awarded for Labo Contest - No Retail) // **(Available Japan Only) |