HID Shared Memory: Difference between revisions
		
		
		
		Jump to navigation
		Jump to search
		
No edit summary  | 
				|||
| Line 12: | Line 12: | ||
| 0x0  | | 0x0  | ||
| 0x400  | | 0x400  | ||
| DebugPad  | | [[#DebugPad]]  | ||
|-  | |-  | ||
| 0x400  | | 0x400  | ||
| Line 28: | Line 28: | ||
| 0x3C00  | | 0x3C00  | ||
| 0x1000 (0x400 * 0x04)  | | 0x1000 (0x400 * 0x04)  | ||
| BasicXpad  | | [[#BasicXpad]]  | ||
|-  | |-  | ||
| 0x4C00  | | 0x4C00  | ||
| Line 63: | Line 63: | ||
|}  | |}  | ||
==   | == DebugPad ==  | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
| Line 71: | Line 71: | ||
|-  | |-  | ||
| 0x0  | | 0x0  | ||
|   | | 0x20  | ||
| [[#  | | [[#DebugPadHeader]]  | ||
|-  | |-  | ||
|   | | 0x20  | ||
|   | | 0x28 * 17  | ||
| Array of [[#  | | Array of [[#DebugPadState]]  | ||
|}  | |}  | ||
===   | === DebugPadHeader ===  | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
| Line 88: | Line 88: | ||
| 0x0  | | 0x0  | ||
| 0x8  | | 0x8  | ||
| Timestamp in ticks  | | Timestamp in ticks  | ||
|-  | |-  | ||
| 0x8  | | 0x8  | ||
| 0x8  | | 0x8  | ||
| Number of Entries  | | Number of Entries (always 17)  | ||
|-  | |-  | ||
| 0x10  | | 0x10  | ||
| Line 100: | Line 100: | ||
| 0x18  | | 0x18  | ||
| 0x8  | | 0x8  | ||
| Maximum Entry Index  | | Maximum Entry Index (always 16)  | ||
|}  | |||
=== DebugPadState ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
| Timestamp in samples (global)  | |||
|-  | |||
| 0x8  | |||
| 0x20  | |||
|   | |||
|}  | |||
== TouchScreen ==  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x20  | |||
| [[#TouchScreenHeader]]  | |||
|-  | |-  | ||
| 0x20  | | 0x20  | ||
|   | | 0x298 * 17  | ||
|   | | Array of [[#TouchScreenState]]  | ||
|}  | |}  | ||
===   | === TouchScreenHeader ===  | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
| Line 115: | Line 143: | ||
|-  | |-  | ||
| 0x0  | | 0x0  | ||
| 0x8  | |||
| Timestamp in ticks  | |||
|-  | |||
| 0x8  | |||
| 0x8  | |||
| Number of Entries (always 17)  | |||
|-  | |||
| 0x10  | | 0x10  | ||
|   | | 0x8  | ||
| Latest Entry Index  | |||
|-  | |-  | ||
|   | | 0x18  | ||
|   | | 0x8  | ||
|   | | Maximum Entry Index (always 16)  | ||
|}  | |}  | ||
===  | === TouchScreenState ===  | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
| Line 131: | Line 167: | ||
|-  | |-  | ||
| 0x0  | | 0x0  | ||
| 0x8  | |||
| Timestamp in samples (global)  | |||
|-  | |||
| 0x8  | |||
| 0x8  | | 0x8  | ||
| Timestamp in samples  | | Timestamp in samples  | ||
|-  | |-  | ||
|   | | 0x10  | ||
| 0x8  | | 0x8  | ||
| Touch count  | | Touch count  | ||
|-  | |||
| 0x18  | |||
| 0x28 * 16  | |||
| [[#TouchScreenStateData]]  | |||
|}  | |}  | ||
| Line 208: | Line 252: | ||
| 0x0  | | 0x0  | ||
| 0x8  | | 0x8  | ||
| Timestamp in ticks  | | Timestamp in ticks  | ||
|-  | |-  | ||
| 0x8  | | 0x8  | ||
| 0x8  | | 0x8  | ||
| Number of Entries  | | Number of Entries (always 17)  | ||
|-  | |-  | ||
| 0x10  | | 0x10  | ||
| Line 220: | Line 264: | ||
| 0x18  | | 0x18  | ||
| 0x8  | | 0x8  | ||
| Maximum Entry Index  | | Maximum Entry Index (always 16)  | ||
|}  | |}  | ||
| Line 232: | Line 276: | ||
| 0x0  | | 0x0  | ||
| 0x8  | | 0x8  | ||
| Timestamp in samples  | | Timestamp in samples (global)  | ||
|-  | |-  | ||
| 0x8  | | 0x8  | ||
| 0x8  | | 0x8  | ||
| Timestamp in samples   | | Timestamp in samples  | ||
|-  | |-  | ||
| 0x10  | | 0x10  | ||
| Line 292: | Line 336: | ||
| 0x0  | | 0x0  | ||
| 0x8  | | 0x8  | ||
| Timestamp in ticks  | | Timestamp in ticks  | ||
|-  | |-  | ||
| 0x8  | | 0x8  | ||
| 0x8  | | 0x8  | ||
| Number of Entries  | | Number of Entries (always 17)  | ||
|-  | |-  | ||
| 0x10  | | 0x10  | ||
| Line 304: | Line 348: | ||
| 0x18	  | | 0x18	  | ||
| 0x8  | | 0x8  | ||
| Maximum Entry Index  | | Maximum Entry Index (always 16)  | ||
|}  | |}  | ||
| Line 316: | Line 360: | ||
| 0x0  | | 0x0  | ||
| 0x8  | | 0x8  | ||
| Timestamp in samples  | | Timestamp in samples (global)  | ||
|-  | |-  | ||
| 0x8  | | 0x8  | ||
| 0x8  | | 0x8  | ||
| Timestamp in samples   | | Timestamp in samples  | ||
|-  | |-  | ||
| 0x10  | | 0x10  | ||
| Line 329: | Line 373: | ||
| 0x20  | | 0x20  | ||
| Keys Down, each key gets one bit based on the HID keyboard scan code (F1 is 0x3A, bit 0x3A is set)  | | Keys Down, each key gets one bit based on the HID keyboard scan code (F1 is 0x3A, bit 0x3A is set)  | ||
|}  | |||
== BasicXpad ==  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x20  | |||
| [[#BasicXpadHeader]]  | |||
|-  | |||
| 0x20  | |||
| 0x28 * 17  | |||
| Array of [[#BasicXpadState]]  | |||
|}  | |||
=== BasicXpadHeader ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! 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)  | |||
|}  | |||
=== BasicXpadState ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
| Timestamp in samples (global)  | |||
|-  | |||
| 0x8  | |||
| 0x20  | |||
|   | |||
|}  | |||
== HomeButton ==  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x20  | |||
| [[#HomeButtonHeader]]  | |||
|-  | |||
| 0x20  | |||
| 0x18 * 17  | |||
| Array of [[#HomeButtonState]]  | |||
|}  | |||
=== HomeButtonHeader ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! 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)  | |||
|}  | |||
=== HomeButtonState ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
| Timestamp in samples (global)  | |||
|-  | |||
| 0x8  | |||
| 0x10  | |||
|   | |||
|}  | |||
== SleepButton ==  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x20  | |||
| [[#SleepButtonHeader]]  | |||
|-  | |||
| 0x20  | |||
| 0x18 * 17  | |||
| Array of [[#SleepButtonState]]  | |||
|}  | |||
=== SleepButtonHeader ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! 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)  | |||
|}  | |||
=== SleepButtonState ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
| Timestamp in samples (global)  | |||
|-  | |||
| 0x8  | |||
| 0x10  | |||
|   | |||
|}  | |||
== CaptureButton ==  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x20  | |||
| [[#CaptureButtonHeader]]  | |||
|-  | |||
| 0x20  | |||
| 0x18 * 17  | |||
| Array of [[#CaptureButtonState]]  | |||
|}  | |||
=== CaptureButtonHeader ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! 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)  | |||
|}  | |||
=== CaptureButtonState ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
| Timestamp in samples (global)  | |||
|-  | |||
| 0x8  | |||
| 0x10  | |||
|   | |||
|}  | |||
== InputDetector ==  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x20  | |||
| [[#InputDetectorHeader]]  | |||
|-  | |||
| 0x20  | |||
| 0x18 * 2  | |||
| Array of [[#InputDetectorState]]  | |||
|}  | |||
=== InputDetectorHeader ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! 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)  | |||
|}  | |||
=== InputDetectorState ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
| Timestamp in samples (global)  | |||
|-  | |||
| 0x8  | |||
| 0x10  | |||
|   | |||
|}  | |}  | ||
| Line 336: | Line 660: | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
!   | ! Offset  | ||
!   | ! Size in bytes  | ||
!   | ! Description  | ||
|-  | |-  | ||
| 0x30  | | 0x30  | ||
| Line 612: | Line 936: | ||
| 0x0  | | 0x0  | ||
| 0x8  | | 0x8  | ||
| Timestamp in samples  | | Timestamp in samples (global)  | ||
|-  | |-  | ||
| 0x8  | | 0x8  | ||
| 0x8  | | 0x8  | ||
| Timestamp in samples   | | Timestamp in samples  | ||
|-  | |-  | ||
| 0x10  | | 0x10  | ||
| Line 739: | Line 1,063: | ||
| 0x0  | | 0x0  | ||
| 0x8  | | 0x8  | ||
| Timestamp in ticks  | | Timestamp in ticks  | ||
|-  | |-  | ||
| 0x8  | | 0x8  | ||
| 0x8  | | 0x8  | ||
| Number of entries  | | Number of entries (always 17)  | ||
|-  | |-  | ||
| 0x10  | | 0x10  | ||
| Line 751: | Line 1,075: | ||
| 0x18  | | 0x18  | ||
| 0x8  | | 0x8  | ||
| Maximum Entry Index  | | Maximum Entry Index (up to 16)  | ||
|}  | |}  | ||
| Line 763: | Line 1,087: | ||
| 0x0  | | 0x0  | ||
| 0x8  | | 0x8  | ||
| Timestamp in samples  | | Timestamp in samples (global)  | ||
|-  | |-  | ||
| 0x8  | | 0x8  | ||
| Line 771: | Line 1,095: | ||
| 0x10  | | 0x10  | ||
| 0x8  | | 0x8  | ||
| Timestamp in samples   | | Timestamp in samples  | ||
|-  | |-  | ||
| 0x1C  | | 0x1C  | ||
| Line 856: | Line 1,180: | ||
| 0  | | 0  | ||
| UnintendedHomeButtonInputProtectionEnabled (if cleared)  | | UnintendedHomeButtonInputProtectionEnabled (if cleared)  | ||
|}  | |||
== Gesture ==  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x20  | |||
| [[#GestureHeader]]  | |||
|-  | |||
| 0x20  | |||
| 0x68 * 17  | |||
| Array of [[#GestureState]]  | |||
|}  | |||
=== GestureHeader ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! 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)  | |||
|}  | |||
=== GestureState ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
| Timestamp in samples (global)  | |||
|-  | |||
| 0x8  | |||
| 0x60  | |||
|   | |||
|}  | |||
== ConsoleSixAxisSensor ==  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
|   | |||
|-  | |||
| 0x8  | |||
| 0x1  | |||
|   | |||
|-  | |||
| 0x9  | |||
| 0x3  | |||
| Padding  | |||
|-  | |||
| 0xC  | |||
| 0x4  | |||
|   | |||
|-  | |||
| 0x10  | |||
| 0xC  | |||
|   | |||
|-  | |||
| 0x1C  | |||
| 0x4  | |||
| Padding  | |||
|}  | |}  | ||
Revision as of 19:59, 16 January 2020
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.
In sdknso this is "nn::hid::detail::SharedMemoryFormat".
Memory Map
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x400 | #DebugPad | 
| 0x400 | 0x3000 | #TouchScreen | 
| 0x3400 | 0x400 | #Mouse | 
| 0x3800 | 0x400 | #Keyboard | 
| 0x3C00 | 0x1000 (0x400 * 0x04) | #BasicXpad | 
| 0x4C00 | 0x200 | HomeButton | 
| 0x4E00 | 0x200 | SleepButton | 
| 0x5000 | 0x200 | CaptureButton | 
| 0x5200 | 0x800 (0x80 * 0x10) | InputDetector | 
| 0x5A00 | 0x4000 (0x400 * 0x10) | #UniquePad | 
| 0x9A00 | 0x32000 (0x5000 * 0x0A) | Npad | 
| 0x3BA00 | 0x800 | Gesture | 
| 0x3C200 | 0x20 | [5.0.0+] ConsoleSixAxisSensor | 
DebugPad
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x20 | #DebugPadHeader | 
| 0x20 | 0x28 * 17 | Array of #DebugPadState | 
DebugPadHeader
| 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) | 
DebugPadState
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x8 | Timestamp in samples (global) | 
| 0x8 | 0x20 | 
TouchScreen
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x20 | #TouchScreenHeader | 
| 0x20 | 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) | 
TouchScreenState
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x8 | Timestamp in samples (global) | 
| 0x8 | 0x8 | Timestamp in samples | 
| 0x10 | 0x8 | Touch count | 
| 0x18 | 0x28 * 16 | #TouchScreenStateData | 
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 (global) | 
| 0x8 | 0x8 | Timestamp in samples | 
| 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 (global) | 
| 0x8 | 0x8 | Timestamp in samples | 
| 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) | 
BasicXpad
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x20 | #BasicXpadHeader | 
| 0x20 | 0x28 * 17 | Array of #BasicXpadState | 
BasicXpadHeader
| 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) | 
BasicXpadState
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x8 | Timestamp in samples (global) | 
| 0x8 | 0x20 | 
HomeButton
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x20 | #HomeButtonHeader | 
| 0x20 | 0x18 * 17 | Array of #HomeButtonState | 
HomeButtonHeader
| 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) | 
HomeButtonState
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x8 | Timestamp in samples (global) | 
| 0x8 | 0x10 | 
SleepButton
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x20 | #SleepButtonHeader | 
| 0x20 | 0x18 * 17 | Array of #SleepButtonState | 
SleepButtonHeader
| 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) | 
SleepButtonState
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x8 | Timestamp in samples (global) | 
| 0x8 | 0x10 | 
CaptureButton
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x20 | #CaptureButtonHeader | 
| 0x20 | 0x18 * 17 | Array of #CaptureButtonState | 
CaptureButtonHeader
| 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) | 
CaptureButtonState
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x8 | Timestamp in samples (global) | 
| 0x8 | 0x10 | 
InputDetector
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x20 | #InputDetectorHeader | 
| 0x20 | 0x18 * 2 | Array of #InputDetectorState | 
InputDetectorHeader
| 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) | 
InputDetectorState
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x8 | Timestamp in samples (global) | 
| 0x8 | 0x10 | 
UniquePad
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.
| 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 | NfcXcdDeviceHandleHeader | 
| 0x41C8 | 0x20 * 2 | Array of NfcXcdDeviceHandleState | 
| 0x4208 | 0x8 | Mutex | 
| 0x4248 | 0x20 | NpadGcTriggerHeader | 
| 0x4268 | 0x18 * 17 | Array of 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 (global) | 
| 0x8 | 0x8 | Timestamp in samples | 
| 0x10 | 0x8 | #NpadButton | 
| 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) | 
NpadButton
This is the u64 bitmask for "nn::hid::NpadButton".
| 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 (global) | 
| 0x8 | 0x8 | Unknown | 
| 0x10 | 0x8 | Timestamp in samples | 
| 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) | 
Gesture
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x20 | #GestureHeader | 
| 0x20 | 0x68 * 17 | Array of #GestureState | 
GestureHeader
| 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) | 
GestureState
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x8 | Timestamp in samples (global) | 
| 0x8 | 0x60 | 
ConsoleSixAxisSensor
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0x8 | |
| 0x8 | 0x1 | |
| 0x9 | 0x3 | Padding | 
| 0xC | 0x4 | |
| 0x10 | 0xC | |
| 0x1C | 0x4 | Padding |