Joy-Con: Difference between revisions
No edit summary |
|||
Line 1: | Line 1: | ||
Joy-Con is the name for the Switch's primary game controllers. The controllers communicate to the console through bluetooth and can be disconnected from the main unit. | Joy-Con is the name for the Switch's primary game controllers. The controllers communicate to the console through bluetooth and can be disconnected from the main unit. | ||
= Hardware = | |||
The controllers themselves are simple to disassemble and identify. | The controllers themselves are simple to disassemble and identify. | ||
[[File:JoyconFront.jpg|400px|thumb|The front of the Joy-Con internal[https://www.ifixit.com/Teardown/Nintendo+Switch+Teardown/78263]]] | [[File:JoyconFront.jpg|400px|thumb|The front of the Joy-Con internal[https://www.ifixit.com/Teardown/Nintendo+Switch+Teardown/78263]]] | ||
Line 15: | Line 15: | ||
|} | |} | ||
= Firmware = | |||
''See also: [[Joy-Con Firmware]]'' | ''See also: [[Joy-Con Firmware]]'' | ||
Line 26: | Line 26: | ||
| Joy-Con Right (Red) || [[:File:pad.R.bin|flash dump]] | | Joy-Con Right (Red) || [[:File:pad.R.bin|flash dump]] | ||
|} | |} | ||
The flash is in a patch-ram format. Tools for dealing with it are available [https://github.com/shuffle2/nxpad]. | The flash is in a patch-ram format. Tools for dealing with it are available [https://github.com/shuffle2/nxpad]. | ||
A dump of the ROM region (taken while firmware was running) can be found [[:File:bcm20734_rom.bin|here]]. Note this is the same SoC used on the other controller models, as well. | A dump of the ROM region (taken while firmware was running) can be found [[:File:bcm20734_rom.bin|here]]. Note this is the same SoC used on the other controller models, as well. | ||
== Bluetooth | = Protocol = | ||
== | The Joy-Con can communicate wirelessly over Bluetooth or through the rails over UART. This uses a Nintendo proprietary protocol called "Nwcp". | ||
== NwcpPacket == | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! Offset | ||
! Size | |||
! Description | |||
|- | |||
| 0x0 | |||
| 0x5 | |||
| [[#HciHeader|HciHeader]] | |||
|- | |||
| 0x5 | |||
| 0x6 | |||
| [[#NwcpHeader|NwcpHeader]] | |||
|- | |||
| 0xB | |||
| 0x1 | |||
| HeaderCrc (CRC8 over 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 | |||
| Reserved | |||
|- | |||
| 0x5 | |||
| 0x1 | |||
| DataCrc (CRC8 over Data for DataSize bytes) | |||
|} | |||
==== CommandType ==== | |||
{| class="wikitable" border="1" | |||
! Value | |||
! Description | |||
|- | |||
| 0x91 || DeviceCommandToDevice | |||
|- | |||
| 0x92 || Hid | |||
|- | |||
| 0x94 || DeviceCommandFromDevice | |||
|- | |||
| 0xA5 || Handshake | |||
|} | |||
== DeviceCommand == | |||
{| class="wikitable" border="1" | |||
! Value | |||
! Description | |||
|- | |||
| 0x00 || | |||
|- | |||
| 0x01 || Inquiry | |||
|- | |||
| 0x02 || WriteChargerSettings | |||
|- | |||
| 0x07 || ReadWakeUpReason | |||
|- | |||
| 0x10 || CreateHidConnection | |||
|- | |||
| 0x11 || DisconnectHid | |||
|- | |||
| 0x12 || SetHidInterval | |||
|- | |||
| 0x13 || | |||
|- | |||
| 0x14 || | |||
|- | |||
| 0x15 || | |||
|- | |||
| 0x16 || | |||
|- | |||
| 0x17 || | |||
|- | |||
| 0x18 || Pairing | |||
|- | |||
| 0x20 || UpdateUartBaudRate | |||
|} | |||
== HidCommand == | |||
{| class="wikitable" border="1" | |||
! Value | |||
! Description | |||
|- | |- | ||
| 0x00 || | | 0x00 || | ||
Line 73: | Line 212: | ||
| 0x28 || AttachmentWrite | | 0x28 || AttachmentWrite | ||
|- | |- | ||
| 0x29 || | | 0x29 || AttachmentRead | ||
|- | |- | ||
| 0x2A || AttachmentEnable | | 0x2A || AttachmentEnable | ||
Line 99: | Line 238: | ||
| 0x51 || WriteChargeSetting | | 0x51 || WriteChargeSetting | ||
|- | |- | ||
| 0x52 || | | 0x52 || ReadChargeSetting | ||
|- | |- | ||
| 0x58 || ExtDevWrite | | 0x58 || ExtDevWrite | ||
Line 113: | Line 252: | ||
| 0x60 || InternalAttachmentWrite | | 0x60 || InternalAttachmentWrite | ||
|- | |- | ||
| 0x61 || | | 0x61 || InternalAttachmentReadOld | ||
|- | |- | ||
| 0x62 || InternalAttachmentEnable | | 0x62 || InternalAttachmentEnable | ||
Line 152: | Line 291: | ||
|} | |} | ||
== Left & Right Separate Joy-con == | |||
When paired directly to a computer over bluetooth, the joy-con both provide identical HID input report descriptor. This does not appear to include motion controls, IR data, or NFC. They both behave as detached single-player controllers. | When paired directly to a computer over bluetooth, the joy-con both provide identical HID input report descriptor. This does not appear to include motion controls, IR data, or NFC. They both behave as detached single-player controllers. | ||
Line 336: | Line 475: | ||
|} | |} | ||
= 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" | ||
Line 406: | Line 545: | ||
|} | |} | ||
= Additional Links = | |||
[https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering Reverse Engineering of the Joy-Con by Github user dekuNukem] | [https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering Reverse Engineering of the Joy-Con by Github user dekuNukem] |