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
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
|
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
|
0x00 |
0x1000 |
PatchramConfiguration
|
0x1000 |
0x1000 |
OtaFailsafeSection
|
0x2000 |
0x1000 |
PairingInfo
|
0x5000 |
0x1 |
Shipment
|
0x6000 |
0x1000 |
FactoryConfiguration
|
0x8000 |
0x1000 |
UserCalibration
|
0x10000 |
0x18000 |
OtaDynamicSection1
|
0x28000 |
0x18000 |
OtaDynamicSection2
|
OtaFailsafeSection
Offset
|
Size
|
Description
|
0x00 |
0xFF4 |
Reserved
|
0xFF4 |
0x8 |
Signature
|
0xFFC |
0x4 |
Ds2Offset
|
FactoryConfiguration
Offset
|
Size
|
Description
|
0x00 |
0x10 |
IdentificationCode
|
0x12 |
0x01 |
Type
|
0x1B |
0x01 |
FormatVersion
|
0x20 |
0x18 |
Cal1
|
0x3D |
0x12 |
Cal2
|
0x4F |
0x01 |
Reserved
|
0x50 |
0x0D |
Design
|
0x80 |
0x18 |
Model1
|
0x98 |
0x12 |
Model2
|
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
|
0x00 |
0x18 |
SixAxisSensorCalibrationValue
|
Cal2
Offset
|
Size
|
Description
|
0x00 |
0x09 |
LeftAnalogStickCalibrationValue
|
0x09 |
0x09 |
RightAnalogStickCalibrationValue
|
Design
ControllerColor
Offset
|
Size
|
Description
|
0x00 |
0x03 |
Body color of controller in RGB Hex (see Joy-Con Colors)
|
0x03 |
0x03 |
Button color of controller in RGB Hex (see Joy-Con Colors)
|
0x06 |
0x03 |
Left grip color of controller in RGB Hex
|
0x09 |
0x03 |
Right grip color of controller in RGB Hex
|
DesignVariation
Value
|
Name
|
0x00 |
LuciaJ, LagerJ
|
0x01 |
LuciaE, LagerE
|
0x02 |
LuciaU, LagerU
|
Model1
Offset
|
Size
|
Description
|
0x00 |
0x06 |
SensorData
|
0x06 |
0x12 |
AnalogStickModuleParam
|
Model2
Offset
|
Size
|
Description
|
0x00 |
0x12 |
AnalogStickModuleParam
|
UserCalibration
UserCal1
Offset
|
Size
|
Description
|
0x00 |
0x02 |
UserCalMagicNumber
|
0x02 |
0x09 |
LeftAnalogStickCalibrationValue
|
0x0B |
0x02 |
UserCalMagicNumber
|
0x0D |
0x09 |
RightAnalogStickCalibrationValue
|
0x16 |
0x02 |
UserCalMagicNumber
|
UserCal2
Offset
|
Size
|
Description
|
0x00 |
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)
|