Joy-Con: Difference between revisions
Joy-Con codenames were reversed, can confirm this with prototype board labels and also Japanese history |
|||
(13 intermediate revisions by 2 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 = | = 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" | {| 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 = | = Protocol = | ||
The Joy-Con can communicate wirelessly over Bluetooth or through the rails over UART. | The Joy-Con can communicate wirelessly over Bluetooth or through the rails over UART. The latter uses a Nintendo proprietary protocol called "Nwcp". | ||
== NwcpPacket == | == NwcpPacket == | ||
Line 126: | Line 128: | ||
! Description | ! Description | ||
|- | |- | ||
| 0x91 || | | 0x91 || DeviceCommandIn | ||
|- | |- | ||
| 0x92 || Hid | | 0x92 || Hid | ||
|- | |- | ||
| 0x94 || | | 0x93 || | ||
|- | |||
| 0x94 || DeviceCommandOut | |||
|- | |||
| 0x95 || | |||
|- | |- | ||
| 0x9A || | | 0x9A || | ||
Line 137: | Line 143: | ||
|- | |- | ||
| 0xA5 || Handshake | | 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 || | |||
|} | |} | ||
Line 295: | Line 815: | ||
|} | |} | ||
== | == 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" 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 | |||
|} | |||
{| class="wikitable" | == 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 | |||
|} | |||
=== 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]] | ||
|} | |||
=== UserCal2 === | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
! Offset | |||
! Size | |||
! Description | |||
|- | |- | ||
| | | 0x0 || 0x2 || MagicNumber | ||
|- | |- | ||
| | | 0x2 || 0x18 || [[#SixAxisSensorCalibrationValue|SixAxisSensorUserCalibrationValue]] | ||
|} | |} | ||
== Colors == | == 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" | ||
! Developer Kit Joy-Con || Release || Body HEX || Button HEX | ! Developer Kit Joy-Con || Release || Body HEX || Button HEX | ||
Line 509: | Line 1,270: | ||
|- | |- | ||
| White / ホワイト || 2021.10.08 || #E6E6E6 || #323232 | | 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 | ! Special Edition Joy-Con Color || Release || Body HEX || Button HEX | ||
Line 568: | Line 1,337: | ||
| Pokémon: Scarlet × Violet OLED Edition Violet Right Joy-Con / (有機ELモデル) ポケットモンスター スカーレット・バイオレット || 2022.11.04 || #9650AA || #32322D | | 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モデル) ゼルダの伝説 ティアーズ オブ ザ | | 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) | | // *(Prize Awarded for Labo Contest - No Retail) // **(Available Japan Only) | ||
|} | |} | ||