Difference between revisions of "Joy-Con"
AveSatanas (talk | contribs) (Copy JC pinout information from https://reswitched.tech/hardware/joycon) |
(Joy-Con codenames were reversed, can confirm this with prototype board labels and also Japanese history) |
||
(51 intermediate revisions by 11 users not shown) | |||
Line 1: | Line 1: | ||
− | Joy-Con is the name for the Switch's primary game controllers. The | + | Joy-Con is the name for the Switch's primary game controllers. The Joy-Con are internally called Sakyo (Left) and Ukyo (Right). |
− | == | + | = Hardware = |
− | + | == Sakyo == | |
− | |||
− | |||
{| class="wikitable" | {| class="wikitable" | ||
− | ! | + | ! Component || Description |
|- | |- | ||
− | | | + | | SoC || Broadcom BCM20734 |
|- | |- | ||
− | | | + | | IMU || STMicroelectronics LSM6DS3H |
|- | |- | ||
− | | | + | | PMIC || Texas Instruments BQ24072 |
+ | |- | ||
+ | | Storage || Macronix International MX25U4033E 4 Mb CMOS Flash | ||
+ | |} | ||
+ | |||
+ | == Ukyo == | ||
+ | {| class="wikitable" | ||
+ | ! 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 == | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x5 | ||
+ | | [[#HciHeader|HciHeader]] | ||
+ | |- | ||
+ | | 0x5 | ||
+ | | 0x7 | ||
+ | | [[#NwcpHeader|NwcpHeader]] | ||
+ | |- | ||
+ | | 0xC | ||
+ | | Variable | ||
+ | | Data | ||
+ | |} | ||
+ | |||
+ | === HciHeader === | ||
+ | This is a 5-byte packet header used by Broadcom's HCI Control Protocol. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | PacketType (always 0x19) | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | [[#CommandCode|CommandCode]] | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x1 | ||
+ | | GroupCode (always 0x03) | ||
+ | |- | ||
+ | | 0x3 | ||
+ | | 0x2 | ||
+ | | PacketLength | ||
+ | |} | ||
+ | |||
+ | ==== CommandCode ==== | ||
+ | {| class="wikitable" border="1" | ||
+ | ! Value | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x1 || SendToDevice | ||
+ | |- | ||
+ | | 0x81 || ReceiveFromDevice | ||
+ | |} | ||
+ | |||
+ | === NwcpHeader === | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#CommandType|CommandType]] | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | [[#DeviceCommand|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 ==== | ||
+ | {| class="wikitable" border="1" | ||
+ | ! Value | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x91 || DeviceCommandIn | ||
+ | |- | ||
+ | | 0x92 || Hid | ||
+ | |- | ||
+ | | 0x93 || | ||
+ | |- | ||
+ | | 0x94 || DeviceCommandOut | ||
+ | |- | ||
+ | | 0x95 || | ||
+ | |- | ||
+ | | 0x9A || | ||
+ | |- | ||
+ | | 0xA3 || | ||
+ | |- | ||
+ | | 0xA5 || Handshake | ||
+ | |} | ||
+ | |||
+ | == HidCommandInputReport == | ||
+ | This is a 0x31-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|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 | ||
+ | | [[#HidCommand|CommandId]] | ||
+ | |- | ||
+ | | 0xF | ||
+ | | 0x22 | ||
+ | | CommandReply | ||
+ | |} | ||
+ | |||
+ | == HidMcuUpdateInputReport == | ||
+ | This is a 0x30-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|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. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|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. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|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. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|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. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|ReportId]] | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x2 | ||
+ | | ButtonStatus | ||
+ | |- | ||
+ | | 0x3 | ||
+ | | 0x1 | ||
+ | | StickHatData | ||
+ | |- | ||
+ | | 0x4 | ||
+ | | 0x4 | ||
+ | | LeftAnalogStickData | ||
+ | |- | ||
+ | | 0x8 | ||
+ | | 0x4 | ||
+ | | RightAnalogStickData | ||
+ | |} | ||
+ | |||
+ | == HidCommandOutputReport == | ||
+ | This is a 0x31-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|ReportId]] | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | PacketNumber | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x8 | ||
+ | | MotorData | ||
+ | |- | ||
+ | | 0xA | ||
+ | | 0x1 | ||
+ | | [[#HidCommand|CommandId]] | ||
+ | |- | ||
+ | | 0xB | ||
+ | | 0x26 | ||
+ | | CommandData | ||
+ | |} | ||
+ | |||
+ | == HidMcuUpdateOutputReport == | ||
+ | This is a 0x13E-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|ReportId]] | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | PacketNumber | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x8 | ||
+ | | MotorData | ||
+ | |- | ||
+ | | 0xA | ||
+ | | 0x134 | ||
+ | | McuUpdateData | ||
+ | |} | ||
+ | |||
+ | == HidBasicOutputReport == | ||
+ | This is a 0xA-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|ReportId]] | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | PacketNumber | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x8 | ||
+ | | MotorData | ||
+ | |} | ||
+ | |||
+ | == HidMcuOutputReport == | ||
+ | This is a 0x30-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|ReportId]] | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | PacketNumber | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x8 | ||
+ | | MotorData | ||
+ | |- | ||
+ | | 0xA | ||
+ | | 0x26 | ||
+ | | McuData | ||
+ | |} | ||
+ | |||
+ | == HidAttachmentOutputReport == | ||
+ | This is a 0x30-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#HidReportId|ReportId]] | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | PacketNumber | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x8 | ||
+ | | MotorData | ||
+ | |- | ||
+ | | 0xA | ||
+ | | 0x26 | ||
+ | | AttachmentData | ||
+ | |} | ||
+ | |||
+ | == HidReportId == | ||
+ | {| class="wikitable" border="1" | ||
+ | ! 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 == | ||
+ | {| class="wikitable" border="1" | ||
+ | ! 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 == | ||
+ | {| class="wikitable" border="1" | ||
+ | ! 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 == | ||
+ | {| class="wikitable" border="1" | ||
+ | ! 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: | ||
− | {| class="wikitable" | + | {| class="wikitable" border="1" |
− | ! | + | |- |
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 || 0x1000 || StaticSection | ||
+ | |- | ||
+ | | 0x1000 || 0x1000 || [[#FailsafeSection|FailsafeSection]] | ||
|- | |- | ||
− | | | + | | 0x2000 || 0x1000 || [[#VolatileSection|VolatileSection]] |
|- | |- | ||
− | | | + | | 0x3000 || 0x1000 || VolatileSectionBackup1 |
|- | |- | ||
− | | | + | | 0x4000 || 0x1000 || VolatileSectionBackup2 |
|- | |- | ||
− | | | + | | 0x5000 || 0x1000 || [[#ShipmentInfo|ShipmentInfo]] |
|- | |- | ||
− | | | + | | 0x6000 || 0x1000 || [[#FactoryConfiguration|FactoryConfiguration]] |
|- | |- | ||
− | | | + | | 0x8000 || 0x1000 || [[#UserCalibration|UserCalibration]] |
|- | |- | ||
− | | | + | | 0x9000 || 0x7000 || Reserved |
|- | |- | ||
− | | | + | | 0x10000 || 0x18000 || DynamicSection1 |
|- | |- | ||
− | | | + | | 0x28000 || 0x18000 || DynamicSection2 |
|- | |- | ||
− | | | + | | 0x40000 || 0x40000 || Reserved |
|} | |} | ||
− | + | == FailsafeSection == | |
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 || 0xFF4 || Reserved | ||
+ | |- | ||
+ | | 0xFF4 || 0x8 || Signature | ||
+ | |- | ||
+ | | 0xFFC || 0x4 || Ds2Offset | ||
+ | |} | ||
− | == | + | == VolatileSection == |
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 || 0x26 || | ||
+ | |- | ||
+ | | 0x26 || 0xFDA || Reserved | ||
+ | |} | ||
− | + | == ShipmentInfo == | |
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 || 0x1 || Shipment | ||
+ | |- | ||
+ | | 0x1 || 0xFFF || Reserved | ||
+ | |} | ||
− | + | == FactoryConfiguration == | |
− | + | {| class="wikitable" border="1" | |
− | + | |- | |
− | + | ! Offset | |
− | + | ! Size | |
− | + | ! Description | |
− | + | |- | |
− | + | | 0x0 || 0x10 || IdentificationCode | |
− | + | |- | |
− | + | | 0x10 || 0x2 || Reserved | |
− | + | |- | |
− | + | | 0x12 || 0x1 || [[#Type|Type]] | |
− | + | |- | |
− | + | | 0x13 || 0x1 || BoardRevision | |
+ | |- | ||
+ | | 0x14 || 0x7 || Reserved | ||
+ | |- | ||
+ | | 0x1B || 0x1 || FormatVersion | ||
+ | |- | ||
+ | | 0x1C || 0x4 || Reserved | ||
+ | |- | ||
+ | | 0x20 || 0x18 || [[#Cal1|Cal1]] | ||
+ | |- | ||
+ | | 0x38 || 0x5 || Reserved | ||
+ | |- | ||
+ | | 0x3D || 0x12 || [[#Cal2|Cal2]] | ||
+ | |- | ||
+ | | 0x4F || 0x1 || Reserved | ||
+ | |- | ||
+ | | 0x50 || 0xD || [[#Design|Design]] | ||
+ | |- | ||
+ | | 0x5D || 0x23 || Reserved | ||
+ | |- | ||
+ | | 0x80 || 0x18 || [[#Model1|Model1]] | ||
+ | |- | ||
+ | | 0x98 || 0x12 || [[#Model2|Model2]] | ||
+ | |- | ||
+ | | 0xAA || 0x1 || Reserved | ||
+ | |- | ||
+ | | 0xAB || 0x1 || AccelerometerAxisAssignment | ||
+ | |- | ||
+ | | 0xAC || 0x1 || GyroscopeAxisAssignment | ||
+ | |- | ||
+ | | 0xAD || 0x1 || MainAnalogStickAxisAssignment | ||
+ | |- | ||
+ | | 0xAE || 0x1 || SubAnalogStickAxisAssignment | ||
+ | |- | ||
+ | | 0xAF || 0x151 || Reserved | ||
+ | |- | ||
+ | | 0x200 || 0x2 || BatteryVoltage | ||
+ | |- | ||
+ | | 0x202 || 0xB7E || Reserved | ||
+ | |- | ||
+ | | 0xD80 || 0x2 || TarragonVid | ||
+ | |- | ||
+ | | 0xD82 || 0x2 || TarragonPid | ||
+ | |- | ||
+ | | 0xD84 || 0x7C || Reserved | ||
+ | |- | ||
+ | | 0xE00 || 0x100 || InspectionLog | ||
+ | |} | ||
− | {| class="wikitable" | + | === Type === |
− | + | {| class="wikitable" border="1" | |
|- | |- | ||
− | + | ! Value | |
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x01 || JoyLeft |
|- | |- | ||
− | | | + | | 0x02 || JoyRight |
|- | |- | ||
− | | | + | | 0x03 || SwitchProController |
|- | |- | ||
− | | | + | | 0x04 || ([[HID_services#DeviceTypeInternal|DeviceType]] 4) |
|- | |- | ||
− | | | + | | 0x05 || ([[HID_services#DeviceTypeInternal|DeviceType]] 5) |
|- | |- | ||
− | | | + | | 0x06 || Tarragon ([[HID_services#DeviceTypeInternal|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+] ([[HID_services#DeviceTypeInternal|DeviceType]] 30) |
|- | |- | ||
− | | | + | | 0x21 || FiftyLeft ([[HID_services#DeviceTypeInternal|DeviceType]] 14) |
|- | |- | ||
− | | | + | | 0x22 || FiftyRight ([[HID_services#DeviceTypeInternal|DeviceType]] 18) |
+ | |} | ||
+ | |||
+ | === Cal1 === | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x18 || [[#SixAxisSensorCalibrationValue|SixAxisSensorCalibrationValue]] |
+ | |} | ||
+ | |||
+ | ==== SixAxisSensorCalibrationValue ==== | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x2 || Accelerometer0OffsetX |
|- | |- | ||
− | | | + | | 0x2 || 0x2 || Accelerometer0OffsetY |
|- | |- | ||
− | | | + | | 0x4 || 0x2 || Accelerometer0OffsetZ |
|- | |- | ||
− | | | + | | 0x6 || 0x2 || Accelerometer1GScaleX |
|- | |- | ||
− | | | + | | 0x8 || 0x2 || Accelerometer1GScaleY |
|- | |- | ||
− | | | + | | 0xA || 0x2 || Accelerometer1GScaleZ |
|- | |- | ||
− | | | + | | 0xC || 0x2 || Gyroscope0OffsetX |
|- | |- | ||
− | | | + | | 0xE || 0x2 || Gyroscope0OffsetY |
|- | |- | ||
− | | | + | | 0x10 || 0x2 || Gyroscope0OffsetZ |
|- | |- | ||
− | | | + | | 0x12 || 0x2 || Gyroscope78RpmX |
|- | |- | ||
− | | | + | | 0x14 || 0x2 || Gyroscope78RpmY |
|- | |- | ||
− | | | + | | 0x16 || 0x2 || Gyroscope78RpmZ |
+ | |} | ||
+ | |||
+ | === Cal2 === | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x9 || [[#MainAnalogStickCalibrationValue|MainAnalogStickCalibrationValue]] |
|- | |- | ||
− | | | + | | 0x9 || 0x9 || [[#SubAnalogStickCalibrationValue|SubAnalogStickCalibrationValue]] |
+ | |} | ||
+ | |||
+ | ==== MainAnalogStickCalibrationValue ==== | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x3 || AnalogStickCalXPositiveAndAnalogStickCalYPositive |
|- | |- | ||
− | | | + | | 0x3 || 0x3 || AnalogStickCalX0AndAnalogStickCalY0 |
|- | |- | ||
− | | | + | | 0x6 || 0x3 || AnalogStickCalXNegativeAndAnalogStickCalYNegative |
+ | |} | ||
+ | |||
+ | ==== SubAnalogStickCalibrationValue ==== | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x3 || AnalogStickCalX0AndAnalogStickCalY0 |
|- | |- | ||
− | | | + | | 0x3 || 0x3 || AnalogStickCalXNegativeAndAnalogStickCalYNegative |
|- | |- | ||
− | | | + | | 0x6 || 0x3 || AnalogStickCalXPositiveAndAnalogStickCalYPositive |
+ | |} | ||
+ | |||
+ | === Design === | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0xC || [[#ControllerColor|ControllerColor]] |
|- | |- | ||
− | | | + | | 0xC || 0x1 || [[#DesignVariation|DesignVariation]] |
+ | |} | ||
+ | |||
+ | ==== ControllerColor ==== | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x3 || MainColor (body color of controller in RGB Hex, see [[Joy-Con#Colors|Joy-Con Colors]]) |
|- | |- | ||
− | | | + | | 0x3 || 0x3 || SubColor (button color of controller in RGB Hex, see [[Joy-Con#Colors|Joy-Con Colors]]) |
|- | |- | ||
− | | | + | | 0x6 || 0x3 || 3rdColor (left grip color of controller in RGB Hex) |
|- | |- | ||
− | | | + | | 0x9 || 0x3 || 4thColor (right grip color of controller in RGB Hex) |
+ | |} | ||
+ | |||
+ | ==== DesignVariation ==== | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Value | |
+ | ! Name | ||
|- | |- | ||
− | | | + | | 0x0 || LuciaJ, LagerJ |
|- | |- | ||
− | | | + | | 0x1 || LuciaE, LagerE |
|- | |- | ||
− | | | + | | 0x2 || LuciaU, LagerU |
+ | |} | ||
+ | |||
+ | === Model1 === | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x6 || [[#SixAxisSensorHorizontalOffset|SixAxisSensorHorizontalOffset]] |
|- | |- | ||
− | | | + | | 0x6 || 0x12 || [[#AnalogStickModuleParam|MainAnalogStickModuleParam]] |
+ | |} | ||
+ | |||
+ | ==== SixAxisSensorHorizontalOffset ==== | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x2 || HorizontalOffsetX |
|- | |- | ||
− | | | + | | 0x2 || 0x2 || HorizontalOffsetY |
|- | |- | ||
− | | | + | | 0x4 || 0x2 || HorizontalOffsetZ |
+ | |} | ||
+ | |||
+ | ==== AnalogStickModuleParam ==== | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x3 || TypicalStrokeXAndTypicalStrokeY |
|- | |- | ||
− | | | + | | 0x3 || 0x3 || CenterDeadZoneSizeAndCircuitDeadZoneScale |
|- | |- | ||
− | | | + | | 0x6 || 0x3 || MinimumStrokeXPositiveAndMinimumStrokeYPositive |
|- | |- | ||
− | | | + | | 0x9 || 0x3 || MinimumStrokeXNegativeAndMinimumStrokeYNegative |
|- | |- | ||
− | | | + | | 0xC || 0x3 || CenterRangeXPositiveAndCenterRangeYPositive |
|- | |- | ||
− | | | + | | 0xF || 0x3 || CenterRangeXNegativeAndCenterRangeYNegative |
+ | |} | ||
+ | |||
+ | === Model2 === | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x12 || [[#AnalogStickModuleParam|SubAnalogStickModuleParam]] |
+ | |} | ||
+ | |||
+ | == UserCalibration == | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x10 || Reserved |
|- | |- | ||
− | | | + | | 0x10 || 0x16 || [[#UserCal1|UserCal1]] |
|- | |- | ||
− | | | + | | 0x26 || 0x1A || [[#UserCal2|UserCal2]] |
|- | |- | ||
− | | | + | | 0x40 || 0xFC0 || Reserved |
+ | |} | ||
+ | |||
+ | === UserCal1 === | ||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | + | ! Offset | |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 || 0x2 || MagicNumber |
|- | |- | ||
− | | | + | | 0x2 || 0x9 || [[#MainAnalogStickCalibrationValue|MainAnalogStickUserCalibrationValue]] |
|- | |- | ||
− | | | + | | 0xB || 0x2 || MagicNumber |
|- | |- | ||
− | | | + | | 0xD || 0x9 || [[#SubAnalogStickCalibrationValue|SubAnalogStickUserCalibrationValue]] |
|} | |} | ||
− | ==Colors== | + | === UserCal2 === |
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 || 0x2 || MagicNumber | ||
+ | |- | ||
+ | | 0x2 || 0x18 || [[#SixAxisSensorCalibrationValue|SixAxisSensorUserCalibrationValue]] | ||
+ | |} | ||
+ | |||
+ | == 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. | 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. | ||
+ | |||
{| class="wikitable" | {| class="wikitable" | ||
− | ! Color | + | ! 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 | + | | Neon Pink / ネオンピンク || 2017.07.21 || #FF3278 || #28001E |
|- | |- | ||
− | | | + | | Red / レッド || 2017.10.27 || #E10F00 || #280A0A |
|- | |- | ||
− | | | + | | Blue / ブルー || 2019.10.04 || #4655F5 || #00000A |
|- | |- | ||
− | | Neon | + | | Neon Purple / ネオンパープル || 2019.10.04 || #B400E6 || #140014 |
|- | |- | ||
− | | Neon | + | | 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) | ||
|} | |} | ||
− | |||
− | |||
− |
Latest revision as of 02:46, 3 November 2023
Joy-Con is the name for the Switch's primary game controllers. The Joy-Con are internally called Sakyo (Left) and Ukyo (Right).
Hardware
Sakyo
Component | Description |
---|---|
SoC | Broadcom BCM20734 |
IMU | STMicroelectronics LSM6DS3H |
PMIC | Texas Instruments BQ24072 |
Storage | Macronix International MX25U4033E 4 Mb CMOS Flash |
Ukyo
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 | StaticSection |
0x1000 | 0x1000 | FailsafeSection |
0x2000 | 0x1000 | VolatileSection |
0x3000 | 0x1000 | VolatileSectionBackup1 |
0x4000 | 0x1000 | VolatileSectionBackup2 |
0x5000 | 0x1000 | ShipmentInfo |
0x6000 | 0x1000 | FactoryConfiguration |
0x8000 | 0x1000 | UserCalibration |
0x9000 | 0x7000 | Reserved |
0x10000 | 0x18000 | DynamicSection1 |
0x28000 | 0x18000 | DynamicSection2 |
0x40000 | 0x40000 | Reserved |
FailsafeSection
Offset | Size | Description |
---|---|---|
0x0 | 0xFF4 | Reserved |
0xFF4 | 0x8 | Signature |
0xFFC | 0x4 | Ds2Offset |
VolatileSection
Offset | Size | Description |
---|---|---|
0x0 | 0x26 | |
0x26 | 0xFDA | Reserved |
ShipmentInfo
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | Shipment |
0x1 | 0xFFF | Reserved |
FactoryConfiguration
Offset | Size | Description |
---|---|---|
0x0 | 0x10 | IdentificationCode |
0x10 | 0x2 | Reserved |
0x12 | 0x1 | Type |
0x13 | 0x1 | BoardRevision |
0x14 | 0x7 | Reserved |
0x1B | 0x1 | FormatVersion |
0x1C | 0x4 | Reserved |
0x20 | 0x18 | Cal1 |
0x38 | 0x5 | Reserved |
0x3D | 0x12 | Cal2 |
0x4F | 0x1 | Reserved |
0x50 | 0xD | Design |
0x5D | 0x23 | Reserved |
0x80 | 0x18 | Model1 |
0x98 | 0x12 | Model2 |
0xAA | 0x1 | Reserved |
0xAB | 0x1 | AccelerometerAxisAssignment |
0xAC | 0x1 | GyroscopeAxisAssignment |
0xAD | 0x1 | MainAnalogStickAxisAssignment |
0xAE | 0x1 | SubAnalogStickAxisAssignment |
0xAF | 0x151 | Reserved |
0x200 | 0x2 | BatteryVoltage |
0x202 | 0xB7E | Reserved |
0xD80 | 0x2 | TarragonVid |
0xD82 | 0x2 | TarragonPid |
0xD84 | 0x7C | Reserved |
0xE00 | 0x100 | InspectionLog |
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 |
SixAxisSensorCalibrationValue
Offset | Size | Description |
---|---|---|
0x0 | 0x2 | Accelerometer0OffsetX |
0x2 | 0x2 | Accelerometer0OffsetY |
0x4 | 0x2 | Accelerometer0OffsetZ |
0x6 | 0x2 | Accelerometer1GScaleX |
0x8 | 0x2 | Accelerometer1GScaleY |
0xA | 0x2 | Accelerometer1GScaleZ |
0xC | 0x2 | Gyroscope0OffsetX |
0xE | 0x2 | Gyroscope0OffsetY |
0x10 | 0x2 | Gyroscope0OffsetZ |
0x12 | 0x2 | Gyroscope78RpmX |
0x14 | 0x2 | Gyroscope78RpmY |
0x16 | 0x2 | Gyroscope78RpmZ |
Cal2
Offset | Size | Description |
---|---|---|
0x0 | 0x9 | MainAnalogStickCalibrationValue |
0x9 | 0x9 | SubAnalogStickCalibrationValue |
MainAnalogStickCalibrationValue
Offset | Size | Description |
---|---|---|
0x0 | 0x3 | AnalogStickCalXPositiveAndAnalogStickCalYPositive |
0x3 | 0x3 | AnalogStickCalX0AndAnalogStickCalY0 |
0x6 | 0x3 | AnalogStickCalXNegativeAndAnalogStickCalYNegative |
SubAnalogStickCalibrationValue
Offset | Size | Description |
---|---|---|
0x0 | 0x3 | AnalogStickCalX0AndAnalogStickCalY0 |
0x3 | 0x3 | AnalogStickCalXNegativeAndAnalogStickCalYNegative |
0x6 | 0x3 | AnalogStickCalXPositiveAndAnalogStickCalYPositive |
Design
Offset | Size | Description |
---|---|---|
0x0 | 0xC | ControllerColor |
0xC | 0x1 | DesignVariation |
ControllerColor
Offset | Size | Description |
---|---|---|
0x0 | 0x3 | MainColor (body color of controller in RGB Hex, see Joy-Con Colors) |
0x3 | 0x3 | SubColor (button color of controller in RGB Hex, see Joy-Con Colors) |
0x6 | 0x3 | 3rdColor (left grip color of controller in RGB Hex) |
0x9 | 0x3 | 4thColor (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 | SixAxisSensorHorizontalOffset |
0x6 | 0x12 | MainAnalogStickModuleParam |
SixAxisSensorHorizontalOffset
Offset | Size | Description |
---|---|---|
0x0 | 0x2 | HorizontalOffsetX |
0x2 | 0x2 | HorizontalOffsetY |
0x4 | 0x2 | HorizontalOffsetZ |
AnalogStickModuleParam
Offset | Size | Description |
---|---|---|
0x0 | 0x3 | TypicalStrokeXAndTypicalStrokeY |
0x3 | 0x3 | CenterDeadZoneSizeAndCircuitDeadZoneScale |
0x6 | 0x3 | MinimumStrokeXPositiveAndMinimumStrokeYPositive |
0x9 | 0x3 | MinimumStrokeXNegativeAndMinimumStrokeYNegative |
0xC | 0x3 | CenterRangeXPositiveAndCenterRangeYPositive |
0xF | 0x3 | CenterRangeXNegativeAndCenterRangeYNegative |
Model2
Offset | Size | Description |
---|---|---|
0x0 | 0x12 | SubAnalogStickModuleParam |
UserCalibration
Offset | Size | Description |
---|---|---|
0x0 | 0x10 | Reserved |
0x10 | 0x16 | UserCal1 |
0x26 | 0x1A | UserCal2 |
0x40 | 0xFC0 | Reserved |
UserCal1
Offset | Size | Description |
---|---|---|
0x0 | 0x2 | MagicNumber |
0x2 | 0x9 | MainAnalogStickUserCalibrationValue |
0xB | 0x2 | MagicNumber |
0xD | 0x9 | SubAnalogStickUserCalibrationValue |
UserCal2
Offset | Size | Description |
---|---|---|
0x0 | 0x2 | MagicNumber |
0x2 | 0x18 | SixAxisSensorUserCalibrationValue |
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) |