Difference between revisions of "HID Shared Memory"
Jump to navigation
Jump to search
Line 2: | Line 2: | ||
= Memory Map = | = Memory Map = | ||
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
| 0x0 | | 0x0 | ||
| 0x400 | | 0x400 | ||
− | | | + | | DebugPad |
|- | |- | ||
| 0x400 | | 0x400 | ||
| 0x3000 | | 0x3000 | ||
− | | | + | | [[#TouchScreen]] |
|- | |- | ||
| 0x3400 | | 0x3400 | ||
| 0x400 | | 0x400 | ||
− | | Mouse | + | | [[#Mouse]] |
|- | |- | ||
| 0x3800 | | 0x3800 | ||
| 0x400 | | 0x400 | ||
− | | Keyboard | + | | [[#Keyboard]] |
|- | |- | ||
| 0x3C00 | | 0x3C00 | ||
| 0x400 | | 0x400 | ||
− | | | + | | BasicXpad |
|- | |- | ||
| 0x4000 | | 0x4000 | ||
Line 43: | Line 42: | ||
| 0x4C00 | | 0x4C00 | ||
| 0x200 | | 0x200 | ||
− | | | + | | HomeButton |
|- | |- | ||
| 0x4E00 | | 0x4E00 | ||
| 0x200 | | 0x200 | ||
− | | | + | | SleepButton |
|- | |- | ||
| 0x5000 | | 0x5000 | ||
| 0x200 | | 0x200 | ||
− | | | + | | CaptureButton |
|- | |- | ||
| 0x5200 | | 0x5200 | ||
− | | | + | | 0x800 |
− | | | + | | InputDetector |
|- | |- | ||
| 0x5A00 | | 0x5A00 | ||
Line 63: | Line 62: | ||
| 0x9A00 | | 0x9A00 | ||
| 0x32000 | | 0x32000 | ||
− | | | + | | Npad |
|- | |- | ||
| 0x3BA00 | | 0x3BA00 | ||
| 0x4600 | | 0x4600 | ||
− | | | + | | Gesture |
|- | |- | ||
| 0x3C200 | | 0x3C200 | ||
| ? | | ? | ||
− | | [5.0.0+] | + | | [5.0.0+] ConsoleSixAxisSensor |
− | |||
|} | |} | ||
− | == | + | == TouchScreen == |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
− | | 0x0 | + | | 0x0 |
− | | 0x28 | + | | 0x28 |
− | | | + | | [[#TouchScreenHeader]] |
|- | |- | ||
− | | 0x28 | + | | 0x28 |
| 0x298 * 17 | | 0x298 * 17 | ||
− | | | + | | Array of [[#TouchScreenState]] |
− | |||
|} | |} | ||
− | === | + | === TouchScreenHeader === |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
− | | 0x0 | + | | 0x0 |
− | | 0x8 | + | | 0x8 |
− | | Timestamp in ticks? | + | | Timestamp in ticks? |
|- | |- | ||
− | | 0x8 | + | | 0x8 |
− | | 0x8 | + | | 0x8 |
| Number of Entries, always 17 | | Number of Entries, always 17 | ||
|- | |- | ||
− | | 0x10 | + | | 0x10 |
− | | 0x8 | + | | 0x8 |
| Latest Entry Index | | Latest Entry Index | ||
|- | |- | ||
− | | 0x18 | + | | 0x18 |
− | | 0x8 | + | | 0x8 |
− | | Maximum Entry Index, always 16 | + | | Maximum Entry Index, always 16 |
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
+ | | 0x20 | ||
+ | | 0x8 | ||
+ | | Timestamp in samples | ||
|} | |} | ||
− | === | + | === TouchScreenState === |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
− | | 0x0 | + | | 0x0 |
− | | 0x10 | + | | 0x10 |
− | | | + | | [[#TouchScreenStateHeader]] |
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
+ | | 0x10 | ||
+ | | 0x28 * 16 | ||
+ | | [[#TouchScreenStateData]] | ||
|} | |} | ||
− | ==== | + | ==== TouchScreenStateHeader ==== |
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
− | | 0x0 | + | | 0x0 |
− | | 0x8 | + | | 0x8 |
| Timestamp in samples | | Timestamp in samples | ||
|- | |- | ||
− | | 0x8 | + | | 0x8 |
− | | 0x8 | + | | 0x8 |
− | | | + | | Touch count |
− | |||
|} | |} | ||
− | ==== | + | ==== TouchScreenStateData ==== |
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
− | | 0x0 | + | | 0x0 |
− | | 0x8 | + | | 0x8 |
| Timestamp in samples | | Timestamp in samples | ||
|- | |- | ||
− | | 0x8 | + | | 0x8 |
− | | 0x4 | + | | 0x4 |
− | | Padding | + | | Padding |
|- | |- | ||
| 0xC | | 0xC | ||
Line 177: | Line 168: | ||
| Touch Index | | Touch Index | ||
|- | |- | ||
− | | 0x10 | + | | 0x10 |
− | | 0x4 | + | | 0x4 |
− | | Touch X | + | | Touch X |
|- | |- | ||
− | | 0x14 | + | | 0x14 |
− | | 0x4 | + | | 0x4 |
− | | Touch Y | + | | Touch Y |
|- | |- | ||
− | | 0x18 | + | | 0x18 |
− | | 0x4 | + | | 0x4 |
− | | Touch Diameter X | + | | Touch Diameter X |
|- | |- | ||
− | | 0x1C | + | | 0x1C |
− | | 0x4 | + | | 0x4 |
− | | Touch Diameter Y | + | | Touch Diameter Y |
|- | |- | ||
− | | 0x20 | + | | 0x20 |
− | | 0x4 | + | | 0x4 |
− | | Angle | + | | Angle |
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
+ | | 0x24 | ||
+ | | 0x4 | ||
+ | | Padding | ||
|} | |} | ||
== Mouse == | == Mouse == | ||
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
| 0x0 | | 0x0 | ||
| 0x20 | | 0x20 | ||
− | | | + | | [[#MouseHeader]] |
|- | |- | ||
| 0x20 | | 0x20 | ||
| 0x30 * 17 | | 0x30 * 17 | ||
− | | | + | | Array of [[#MouseState]] |
− | |||
|} | |} | ||
− | === | + | === MouseHeader === |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
− | | 0x0 | + | | 0x0 |
− | | 0x8 | + | | 0x8 |
| Timestamp in ticks? | | Timestamp in ticks? | ||
|- | |- | ||
− | | 0x8 | + | | 0x8 |
− | | 0x8 | + | | 0x8 |
| Number of Entries, always 17 | | Number of Entries, always 17 | ||
|- | |- | ||
− | | 0x10 | + | | 0x10 |
− | | 0x8 | + | | 0x8 |
| Latest Entry Index | | Latest Entry Index | ||
|- | |- | ||
− | | 0x18 | + | | 0x18 |
− | | 0x8 | + | | 0x8 |
| Maximum Entry Index, always 16 | | Maximum Entry Index, always 16 | ||
− | |||
|} | |} | ||
− | === | + | === MouseState === |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
− | | 0x0 | + | | 0x0 |
− | | 0x8 | + | | 0x8 |
| Timestamp in samples | | Timestamp in samples | ||
|- | |- | ||
− | | 0x8 | + | | 0x8 |
− | | 0x8 | + | | 0x8 |
− | | Timestamp in samples again? | + | | Timestamp in samples again? |
|- | |- | ||
− | | 0x10 | + | | 0x10 |
− | | 0x4 | + | | 0x4 |
− | | Mouse X | + | | Mouse X |
|- | |- | ||
− | | 0x14 | + | | 0x14 |
− | | 0x4 | + | | 0x4 |
− | | Mouse Y | + | | Mouse Y |
|- | |- | ||
− | | 0x18 | + | | 0x18 |
− | | 0x4 | + | | 0x4 |
− | | Mouse X Change | + | | Mouse X Change |
|- | |- | ||
− | | 0x1C | + | | 0x1C |
− | | 0x4 | + | | 0x4 |
− | | Mouse Y Change | + | | Mouse Y Change |
|- | |- | ||
− | | 0x20 | + | | 0x20 |
− | | 0x4 | + | | 0x4 |
− | | Scroll Change Y | + | | Scroll Change Y |
|- | |- | ||
− | | 0x24 | + | | 0x24 |
− | | 0x4 | + | | 0x4 |
− | | Scroll Change X | + | | Scroll Change X |
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
+ | | 0x28 | ||
+ | | 0x8 | ||
+ | | Mouse Buttons | ||
|} | |} | ||
− | |||
== Keyboard == | == Keyboard == | ||
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
| 0x0 | | 0x0 | ||
| 0x20 | | 0x20 | ||
− | | | + | | [[#KeyboardHeader]] |
|- | |- | ||
| 0x20 | | 0x20 | ||
| 0x38 * 17 | | 0x38 * 17 | ||
− | | | + | | Array of [[#KeyboardState]] |
− | |||
|} | |} | ||
− | === | + | === KeyboardHeader === |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
− | | 0x0 | + | | 0x0 |
− | | 0x8 | + | | 0x8 |
| Timestamp in ticks? | | Timestamp in ticks? | ||
|- | |- | ||
− | | 0x8 | + | | 0x8 |
− | | 0x8 | + | | 0x8 |
| Number of Entries, always 17 | | Number of Entries, always 17 | ||
|- | |- | ||
− | | 0x10 | + | | 0x10 |
− | | 0x8 | + | | 0x8 |
| Latest Entry Index | | Latest Entry Index | ||
|- | |- | ||
| 0x18 | | 0x18 | ||
− | | 0x8 | + | | 0x8 |
| Maximum Entry Index, always 16 | | Maximum Entry Index, always 16 | ||
− | |||
|} | |} | ||
− | === | + | === KeyboardState === |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
− | | 0x0 | + | | 0x0 |
− | | 0x8 | + | | 0x8 |
| Timestamp in samples | | Timestamp in samples | ||
|- | |- | ||
− | | 0x8 | + | | 0x8 |
− | | 0x8 | + | | 0x8 |
− | | Timestamp in samples again? | + | | Timestamp in samples again? |
|- | |- | ||
− | | 0x10 | + | | 0x10 |
− | | 0x8 | + | | 0x8 |
− | | Modifier Mask | + | | Modifier Mask |
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
+ | | 0x18 | ||
+ | | 0x20 | ||
+ | | Keys Down, each key gets one bit based on the HID keyboard scan code (F1 is 0x3A, bit 0x3A is set) | ||
|} | |} | ||
== Controller Serials? == | == Controller Serials? == | ||
− | |||
This section contains a series of 16 structures 0x400 bytes large. | This section contains a series of 16 structures 0x400 bytes large. | ||
Line 384: | Line 360: | ||
|} | |} | ||
− | == | + | == Npad == |
+ | This section contains a series of 10 0x5000 byte structures describing each available controller. | ||
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Controller Index |
− | ! | + | ! Description |
|- | |- | ||
− | | 0 to 7 | + | | 0 to 7 |
− | | Players 1 to 8 | + | | Players 1 to 8 |
|- | |- | ||
− | | 8 | + | | 8 |
− | | Handheld Mode | + | | Handheld Mode |
− | |||
− | |||
− | |||
|- | |- | ||
+ | | 9 | ||
+ | | Unknown | ||
|} | |} | ||
− | === | + | === NpadInternalState === |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x28 | ||
+ | | [[#NpadInternalStateHeader]] | ||
+ | |- | ||
+ | | 0x28 | ||
+ | | 0x20 | ||
+ | | NpadFullKeyHeader | ||
+ | |- | ||
+ | | 0x48 | ||
+ | | 0x30 * 17 | ||
+ | | Array of NpadFullKeyState | ||
+ | |- | ||
+ | | 0x378 | ||
+ | | 0x20 | ||
+ | | [[#NpadHandheldHeader]] | ||
+ | |- | ||
+ | | 0x398 | ||
+ | | 0x30 * 17 | ||
+ | | Array of [[#NpadHandheldState]] | ||
+ | |- | ||
+ | | 0x6C8 | ||
+ | | 0x20 | ||
+ | | NpadJoyDualHeader | ||
|- | |- | ||
− | | | + | | 0x6E8 |
− | | | + | | 0x30 * 17 |
− | | | + | | Array of NpadJoyDualState |
|- | |- | ||
− | | | + | | 0xA18 |
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadJoyLeftHeader |
|- | |- | ||
− | | | + | | 0xA38 |
− | | | + | | 0x30 * 17 |
− | | | + | | Array of NpadJoyLeftState |
|- | |- | ||
− | | | + | | 0xD68 |
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadJoyRightHeader |
|- | |- | ||
− | | | + | | 0xD88 |
− | | | + | | 0x30 * 17 |
− | | | + | | Array of NpadJoyRightState |
|- | |- | ||
− | | | + | | 0x10B8 |
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadPalmaHeader |
|- | |- | ||
− | | | + | | 0x12B8 |
− | | | + | | 0x30 * 17 |
− | | | + | | Array of NpadPalmaState |
|- | |- | ||
| 0x1408 | | 0x1408 | ||
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadSystemExtHeader |
+ | |- | ||
+ | | 0x1428 | ||
+ | | 0x30 * 17 | ||
+ | | Array of NpadSystemExtState | ||
|- | |- | ||
| 0x1758 | | 0x1758 | ||
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadSixAxisSensorFullKeyHeader |
+ | |- | ||
+ | | 0x1778 | ||
+ | | 0x68 * 17 | ||
+ | | Array of NpadSixAxisSensorFullKeyState | ||
|- | |- | ||
| 0x1E60 | | 0x1E60 | ||
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadSixAxisSensorHandheldHeader |
+ | |- | ||
+ | | 0x1E80 | ||
+ | | 0x68 * 17 | ||
+ | | Array of NpadSixAxisSensorHandheldState | ||
|- | |- | ||
| 0x2568 | | 0x2568 | ||
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadSixAxisSensorJoyLeftDualHeader |
+ | |- | ||
+ | | 0x2588 | ||
+ | | 0x68 * 17 | ||
+ | | Array of NpadSixAxisSensorJoyLeftDualState | ||
|- | |- | ||
| 0x2C70 | | 0x2C70 | ||
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadSixAxisSensorJoyRightDualHeader |
+ | |- | ||
+ | | 0x2C90 | ||
+ | | 0x68 * 17 | ||
+ | | Array of NpadSixAxisSensorJoyRightDualState | ||
|- | |- | ||
| 0x3378 | | 0x3378 | ||
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadSixAxisSensorJoyLeftHeader |
+ | |- | ||
+ | | 0x3398 | ||
+ | | 0x68 * 17 | ||
+ | | Array of NpadSixAxisSensorJoyLeftState | ||
|- | |- | ||
| 0x3A80 | | 0x3A80 | ||
− | | 0x20 | + | | 0x20 |
− | | | + | | NpadSixAxisSensorJoyRightHeader |
+ | |- | ||
+ | | 0x3AA0 | ||
+ | | 0x68 * 17 | ||
+ | | Array of NpadSixAxisSensorJoyRightState | ||
|- | |- | ||
| 0x4188 | | 0x4188 | ||
Line 477: | Line 503: | ||
| 0x4190 | | 0x4190 | ||
| 0x8 | | 0x8 | ||
− | | | + | | [[#NpadSystemProperties]] |
|- | |- | ||
| 0x4198 | | 0x4198 | ||
| 0x4 | | 0x4 | ||
− | | | + | | [[#NpadSystemButtonProperties]] |
|- | |- | ||
| 0x419C | | 0x419C | ||
| 0x4 | | 0x4 | ||
− | | PowerInfo0 battery state | + | | PowerInfo0 battery state (must be 0-4) |
|- | |- | ||
| 0x41A0 | | 0x41A0 | ||
| 0x4 | | 0x4 | ||
− | | PowerInfo1 battery state | + | | PowerInfo1 battery state (must be 0-4) |
|- | |- | ||
| 0x41A4 | | 0x41A4 | ||
| 0x4 | | 0x4 | ||
− | | PowerInfo2 battery state | + | | PowerInfo2 battery state (must be 0-4) |
|- | |- | ||
− | | | + | | 0x41A8 |
− | | | + | | 0x20 (header) + 0x20 * 2 |
− | | | + | | NfcXcdDeviceHandleState |
|- | |- | ||
− | | | + | | 0x4208 |
− | | | + | | 0x8 |
− | | | + | | Mutex |
|- | |- | ||
+ | | 0x4248 | ||
+ | | 0x20 (header) + 0x18 * 17 | ||
+ | | NpadGcTriggerState | ||
|} | |} | ||
− | + | ==== NpadInternalStateHeader ==== | |
− | |||
− | ==== | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | + | ! Description | |
− | |||
− | |||
|- | |- | ||
− | + | | 0x0 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | | 0x0 | ||
| 0x4 | | 0x4 | ||
| Status, bit0 Pro Controller/HID controller, bit1 wired for handheld, bit2 pair, bit3 left, bit4 right | | Status, bit0 Pro Controller/HID controller, bit1 wired for handheld, bit2 pair, bit3 left, bit4 right | ||
Line 609: | Line 580: | ||
| 0x4 | | 0x4 | ||
| RGBA Button Color (left Joy-Con) | | RGBA Button Color (left Joy-Con) | ||
− | |||
|} | |} | ||
− | ==== | + | ==== NpadHandheldHeader ==== |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
| 0x0 | | 0x0 | ||
Line 635: | Line 604: | ||
| 0x8 | | 0x8 | ||
| Maximum Entry Index, always 16 | | Maximum Entry Index, always 16 | ||
− | |||
|} | |} | ||
− | ==== | + | ==== NpadHandheldState ==== |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
| 0x0 | | 0x0 | ||
Line 656: | Line 623: | ||
| 0x10 | | 0x10 | ||
| 0x8 | | 0x8 | ||
− | | Button State | + | | [[#Button State]] |
|- | |- | ||
| 0x18 | | 0x18 | ||
Line 677: | Line 644: | ||
| 0x8 | | 0x8 | ||
| Controller State (bit0 connected, bit1 wired) | | Controller State (bit0 connected, bit1 wired) | ||
− | |||
|} | |} | ||
===== Button State ===== | ===== Button State ===== | ||
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Bit |
− | ! | + | ! Button |
|- | |- | ||
| 0 | | 0 | ||
Line 764: | Line 729: | ||
| 25 | | 25 | ||
| SR | | SR | ||
− | |||
|} | |} | ||
− | ===== | + | ===== NpadSixAxisSensorHandheldHeader ===== |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
| 0x0 | | 0x0 | ||
Line 790: | Line 753: | ||
| 0x8 | | 0x8 | ||
| Maximum Entry Index, up to 16 | | Maximum Entry Index, up to 16 | ||
− | |||
|} | |} | ||
− | ===== | + | ===== NpadSixAxisSensorHandheldState ===== |
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
− | ! | + | ! Size |
− | ! | + | ! Description |
|- | |- | ||
| 0x0 | | 0x0 | ||
Line 834: | Line 796: | ||
Official sw copies the data from offset 0x8 size 0x60 to the final output state. | Official sw copies the data from offset 0x8 size 0x60 to the final output state. | ||
+ | |||
+ | ==== NpadSystemProperties ==== | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Bit | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0 | ||
+ | | PowerInfo0 isCharging | ||
+ | |- | ||
+ | | 1 | ||
+ | | PowerInfo1 isCharging | ||
+ | |- | ||
+ | | 2 | ||
+ | | PowerInfo2 isCharging | ||
+ | |- | ||
+ | | 3 | ||
+ | | PowerInfo0 powerConnected | ||
+ | |- | ||
+ | | 4 | ||
+ | | PowerInfo1 powerConnected | ||
+ | |- | ||
+ | | 5 | ||
+ | | PowerInfo2 powerConnected | ||
+ | |- | ||
+ | | 6-8 | ||
+ | | Unused | ||
+ | |- | ||
+ | | 9 | ||
+ | | UnsupportedButtonPressed_NpadSystem | ||
+ | |- | ||
+ | | 10 | ||
+ | | UnsupportedButtonPressed_NpadSystemExt | ||
+ | |- | ||
+ | | 11 | ||
+ | | AbxyButtonOriented | ||
+ | |- | ||
+ | | 12 | ||
+ | | SlSrButtonOriented | ||
+ | |- | ||
+ | | 13 | ||
+ | | [4.0.0+] PlusButtonCapability | ||
+ | |- | ||
+ | | 14 | ||
+ | | [4.0.0+] MinusButtonCapability | ||
+ | |- | ||
+ | | 15 | ||
+ | | [8.0.0+] DirectionalButtonsSupported | ||
+ | |- | ||
+ | | 16-63 | ||
+ | | Unused | ||
+ | |} | ||
+ | |||
+ | ==== NpadSystemButtonProperties ==== | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Bit | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0 | ||
+ | | UnintendedHomeButtonInputProtectionEnabled (if cleared) | ||
+ | |} |
Revision as of 19:53, 7 November 2019
HID shared memory is a 0x40000 byte read-only segment of memory shared between applications for input. The segment contains structures for most if not all input methods available to applications.
Memory Map
Offset | Size | Description |
---|---|---|
0x0 | 0x400 | DebugPad |
0x400 | 0x3000 | #TouchScreen |
0x3400 | 0x400 | #Mouse |
0x3800 | 0x400 | #Keyboard |
0x3C00 | 0x400 | BasicXpad |
0x4000 | 0x400 | Unknown, header and 17 entries |
0x4400 | 0x400 | Unknown, header and 17 entries |
0x4800 | 0x400 | Unknown, header and 17 entries |
0x4C00 | 0x200 | HomeButton |
0x4E00 | 0x200 | SleepButton |
0x5000 | 0x200 | CaptureButton |
0x5200 | 0x800 | InputDetector |
0x5A00 | 0x4000 | Controller Serials? |
0x9A00 | 0x32000 | Npad |
0x3BA00 | 0x4600 | Gesture |
0x3C200 | ? | [5.0.0+] ConsoleSixAxisSensor |
TouchScreen
Offset | Size | Description |
---|---|---|
0x0 | 0x28 | #TouchScreenHeader |
0x28 | 0x298 * 17 | Array of #TouchScreenState |
TouchScreenHeader
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in ticks? |
0x8 | 0x8 | Number of Entries, always 17 |
0x10 | 0x8 | Latest Entry Index |
0x18 | 0x8 | Maximum Entry Index, always 16 |
0x20 | 0x8 | Timestamp in samples |
TouchScreenState
Offset | Size | Description |
---|---|---|
0x0 | 0x10 | #TouchScreenStateHeader |
0x10 | 0x28 * 16 | #TouchScreenStateData |
TouchScreenStateHeader
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in samples |
0x8 | 0x8 | Touch count |
TouchScreenStateData
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in samples |
0x8 | 0x4 | Padding |
0xC | 0x4 | Touch Index |
0x10 | 0x4 | Touch X |
0x14 | 0x4 | Touch Y |
0x18 | 0x4 | Touch Diameter X |
0x1C | 0x4 | Touch Diameter Y |
0x20 | 0x4 | Angle |
0x24 | 0x4 | Padding |
Mouse
Offset | Size | Description |
---|---|---|
0x0 | 0x20 | #MouseHeader |
0x20 | 0x30 * 17 | Array of #MouseState |
MouseHeader
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in ticks? |
0x8 | 0x8 | Number of Entries, always 17 |
0x10 | 0x8 | Latest Entry Index |
0x18 | 0x8 | Maximum Entry Index, always 16 |
MouseState
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in samples |
0x8 | 0x8 | Timestamp in samples again? |
0x10 | 0x4 | Mouse X |
0x14 | 0x4 | Mouse Y |
0x18 | 0x4 | Mouse X Change |
0x1C | 0x4 | Mouse Y Change |
0x20 | 0x4 | Scroll Change Y |
0x24 | 0x4 | Scroll Change X |
0x28 | 0x8 | Mouse Buttons |
Keyboard
Offset | Size | Description |
---|---|---|
0x0 | 0x20 | #KeyboardHeader |
0x20 | 0x38 * 17 | Array of #KeyboardState |
KeyboardHeader
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in ticks? |
0x8 | 0x8 | Number of Entries, always 17 |
0x10 | 0x8 | Latest Entry Index |
0x18 | 0x8 | Maximum Entry Index, always 16 |
KeyboardState
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in samples |
0x8 | 0x8 | Timestamp in samples again? |
0x10 | 0x8 | Modifier Mask |
0x18 | 0x20 | Keys Down, each key gets one bit based on the HID keyboard scan code (F1 is 0x3A, bit 0x3A is set) |
Controller Serials?
This section contains a series of 16 structures 0x400 bytes large.
Offset | Size in bytes | Description |
---|---|---|
0x30 | 0xE | Controller Serial |
0x60 | 0xE | Controller Serial |
Npad
This section contains a series of 10 0x5000 byte structures describing each available controller.
Controller Index | Description |
---|---|
0 to 7 | Players 1 to 8 |
8 | Handheld Mode |
9 | Unknown |
NpadInternalState
Offset | Size | Description |
---|---|---|
0x0 | 0x28 | #NpadInternalStateHeader |
0x28 | 0x20 | NpadFullKeyHeader |
0x48 | 0x30 * 17 | Array of NpadFullKeyState |
0x378 | 0x20 | #NpadHandheldHeader |
0x398 | 0x30 * 17 | Array of #NpadHandheldState |
0x6C8 | 0x20 | NpadJoyDualHeader |
0x6E8 | 0x30 * 17 | Array of NpadJoyDualState |
0xA18 | 0x20 | NpadJoyLeftHeader |
0xA38 | 0x30 * 17 | Array of NpadJoyLeftState |
0xD68 | 0x20 | NpadJoyRightHeader |
0xD88 | 0x30 * 17 | Array of NpadJoyRightState |
0x10B8 | 0x20 | NpadPalmaHeader |
0x12B8 | 0x30 * 17 | Array of NpadPalmaState |
0x1408 | 0x20 | NpadSystemExtHeader |
0x1428 | 0x30 * 17 | Array of NpadSystemExtState |
0x1758 | 0x20 | NpadSixAxisSensorFullKeyHeader |
0x1778 | 0x68 * 17 | Array of NpadSixAxisSensorFullKeyState |
0x1E60 | 0x20 | NpadSixAxisSensorHandheldHeader |
0x1E80 | 0x68 * 17 | Array of NpadSixAxisSensorHandheldState |
0x2568 | 0x20 | NpadSixAxisSensorJoyLeftDualHeader |
0x2588 | 0x68 * 17 | Array of NpadSixAxisSensorJoyLeftDualState |
0x2C70 | 0x20 | NpadSixAxisSensorJoyRightDualHeader |
0x2C90 | 0x68 * 17 | Array of NpadSixAxisSensorJoyRightDualState |
0x3378 | 0x20 | NpadSixAxisSensorJoyLeftHeader |
0x3398 | 0x68 * 17 | Array of NpadSixAxisSensorJoyLeftState |
0x3A80 | 0x20 | NpadSixAxisSensorJoyRightHeader |
0x3AA0 | 0x68 * 17 | Array of NpadSixAxisSensorJoyRightState |
0x4188 | 0x4 | DeviceType |
0x418C | 0x4 | Padding |
0x4190 | 0x8 | #NpadSystemProperties |
0x4198 | 0x4 | #NpadSystemButtonProperties |
0x419C | 0x4 | PowerInfo0 battery state (must be 0-4) |
0x41A0 | 0x4 | PowerInfo1 battery state (must be 0-4) |
0x41A4 | 0x4 | PowerInfo2 battery state (must be 0-4) |
0x41A8 | 0x20 (header) + 0x20 * 2 | NfcXcdDeviceHandleState |
0x4208 | 0x8 | Mutex |
0x4248 | 0x20 (header) + 0x18 * 17 | NpadGcTriggerState |
NpadInternalStateHeader
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Status, bit0 Pro Controller/HID controller, bit1 wired for handheld, bit2 pair, bit3 left, bit4 right |
0x4 | 0x4 | Is Joy-Con Half |
0x8 | 0x4 | bit1 color set does not exist |
0xC | 0x4 | RGBA Body Color (single Joy-Con or Pro Controller) |
0x10 | 0x4 | RGBA Button Color (single Joy-Con or Pro Controller) |
0x14 | 0x4 | bit1 color set does not exist |
0x18 | 0x4 | RGBA Body Color (right Joy-Con) |
0x1C | 0x4 | RGBA Button Color (right Joy-Con) |
0x20 | 0x4 | RGBA Body Color (left Joy-Con) |
0x24 | 0x4 | RGBA Button Color (left Joy-Con) |
NpadHandheldHeader
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in ticks? |
0x8 | 0x8 | Number of entries, always 17 |
0x10 | 0x8 | Latest Entry Index |
0x18 | 0x8 | Maximum Entry Index, always 16 |
NpadHandheldState
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in samples |
0x8 | 0x8 | Timestamp in samples again |
0x10 | 0x8 | #Button State |
0x18 | 0x4 | Left Joystick X |
0x1C | 0x4 | Left Joystick Y |
0x20 | 0x4 | Right Joystick X |
0x24 | 0x4 | Right Joystick Y |
0x28 | 0x8 | Controller State (bit0 connected, bit1 wired) |
Button State
Bit | Button |
---|---|
0 | A |
1 | B |
2 | X |
3 | Y |
4 | Left Stick Pressed |
5 | Right Stick Pressed |
6 | L |
7 | R |
8 | ZL |
9 | ZR |
10 | Plus |
11 | Minus |
12 | Left |
13 | Up |
14 | Right |
15 | Down |
16 | Left Stick Left |
17 | Left Stick Up |
18 | Left Stick Right |
19 | Left Stick Down |
20 | Right Stick Left |
21 | Right Stick Up |
22 | Right Stick Right |
23 | Right Stick Down |
24 | SL |
25 | SR |
NpadSixAxisSensorHandheldHeader
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in ticks? |
0x8 | 0x8 | Number of entries, always 17 |
0x10 | 0x8 | Latest Entry Index |
0x18 | 0x8 | Maximum Entry Index, up to 16 |
NpadSixAxisSensorHandheldState
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Timestamp in samples |
0x8 | 0x8 | Unknown |
0x10 | 0x8 | Timestamp in samples again |
0x1C | 0x4 * 3 | Accelerometer data as 3 floats |
0x24 | 0x4 * 3 | Gyroscope data as 3 floats |
0x30 | 0x4 * 3 | Unknown sensor data as 3 floats |
0x3C | 0x4 * 9 | Orientation basis as 3x3 matrix of floats |
0x60 | 0x8 | Unknown, always 1 |
Official sw copies the data from offset 0x8 size 0x60 to the final output state.
NpadSystemProperties
Bit | Description |
---|---|
0 | PowerInfo0 isCharging |
1 | PowerInfo1 isCharging |
2 | PowerInfo2 isCharging |
3 | PowerInfo0 powerConnected |
4 | PowerInfo1 powerConnected |
5 | PowerInfo2 powerConnected |
6-8 | Unused |
9 | UnsupportedButtonPressed_NpadSystem |
10 | UnsupportedButtonPressed_NpadSystemExt |
11 | AbxyButtonOriented |
12 | SlSrButtonOriented |
13 | [4.0.0+] PlusButtonCapability |
14 | [4.0.0+] MinusButtonCapability |
15 | [8.0.0+] DirectionalButtonsSupported |
16-63 | Unused |
NpadSystemButtonProperties
Bit | Description |
---|---|
0 | UnintendedHomeButtonInputProtectionEnabled (if cleared) |