Joy-Con: Difference between revisions
Joy-Con codenames were reversed, can confirm this with prototype board labels and also Japanese history |
No edit summary |
||
Line 500: | Line 500: | ||
| 0x2 | | 0x2 | ||
| 0x8 | | 0x8 | ||
| MotorData | | [[#HidMotorData|MotorData]] | ||
|- | |- | ||
| 0xA | | 0xA | ||
Line 530: | Line 530: | ||
| 0x2 | | 0x2 | ||
| 0x8 | | 0x8 | ||
| MotorData | | [[#HidMotorData|MotorData]] | ||
|- | |- | ||
| 0xA | | 0xA | ||
Line 556: | Line 556: | ||
| 0x2 | | 0x2 | ||
| 0x8 | | 0x8 | ||
| MotorData | | [[#HidMotorData|MotorData]] | ||
|} | |} | ||
Line 578: | Line 578: | ||
| 0x2 | | 0x2 | ||
| 0x8 | | 0x8 | ||
| MotorData | | [[#HidMotorData|MotorData]] | ||
|- | |- | ||
| 0xA | | 0xA | ||
Line 604: | Line 604: | ||
| 0x2 | | 0x2 | ||
| 0x8 | | 0x8 | ||
| MotorData | | [[#HidMotorData|MotorData]] | ||
|- | |- | ||
| 0xA | | 0xA | ||
Line 657: | Line 657: | ||
|- | |- | ||
| 0x82 || | | 0x82 || | ||
|} | |||
== HidMotorData == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || [[#VibrationAmFmPackTag|JoyLeftVibrationAmFmPackTag]] | |||
|- | |||
| 0x4 || 0x8 || [[#VibrationAmFmPackTag|JoyRightVibrationAmFmPackTag]] | |||
|} | |||
== VibrationAmFmPackTag == | |||
This is "nn::xcd::VibrationAmFmPackTag". This is a BitPack object. | |||
=== VibrationAmFmPackFormatZero === | |||
{| class="wikitable" border="1" | |||
! Bits | |||
! Description | |||
|- | |||
| 0-29 || Reserved | |||
|- | |||
| 30-31 || PackFormat (must be 0) | |||
|} | |||
=== VibrationAmFmPackFormatOne === | |||
{| class="wikitable" border="1" | |||
! Bits | |||
! Description | |||
|- | |||
| 0-19 || Reserved | |||
|- | |||
| 20-24 || ChannelCodesHigh | |||
|- | |||
| 25-29 || ChannelCodesLow | |||
|- | |||
| 30-31 || PackFormat (must be 1) | |||
|} | |||
=== VibrationAmFmPackFormatOne28bit === | |||
{| class="wikitable" border="1" | |||
! Bits | |||
! Description | |||
|- | |||
| 0-1 || Reserved | |||
|- | |||
| 2-8 || ChannelFrequencyHigh | |||
|- | |||
| 9-15 || ChannelAmplitudeHigh | |||
|- | |||
| 16-22 || ChannelFrequencyLow | |||
|- | |||
| 23-29 || ChannelAmplitudeLow | |||
|- | |||
| 30-31 || PackFormat (must be 1) | |||
|} | |||
=== VibrationAmFmPackFormatTwo === | |||
{| class="wikitable" border="1" | |||
! Bits | |||
! Description | |||
|- | |||
| 0-9 || Reserved | |||
|- | |||
| 10-14 || VibrationCodesHigh | |||
|- | |||
| 15-19 || VibrationCodesLow | |||
|- | |||
| 20-24 || ChannelCodesHigh | |||
|- | |||
| 25-29 || ChannelCodesLow | |||
|- | |||
| 30-31 || PackFormat (must be 2) | |||
|} | |||
=== VibrationAmFmPackFormatTwo14bitLow === | |||
{| class="wikitable" border="1" | |||
! Bits | |||
! Description | |||
|- | |||
| 0 || IsChannelHigh (must be 0) | |||
|- | |||
| 1-7 || ChannelFrequency | |||
|- | |||
| 8-12 || VibrationCodesHigh1 | |||
|- | |||
| 13-17 || VibrationCodesLow1 | |||
|- | |||
| 18-22 || VibrationCodesHigh0 | |||
|- | |||
| 23-29 || ChannelAmplitude | |||
|- | |||
| 30-31 || PackFormat (must be 2) | |||
|} | |||
=== VibrationAmFmPackFormatTwo14bitHigh === | |||
{| class="wikitable" border="1" | |||
! Bits | |||
! Description | |||
|- | |||
| 0 || IsChannelHigh (must be 1) | |||
|- | |||
| 1-7 || ChannelFrequency | |||
|- | |||
| 8-12 || VibrationCodesHigh1 | |||
|- | |||
| 13-17 || VibrationCodesLow1 | |||
|- | |||
| 18-22 || VibrationCodesLow0 | |||
|- | |||
| 23-29 || ChannelAmplitude | |||
|- | |||
| 30-31 || PackFormat (must be 2) | |||
|} | |||
=== VibrationAmFmPackFormatThree === | |||
{| class="wikitable" border="1" | |||
! Bits | |||
! Description | |||
|- | |||
| 0-4 || VibrationCodesHigh1 | |||
|- | |||
| 5-9 || VibrationCodesLow1 | |||
|- | |||
| 10-14 || VibrationCodesHigh0 | |||
|- | |||
| 15-19 || VibrationCodesLow0 | |||
|- | |||
| 20-24 || ChannelCodesHigh | |||
|- | |||
| 25-29 || ChannelCodesLow | |||
|- | |||
| 30-31 || PackFormat (must be 3) | |||
|} | |||
=== VibrationAmFmPackFormatThree7bit === | |||
{| class="wikitable" border="1" | |||
! Bits | |||
! Description | |||
|- | |||
| 0 || IsChannelHigh | |||
|- | |||
| 1 || IsThree7bit (must be 1) | |||
|- | |||
| 2 || IsFm | |||
|- | |||
| 3-7 || VibrationCodesHigh1 | |||
|- | |||
| 8-12 || VibrationCodesLow1 | |||
|- | |||
| 13-17 || VibrationCodesHigh0 | |||
|- | |||
| 18-22 || VibrationCodesLow0 | |||
|- | |||
| 23-29 || ChannelAmFm | |||
|- | |||
| 30-31 || PackFormat (must be 1, instead of 3) | |||
|} | |||
== AmFmCodes == | |||
These are 32-bit values used by the Joy-Con firmware to represent combinations of amplitude/frequency pairs for vibration. | |||
=== Unpacking === | |||
The Joy-Con firmware receives vibration data packed as [[#VibrationAmFmPackTag|VibrationAmFmPackTag]] from output reports. Depending on the packing format, these tags are then converted to an array of AmFmCodes as follows. | |||
==== AmFm5BitCodes ==== | |||
Converted from [[#VibrationAmFmPackFormatOne|VibrationAmFmPackFormatOne]], [[#VibrationAmFmPackFormatTwo|VibrationAmFmPackFormatTwo]] or [[#VibrationAmFmPackFormatThree|VibrationAmFmPackFormatThree]]. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || <nowiki>(ChannelCodesLow & 0x1F)</nowiki> | |||
|- | |||
| 0x4 || 0x4 || <nowiki>(ChannelCodesHigh & 0x1F)</nowiki> | |||
|- | |||
| 0x8 || 0x4 || <nowiki>(VibrationCodesLow0 & 0x1F)</nowiki> | |||
|- | |||
| 0xC || 0x4 || <nowiki>(VibrationCodesHigh0 & 0x1F)</nowiki> | |||
|- | |||
| 0x10 || 0x4 || <nowiki>(VibrationCodesLow1 & 0x1F)</nowiki> | |||
|- | |||
| 0x14 || 0x4 || <nowiki>(VibrationCodesHigh1 & 0x1F)</nowiki> | |||
|} | |||
==== AmFm7BitOneCodes ==== | |||
Converted from [[#VibrationAmFmPackFormatOne28bit|VibrationAmFmPackFormatOne28bit]]. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || <nowiki>(((ChannelFrequencyLow & 0x7F) << 8) | (ChannelAmplitudeLow & 0x7F) | 0x8080)</nowiki> | |||
|- | |||
| 0x4 || 0x4 || <nowiki>(((ChannelFrequencyHigh & 0x7F) << 8) | (ChannelAmplitudeHigh & 0x7F) | 0x8080)</nowiki> | |||
|} | |||
==== AmFm7BitTwoCodes ==== | |||
Converted from [[#VibrationAmFmPackFormatTwo14bitLow|VibrationAmFmPackFormatTwo14bitLow]] or [[#VibrationAmFmPackFormatTwo14bitHigh|VibrationAmFmPackFormatTwo14bitHigh]]. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || <nowiki>IsChannelHigh ? (VibrationCodesLow0 & 0x1F) : (((ChannelFrequency & 0x7F) << 8) | (ChannelAmplitude & 0x7F) | 0x8080)</nowiki> | |||
|- | |||
| 0x4 || 0x4 || <nowiki>IsChannelHigh ? (((ChannelFrequency & 0x7F) << 8) | (ChannelAmplitude & 0x7F) | 0x8080) : (VibrationCodesHigh0 & 0x1F)</nowiki> | |||
|- | |||
| 0x8 || 0x4 || <nowiki>(VibrationCodesLow1 & 0x1F)</nowiki> | |||
|- | |||
| 0xC || 0x4 || <nowiki>(VibrationCodesHigh1 & 0x1F)</nowiki> | |||
|- | |||
| 0x10 || 0x4 || <nowiki>Always 0x18</nowiki> | |||
|- | |||
| 0x14 || 0x4 || <nowiki>Always 0x18</nowiki> | |||
|} | |||
==== AmFm7BitThreeCodes ==== | |||
Converted from [[#VibrationAmFmPackFormatThree7bit|VibrationAmFmPackFormatThree7bit]]. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x4 || <nowiki>IsChannelHigh ? 0x18 : (IsFm ? (((ChannelAmFm & 0x7F) << 8) | 0x8000) : ((ChannelAmFm & 0x7F) | 0x80))</nowiki> | |||
|- | |||
| 0x4 || 0x4 || <nowiki>IsChannelHigh ? (IsFm ? (((ChannelAmFm & 0x7F) << 8) | 0x8000) : ((ChannelAmFm & 0x7F) | 0x80)) : 0x18</nowiki> | |||
|- | |||
| 0x8 || 0x4 || <nowiki>(VibrationCodesLow0 & 0x1F)</nowiki> | |||
|- | |||
| 0xC || 0x4 || <nowiki>(VibrationCodesHigh0 & 0x1F)</nowiki> | |||
|- | |||
| 0x10 || 0x4 || <nowiki>(VibrationCodesLow1 & 0x1F)</nowiki> | |||
|- | |||
| 0x14 || 0x4 || <nowiki>(VibrationCodesHigh1 & 0x1F)</nowiki> | |||
|} | |} | ||