Difference between revisions of "HID Shared Memory"

From Nintendo Switch Brew
Jump to navigation Jump to search
Line 1: Line 1:
 
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.
 
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".
+
= SharedMemoryFormat =
 +
This is "nn::hid::detail::SharedMemoryFormat".
  
= Memory Map =
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 12: Line 12:
 
| 0x0
 
| 0x0
 
| 0x400
 
| 0x400
| [[#DebugPad]]
+
| [[#DebugPadSharedMemoryFormat|DebugPad]]
 
|-
 
|-
 
| 0x400
 
| 0x400
 
| 0x3000
 
| 0x3000
| [[#TouchScreen]]
+
| [[#TouchScreenSharedMemoryFormat|TouchScreen]]
 
|-
 
|-
 
| 0x3400
 
| 0x3400
 
| 0x400
 
| 0x400
| [[#Mouse]]
+
| [[#MouseSharedMemoryFormat|Mouse]]
 
|-
 
|-
 
| 0x3800
 
| 0x3800
 
| 0x400
 
| 0x400
| [[#Keyboard]]
+
| [[#KeyboardSharedMemoryFormat|Keyboard]]
 
|-
 
|-
 
| 0x3C00
 
| 0x3C00
| 0x1000 (0x400 * 0x04)
+
| 0x1000
| [1.0.0-9.2.0] [[#BasicXpad]]
+
| [1.0.0-9.2.0] [[#BasicXpadSharedMemoryFormat|BasicXpad]]
 
|-
 
|-
 
| 0x3C00
 
| 0x3C00
 
|  
 
|  
| [10.0.0+] Digitizer
+
| [10.0.0+] [[#DigitizerSharedMemoryFormat|Digitizer]]
 
|-
 
|-
 
| 0x4C00
 
| 0x4C00
 
| 0x200
 
| 0x200
| [[#HomeButton]]
+
| [[#HomeButtonSharedMemoryFormat|HomeButton]]
 
|-
 
|-
 
| 0x4E00
 
| 0x4E00
 
| 0x200
 
| 0x200
| [[#SleepButton]]
+
| [[#SleepButtonSharedMemoryFormat|SleepButton]]
 
|-
 
|-
 
| 0x5000
 
| 0x5000
 
| 0x200
 
| 0x200
| [[#CaptureButton]]
+
| [[#CaptureButtonSharedMemoryFormat|CaptureButton]]
 
|-
 
|-
 
| 0x5200
 
| 0x5200
 
| 0x800 (0x80 * 0x10)
 
| 0x800 (0x80 * 0x10)
| [[#InputDetector]]
+
| [[#InputDetectorSharedMemoryFormat|InputDetector]]
 
|-
 
|-
 
| 0x5A00
 
| 0x5A00
 
| 0x4000 (0x400 * 0x10)
 
| 0x4000 (0x400 * 0x10)
| [1.0.0-4.1.0] [[#UniquePad]]
+
| [1.0.0-4.1.0] [[#UniquePadSharedMemoryFormat|UniquePad]]
 
|-
 
|-
 
| 0x9A00
 
| 0x9A00
 
| 0x32000 (0x5000 * 0x0A)
 
| 0x32000 (0x5000 * 0x0A)
| [[#Npad]]
+
| [[#NpadSharedMemoryFormat|Npad]]
 
|-
 
|-
 
| 0x3BA00
 
| 0x3BA00
 
| 0x800
 
| 0x800
| [[#Gesture]]
+
| [[#GestureSharedMemoryFormat|Gesture]]
 
|-
 
|-
 
| 0x3C200
 
| 0x3C200
 
| 0x20
 
| 0x20
| [5.0.0+] [[#ConsoleSixAxisSensor]]
+
| [5.0.0+] [[#ConsoleSixAxisSensorSharedMemoryFormat|ConsoleSixAxisSensor]]
 
|}
 
|}
  
== DebugPad ==
+
== DebugPadSharedMemoryFormat ==
 +
This is "nn::hid::detail::DebugPadSharedMemoryFormat".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 75: Line 77:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x20
+
| 0x2C8
| [[#DebugPadHeader]]
+
| [[#DebugPadLifo]]
|-
 
| 0x20
 
| 0x28 * 17
 
| Array of [[#DebugPadState]]
 
 
|}
 
|}
  
=== DebugPadHeader ===
+
=== DebugPadLifo ===
 +
This is "nn::hid::detail::DebugPadLifo". This is a RingLifo object.
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 92: Line 92:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in ticks
+
| RingLifoVptr
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Number of Entries (always 17)
+
| BufferCount
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Latest Entry Index
+
| Tail
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Maximum Entry Index (always 16)
+
| Count
 +
|-
 +
| 0x20
 +
| 0x28 * 17
 +
| Array of [[#DebugPadStateAtomicStorage]]
 
|}
 
|}
  
=== DebugPadState ===
+
==== DebugPadStateAtomicStorage ====
 +
This is "nn::hid::detail::DebugPadStateAtomicStorage".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 116: Line 122:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples (global)
+
| SamplingNumber
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x20
 
| 0x20
|  
+
| [[#DebugPadState]]
 
|}
 
|}
  
== TouchScreen ==
+
===== DebugPadState =====
 +
This is "nn::hid::DebugPadState".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 131: Line 139:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x20
+
| 0x8
| [[#TouchScreenHeader]]
+
| SamplingNumber
 
|-
 
|-
| 0x20
+
| 0x8
| 0x298 * 17
+
| 0x4
| Array of [[#TouchScreenState]]
+
| [[#DebugPadAttributeSet|Attributes]]
|}
 
 
 
=== TouchScreenHeader ===
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Offset
+
| 0xC
! Size
+
| 0x4
! Description
+
| [[#DebugPadButtonSet|Buttons]]
|-
 
| 0x0
 
| 0x8
 
| Timestamp in ticks
 
|-
 
| 0x8
 
| 0x8
 
| Number of Entries (always 17)
 
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Latest Entry Index
+
| [[#AnalogStickState|AnalogStickR]]
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Maximum Entry Index (always 16)
+
| [[#AnalogStickState|AnalogStickL]]
 
|}
 
|}
  
=== TouchScreenState ===
+
== TouchScreenSharedMemoryFormat ==
 +
This is "nn::hid::detail::TouchScreenSharedMemoryFormat".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 171: Line 169:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x8
+
| 0x2C38
| Timestamp in samples (global)
+
| [[#TouchScreenLifo]]
 +
|}
 +
 
 +
=== TouchScreenLifo ===
 +
This is "nn::hid::detail::TouchScreenLifo". This is a RingLifo object.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| RingLifoVptr
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x8
+
| 0x8
| Timestamp in samples
+
| BufferCount
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Touch count
+
| Tail
 
|-
 
|-
 
| 0x18
 
| 0x18
| 0x28 * 16
+
| 0x8
| [[#TouchScreenStateData]]
+
| Count
 +
|-
 +
| 0x20
 +
| 0x298 * 17
 +
| Array of [[#TouchScreenStateAtomicStorage]]
 
|}
 
|}
  
==== TouchScreenStateData ====
+
==== TouchScreenStateAtomicStorage ====
 +
This is "nn::hid::detail::TouchScreenStateAtomicStorage".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 196: Line 214:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples
+
| SamplingNumber
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x4
+
| 0x290
| Padding
+
| [[#TouchScreenState]]
 +
|}
 +
 
 +
===== TouchScreenState =====
 +
This is "nn::hid::detail::TouchScreenState".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0xC
+
! Offset
| 0x4
+
! Size
| Touch Index
+
! Description
 
|-
 
|-
| 0x10
+
| 0x0
| 0x4
+
| 0x8
| Touch X
+
| SamplingNumber
 
|-
 
|-
| 0x14
+
| 0x8
 
| 0x4
 
| 0x4
| Touch Y
+
| Count
 
|-
 
|-
| 0x18
+
| 0xC
 
| 0x4
 
| 0x4
| Touch Diameter X
+
| Reserved
 
|-
 
|-
| 0x1C
+
| 0x10
| 0x4
+
| 0x28 * 16
| Touch Diameter Y
+
| [[#TouchState|Touches]]
|-
 
| 0x20
 
| 0x4
 
| Angle
 
|-
 
| 0x24
 
| 0x4
 
| Padding
 
 
|}
 
|}
  
== Mouse ==
+
====== TouchState ======
{| class="wikitable" border="1"
+
This is "nn::hid::TouchState".
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x20
 
| [[#MouseHeader]]
 
|-
 
| 0x20
 
| 0x30 * 17
 
| Array of [[#MouseState]]
 
|}
 
  
=== MouseHeader ===
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 256: Line 258:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in ticks
+
| DeltaTime
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x8
+
| 0x4
| Number of Entries (always 17)
+
| [[#TouchAttributeSet|Attributes]]
 +
|-
 +
| 0xC
 +
| 0x4
 +
| FingerId
 
|-
 
|-
 
| 0x10
 
| 0x10
| 0x8
+
| 0x4
| Latest Entry Index
+
| X
 +
|-
 +
| 0x14
 +
| 0x4
 +
| Y
 
|-
 
|-
 
| 0x18
 
| 0x18
| 0x8
+
| 0x4
| Maximum Entry Index (always 16)
+
| DiameterX
|}
 
 
 
=== MouseState ===
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Offset
+
| 0x1C
! Size
+
| 0x4
! Description
+
| DiameterY
|-
 
| 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
 
| 0x20
 
| 0x4
 
| 0x4
| Scroll Change Y
+
| RotationAngle
 
|-
 
|-
 
| 0x24
 
| 0x24
 
| 0x4
 
| 0x4
| Scroll Change X
+
| Reserved
|-
 
| 0x28
 
| 0x8
 
| Mouse Buttons
 
 
|}
 
|}
  
== Keyboard ==
+
== MouseSharedMemoryFormat ==
 +
This is "nn::hid::detail::MouseSharedMemoryFormat".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 322: Line 302:
 
! Description
 
! Description
 
|-
 
|-
| 0x0
+
| 0x0
| 0x20
+
| 0x350
| [[#KeyboardHeader]]
+
| [[#MouseLifo]]
|-
 
| 0x20
 
| 0x38 * 17
 
| Array of [[#KeyboardState]]
 
 
|}
 
|}
  
=== KeyboardHeader ===
+
=== MouseLifo ===
 +
This is "nn::hid::detail::MouseLifo". This is a RingLifo object.
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 340: Line 318:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in ticks
+
| RingLifoVptr
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Number of Entries (always 17)
+
| BufferCount
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Latest Entry Index
+
| Tail
 
|-
 
|-
| 0x18
+
| 0x18
 
| 0x8
 
| 0x8
| Maximum Entry Index (always 16)
+
| Count
 +
|-
 +
| 0x20
 +
| 0x30 * 17
 +
| Array of [[#MouseStateAtomicStorage]]
 
|}
 
|}
  
=== KeyboardState ===
+
==== MouseStateAtomicStorage ====
 +
This is "nn::hid::detail::MouseStateAtomicStorage".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 364: Line 348:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples (global)
+
| SamplingNumber
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x8
+
| 0x28
| Timestamp in samples
+
| [[#MouseState]]
|-
 
| 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 ==
+
===== MouseState =====
 +
This is "nn::hid::detail::MouseState".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 387: Line 365:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x20
+
| 0x8
| [[#BasicXpadHeader]]
+
| SamplingNumber
 
|-
 
|-
| 0x20
+
| 0x8
| 0x28 * 17
+
| 0x4
| Array of [[#BasicXpadState]]
+
| X
 +
|-
 +
| 0xC
 +
| 0x4
 +
| Y
 +
|-
 +
| 0x10
 +
| 0x4
 +
| DeltaX
 +
|-
 +
| 0x14
 +
| 0x4
 +
| DeltaY
 +
|-
 +
| 0x18
 +
| 0x4
 +
| WheelDeltaX
 +
|-
 +
| 0x1C
 +
| 0x4
 +
| WheelDeltaY
 +
|-
 +
| 0x20
 +
| 0x4
 +
| [[#MouseButtonSet|Buttons]]
 +
|-
 +
| 0x24
 +
| 0x4
 +
| [[#MouseAttributeSet|Attributes]]
 
|}
 
|}
  
=== BasicXpadHeader ===
+
== KeyboardSharedMemoryFormat ==
 +
This is "nn::hid::detail::KeyboardSharedMemoryFormat".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x3D8
 +
| [[#KeyboardLifo]]
 +
|}
 +
 
 +
=== KeyboardLifo ===
 +
This is "nn::hid::detail::KeyboardLifo". This is a RingLifo object.
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 404: Line 426:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in ticks
+
| RingLifoVptr
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Number of Entries (always 17)
+
| BufferCount
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Latest Entry Index
+
| Tail
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Maximum Entry Index (always 16)
+
| Count
 +
|-
 +
| 0x20
 +
| 0x38 * 17
 +
| Array of [[#KeyboardStateAtomicStorage]]
 
|}
 
|}
  
=== BasicXpadState ===
+
==== KeyboardStateAtomicStorage ====
 +
This is "nn::hid::detail::KeyboardStateAtomicStorage".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 428: Line 456:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples (global)
+
| SamplingNumber
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x20
+
| 0x30
|  
+
| [[#KeyboardState]]
 
|}
 
|}
  
== HomeButton ==
+
===== KeyboardState =====
 +
This is "nn::hid::detail::KeyboardState".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 443: Line 473:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x20
+
| 0x8
| [[#HomeButtonHeader]]
+
| SamplingNumber
 
|-
 
|-
 +
| 0x8
 +
| 0x8
 +
| [[#KeyboardModifierSet|Modifiers]]
 +
|-
 +
| 0x10
 
| 0x20
 
| 0x20
| 0x18 * 17
+
| [[#KeyboardKeySet|Keys]]
| Array of [[#HomeButtonState]]
 
 
|}
 
|}
  
=== HomeButtonHeader ===
+
== BasicXpadSharedMemoryFormat ==
 +
This is "nn::hid::detail::BasicXpadSharedMemoryFormat".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 459: Line 495:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x8
+
| 0x400 * 4
| Timestamp in ticks
+
| Array of [[#BasicXpadSharedMemoryEntry]]
 +
|}
 +
 
 +
=== BasicXpadSharedMemoryEntry ===
 +
This is "nn::hid::detail::BasicXpadSharedMemoryEntry".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x8
+
! Offset
| 0x8
+
! Size
| Number of Entries (always 17)
+
! Description
 
|-
 
|-
| 0x10
+
| 0x0
| 0x8
+
| 0x2C8
| Latest Entry Index
+
| [[#BasicXpadLifo]]
|-
 
| 0x18
 
| 0x8
 
| Maximum Entry Index (always 16)
 
 
|}
 
|}
  
=== HomeButtonState ===
+
==== BasicXpadLifo ====
 +
This is "nn::hid::detail::BasicXpadLifo". This is a RingLifo object.
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 484: Line 524:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples (global)
+
| RingLifoVptr
 
|-
 
|-
 
| 0x8
 
| 0x8
 +
| 0x8
 +
| BufferCount
 +
|-
 
| 0x10
 
| 0x10
|  
+
| 0x8
 +
| Tail
 +
|-
 +
| 0x18
 +
| 0x8
 +
| Count
 +
|-
 +
| 0x20
 +
| 0x28 * 17
 +
| Array of [[#BasicXpadStateAtomicStorage]]
 
|}
 
|}
  
== SleepButton ==
+
===== BasicXpadStateAtomicStorage =====
 +
This is "nn::hid::detail::BasicXpadStateAtomicStorage".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 499: Line 553:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x20
+
| 0x8
| [[#SleepButtonHeader]]
+
| SamplingNumber
 
|-
 
|-
 +
| 0x8
 
| 0x20
 
| 0x20
| 0x18 * 17
+
| [[#BasicXpadState]]
| Array of [[#SleepButtonState]]
 
 
|}
 
|}
  
=== SleepButtonHeader ===
+
====== BasicXpadState ======
 +
This is "nn::hid::detail::BasicXpadState".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 516: Line 572:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in ticks
+
| SamplingNumber
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x8
+
| 0x4
| Number of Entries (always 17)
+
| [[#BasicXpadAttributeSet|Attributes]]
 +
|-
 +
| 0xC
 +
| 0x4
 +
| [[#BasicXpadButtonSet|Buttons]]
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Latest Entry Index
+
| [[#AnalogStickState|AnalogStickL]]
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Maximum Entry Index (always 16)
+
| [[#AnalogStickState|AnalogStickR]]
 
|}
 
|}
  
=== SleepButtonState ===
+
== HomeButtonSharedMemoryFormat ==
 +
This is "nn::hid::detail::HomeButtonSharedMemoryFormat".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 539: Line 601:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x8
+
| 0x1B8
| Timestamp in samples (global)
+
| [[#HomeButtonLifo]]
|-
 
| 0x8
 
| 0x10
 
|  
 
 
|}
 
|}
  
== CaptureButton ==
+
=== HomeButtonLifo ===
{| class="wikitable" border="1"
+
This is "nn::hid::detail::HomeButtonLifo". This is a RingLifo object.
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x20
 
| [[#CaptureButtonHeader]]
 
|-
 
| 0x20
 
| 0x18 * 17
 
| Array of [[#CaptureButtonState]]
 
|}
 
  
=== CaptureButtonHeader ===
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 572: Line 616:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in ticks
+
| RingLifoVptr
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Number of Entries (always 17)
+
| BufferCount
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Latest Entry Index
+
| Tail
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Maximum Entry Index (always 16)
+
| Count
 +
|-
 +
| 0x20
 +
| 0x18 * 17
 +
| Array of [[#HomeButtonStateAtomicStorage]]
 
|}
 
|}
  
=== CaptureButtonState ===
+
==== HomeButtonStateAtomicStorage ====
 +
This is "nn::hid::detail::HomeButtonStateAtomicStorage".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 596: Line 646:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples (global)
+
| SamplingNumber
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x10
 
| 0x10
|  
+
| [[#HomeButtonState]]
 
|}
 
|}
  
== InputDetector ==
+
===== HomeButtonState =====
 +
This is "nn::hid::system::HomeButtonState".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 611: Line 663:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x20
+
| 0x8
| [[#InputDetectorHeader]]
+
| SamplingNumber
 
|-
 
|-
| 0x20
+
| 0x8
| 0x18 * 2
+
| 0x8
| Array of [[#InputDetectorState]]
+
| [[#HomeButtonSet|Buttons]]
 
|}
 
|}
  
=== InputDetectorHeader ===
+
== SleepButtonSharedMemoryFormat ==
 +
This is "nn::hid::detail::SleepButtonSharedMemoryFormat".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 627: Line 681:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x8
+
| 0x1B8
| Timestamp in ticks
+
| [[#SleepButtonLifo]]
|-
 
| 0x8
 
| 0x8
 
| Number of Entries (always 17)
 
|-
 
| 0x10
 
| 0x8
 
| Latest Entry Index
 
|-
 
| 0x18
 
| 0x8
 
| Maximum Entry Index (always 16)
 
 
|}
 
|}
  
=== InputDetectorState ===
+
=== SleepButtonLifo ===
 +
This is "nn::hid::detail::SleepButtonLifo". This is a RingLifo object.
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 652: Line 696:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples (global)
+
| RingLifoVptr
 
|-
 
|-
 
| 0x8
 
| 0x8
 +
| 0x8
 +
| BufferCount
 +
|-
 
| 0x10
 
| 0x10
|  
+
| 0x8
 +
| Tail
 +
|-
 +
| 0x18
 +
| 0x8
 +
| Count
 +
|-
 +
| 0x20
 +
| 0x18 * 17
 +
| Array of [[#SleepButtonStateAtomicStorage]]
 
|}
 
|}
  
== UniquePad ==
+
==== SleepButtonStateAtomicStorage ====
This section contains a series of 16 structures 0x400 bytes large.
+
This is "nn::hid::detail::SleepButtonStateAtomicStorage".
 
 
[5.0.0+] This section has been removed from SharedMemoryFormat. [[#UniquePad]] is now a specialization of [[#Npad]].
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 671: Line 725:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x80
+
| 0x8
| [[#UniquePadConfig]]
+
| SamplingNumber
 
|-
 
|-
| 0x80
+
| 0x8
| 0x70 * 2
+
| 0x10
| Array of [[#AnalogStickCalibration]]
+
| [[#SleepButtonState]]
 
|}
 
|}
  
=== UniquePadConfig ===
+
===== SleepButtonState =====
 +
This is "nn::hid::system::SleepButtonState".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 687: Line 743:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x20
+
| 0x8
| [[#UniquePadConfigHeader]]
+
| SamplingNumber
 
|-
 
|-
| 0x20
+
| 0x8
| 0x30 * 2
+
| 0x8
| Array of [[#UniquePadConfigState]]
+
| [[#SleepButtonSet|Buttons]]
 
|}
 
|}
  
==== UniquePadConfigHeader ====
+
== CaptureButtonSharedMemoryFormat ==
 +
This is "nn::hid::detail::CaptureButtonSharedMemoryFormat".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x1B8
 +
| [[#CaptureButtonLifo]]
 +
|}
 +
 
 +
=== CaptureButtonLifo ===
 +
This is "nn::hid::detail::CaptureButtonLifo". This is a RingLifo object.
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 704: Line 776:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in ticks
+
| RingLifoVptr
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Number of Entries (always 17)
+
| BufferCount
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Latest Entry Index
+
| Tail
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Maximum Entry Index (always 16)
+
| Count
 +
|-
 +
| 0x20
 +
| 0x18 * 17
 +
| Array of [[#CaptureButtonStateAtomicStorage]]
 
|}
 
|}
  
==== UniquePadConfigState ====
+
==== CaptureButtonStateAtomicStorage ====
 +
This is "nn::hid::detail::CaptureButtonStateAtomicStorage".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 728: Line 806:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples (global)
+
| SamplingNumber
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x8
 
|
 
|-
 
 
| 0x10
 
| 0x10
| 0x20
+
| [[#CaptureButtonState]]
| Controller Serial
 
 
|}
 
|}
  
=== AnalogStickCalibration ===
+
===== CaptureButtonState =====
 +
This is "nn::hid::system::CaptureButtonState".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 747: Line 823:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x20
+
| 0x8
| [[#AnalogStickCalibrationHeader]]
+
| SamplingNumber
|-
+
|-
| 0x20
+
| 0x8
| 0x28 * 2
+
| 0x8
| Array of [[#AnalogStickCalibrationState]]
+
| [[#CaptureButtonSet|Buttons]]
|}
+
|}
 
+
 
==== AnalogStickCalibrationHeader ====
+
== InputDetectorSharedMemoryFormat ==
{| class="wikitable" border="1"
+
This is "nn::hid::detail::InputDetectorSharedMemoryFormat".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x80 * 16
 +
| Array of [[#InputDetectorSharedMemoryEntry]]
 +
|}
 +
 
 +
=== InputDetectorSharedMemoryEntry ===
 +
This is "nn::hid::detail::InputDetectorSharedMemoryEntry".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x50
 +
| [[#InputDetectorLifo]]
 +
|}
 +
 
 +
==== InputDetectorLifo ====
 +
This is "nn::hid::detail::InputDetectorLifo". This is a RingLifo object.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| RingLifoVptr
 +
|-
 +
| 0x8
 +
| 0x8
 +
| BufferCount
 +
|-
 +
| 0x10
 +
| 0x8
 +
| Tail
 +
|-
 +
| 0x18
 +
| 0x8
 +
| Count
 +
|-
 +
| 0x20
 +
| 0x18 * 2
 +
| Array of [[#InputDetectorStateAtomicStorage]]
 +
|}
 +
 
 +
===== InputDetectorStateAtomicStorage =====
 +
This is "nn::hid::detail::InputDetectorStateAtomicStorage".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| SamplingNumber
 +
|-
 +
| 0x8
 +
| 0x10
 +
| [[#InputDetectorState]]
 +
|}
 +
 
 +
====== InputDetectorState ======
 +
This is "nn::hid::detail::InputDetectorState".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| InputSourceState
 +
|-
 +
| 0x8
 +
| 0x8
 +
| SamplingNumber
 +
|}
 +
 
 +
== UniquePadSharedMemoryFormat ==
 +
This is "nn::hid::detail::UniquePadSharedMemoryFormat".
 +
 
 +
[5.0.0+] This section has been removed from [[#SharedMemoryFormat]]. [[#UniquePadSharedMemoryFormat]] is now a specialization of [[#NpadSharedMemoryFormat]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x400 * 16
 +
| Array of [[#UniquePadSharedMemoryEntry]]
 +
|}
 +
 
 +
=== UniquePadSharedMemoryEntry ===
 +
This is "nn::hid::detail::UniquePadSharedMemoryEntry".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x1E0
 +
| [[#UniquePadLifo]]
 +
|}
 +
 
 +
==== UniquePadLifo ====
 +
This is "nn::hid::detail::UniquePadLifo". This is a RingLifo object.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x80
 +
| [[#UniquePadConfigLifo]]
 +
|-
 +
| 0x80
 +
| 0x70 * 2
 +
| Array of [[#AnalogStickCalibrationStateImplLifo]]
 +
|-
 +
| 0x160
 +
| 0x40
 +
| [[#SixAxisSensorUserCalibrationStateLifo]]
 +
|-
 +
| 0x1A0
 +
| 0x8
 +
| UniquePadConfigMutex
 +
|}
 +
 
 +
===== UniquePadConfigLifo =====
 +
This is "nn::hid::detail::UniquePadConfigLifo". This is a RingLifo object.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| RingLifoVptr
 +
|-
 +
| 0x8
 +
| 0x8
 +
| BufferCount
 +
|-
 +
| 0x10
 +
| 0x8
 +
| Tail
 +
|-
 +
| 0x18
 +
| 0x8
 +
| Count
 +
|-
 +
| 0x20
 +
| 0x30 * 2
 +
| Array of [[#UniquePadConfigAtomicStorage]]
 +
|}
 +
 
 +
====== UniquePadConfigAtomicStorage ======
 +
This is "nn::hid::detail::UniquePadConfigAtomicStorage".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| SamplingNumber
 +
|-
 +
| 0x8
 +
| 0x28
 +
| [[#UniquePadConfig]]
 +
|}
 +
 
 +
======= UniquePadConfig =======
 +
This is "nn::hid::detail::UniquePadConfig".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x4
 +
| [[#UniquePadType|Type]]
 +
|-
 +
| 0x4
 +
| 0x4
 +
| [[#UniquePadInterface|Interface]]
 +
|-
 +
| 0x8
 +
| 0x10
 +
| [[#UniquePadSerialNumber|SerialNumber]]
 +
|-
 +
| 0x18
 +
| 0x4
 +
| ControllerNumber
 +
|-
 +
| 0x1C
 +
| 0x1
 +
| IsActive
 +
|-
 +
| 0x1D
 +
| 0x3
 +
| Reserved
 +
|-
 +
| 0x20
 +
| 0x8
 +
| SamplingNumber
 +
|}
 +
 
 +
===== AnalogStickCalibrationStateImplLifo =====
 +
This is "nn::hid::detail::AnalogStickCalibrationStateImplLifo". This is a RingLifo object.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| RingLifoVptr
 +
|-
 +
| 0x8
 +
| 0x8
 +
| BufferCount
 +
|-
 +
| 0x10
 +
| 0x8
 +
| Tail
 +
|-
 +
| 0x18
 +
| 0x8
 +
| Count
 +
|-
 +
| 0x20
 +
| 0x28 * 2
 +
| Array of [[#AnalogStickCalibrationStateImpl]]
 +
|}
 +
 
 +
====== AnalogStickCalibrationStateImplAtomicStorage ======
 +
This is "nn::hid::detail::AnalogStickCalibrationStateImplAtomicStorage".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| SamplingNumber
 +
|-
 +
| 0x8
 +
| 0x20
 +
| [[#AnalogStickCalibrationStateImpl]]
 +
|}
 +
 
 +
======= AnalogStickCalibrationStateImpl =======
 +
This is "nn::hid::detail::AnalogStickCalibrationStateImpl".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| [[#AnalogStickState|State]]
 +
|-
 +
| 0x8
 +
| 0x8
 +
| [[#AnalogStickCalibrationFlagsSet|Flags]]
 +
|-
 +
| 0x10
 +
| 0x8
 +
| Stage
 +
|-
 +
| 0x18
 +
| 0x8
 +
| SamplingNumber
 +
|}
 +
 
 +
===== SixAxisSensorUserCalibrationStateLifo =====
 +
This is "nn::hid::detail::SixAxisSensorUserCalibrationStateLifo". This is a RingLifo object.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| RingLifoVptr
 +
|-
 +
| 0x8
 +
| 0x8
 +
| BufferCount
 +
|-
 +
| 0x10
 +
| 0x8
 +
| Tail
 +
|-
 +
| 0x18
 +
| 0x8
 +
| Count
 +
|-
 +
| 0x20
 +
| 0x20 * 2
 +
| Array of [[#SixAxisSensorUserCalibrationStateAtomicStorage]]
 +
|}
 +
 
 +
====== SixAxisSensorUserCalibrationStateAtomicStorage ======
 +
This is "nn::hid::detail::SixAxisSensorUserCalibrationStateAtomicStorage".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| SamplingNumber
 +
|-
 +
| 0x8
 +
| 0x18
 +
| [[#SixAxisSensorUserCalibrationState]]
 +
|}
 +
 
 +
======= UniquePadConfig =======
 +
This is "nn::hid::detail::UniquePadConfig".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
 
! Offset
 
! Offset
Line 764: Line 1,200:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in ticks
+
| [[#SixAxisSensorUserCalibrationFlagsSet|Flags]]
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Number of Entries (always 17)
+
| Stage
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Latest Entry Index
+
| SamplingNumber
|-
 
| 0x18
 
| 0x8
 
| Maximum Entry Index (always 16)
 
 
|}
 
|}
  
==== AnalogStickCalibrationState ====
+
== NpadSharedMemoryFormat ==
{| class="wikitable" border="1"
+
This is "nn::hid::detail::NpadSharedMemoryFormat".
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x8
 
| Timestamp in samples (global)
 
|-
 
| 0x8
 
| 0x28
 
|
 
|}
 
  
== Npad ==
 
 
This section contains a series of 10 0x5000 byte structures describing each available controller.
 
This section contains a series of 10 0x5000 byte structures describing each available controller.
  
Line 1,399: Line 1,817:
 
|}
 
|}
  
== Gesture ==
+
== GestureSharedMemoryFormat ==
 +
This is "nn::hid::detail::GestureSharedMemoryFormat".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 1,455: Line 1,875:
 
|}
 
|}
  
== ConsoleSixAxisSensor ==
+
== ConsoleSixAxisSensorSharedMemoryFormat ==
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-

Revision as of 18:35, 18 November 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.

SharedMemoryFormat

This is "nn::hid::detail::SharedMemoryFormat".

Offset Size Description
0x0 0x400 DebugPad
0x400 0x3000 TouchScreen
0x3400 0x400 Mouse
0x3800 0x400 Keyboard
0x3C00 0x1000 [1.0.0-9.2.0] BasicXpad
0x3C00 [10.0.0+] Digitizer
0x4C00 0x200 HomeButton
0x4E00 0x200 SleepButton
0x5000 0x200 CaptureButton
0x5200 0x800 (0x80 * 0x10) InputDetector
0x5A00 0x4000 (0x400 * 0x10) [1.0.0-4.1.0] UniquePad
0x9A00 0x32000 (0x5000 * 0x0A) Npad
0x3BA00 0x800 Gesture
0x3C200 0x20 [5.0.0+] ConsoleSixAxisSensor

DebugPadSharedMemoryFormat

This is "nn::hid::detail::DebugPadSharedMemoryFormat".

Offset Size Description
0x0 0x2C8 #DebugPadLifo

DebugPadLifo

This is "nn::hid::detail::DebugPadLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x28 * 17 Array of #DebugPadStateAtomicStorage

DebugPadStateAtomicStorage

This is "nn::hid::detail::DebugPadStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x20 #DebugPadState
DebugPadState

This is "nn::hid::DebugPadState".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x4 Attributes
0xC 0x4 Buttons
0x10 0x8 AnalogStickR
0x18 0x8 AnalogStickL

TouchScreenSharedMemoryFormat

This is "nn::hid::detail::TouchScreenSharedMemoryFormat".

Offset Size Description
0x0 0x2C38 #TouchScreenLifo

TouchScreenLifo

This is "nn::hid::detail::TouchScreenLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x298 * 17 Array of #TouchScreenStateAtomicStorage

TouchScreenStateAtomicStorage

This is "nn::hid::detail::TouchScreenStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x290 #TouchScreenState
TouchScreenState

This is "nn::hid::detail::TouchScreenState".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x4 Count
0xC 0x4 Reserved
0x10 0x28 * 16 Touches
TouchState

This is "nn::hid::TouchState".

Offset Size Description
0x0 0x8 DeltaTime
0x8 0x4 Attributes
0xC 0x4 FingerId
0x10 0x4 X
0x14 0x4 Y
0x18 0x4 DiameterX
0x1C 0x4 DiameterY
0x20 0x4 RotationAngle
0x24 0x4 Reserved

MouseSharedMemoryFormat

This is "nn::hid::detail::MouseSharedMemoryFormat".

Offset Size Description
0x0 0x350 #MouseLifo

MouseLifo

This is "nn::hid::detail::MouseLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x30 * 17 Array of #MouseStateAtomicStorage

MouseStateAtomicStorage

This is "nn::hid::detail::MouseStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x28 #MouseState
MouseState

This is "nn::hid::detail::MouseState".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x4 X
0xC 0x4 Y
0x10 0x4 DeltaX
0x14 0x4 DeltaY
0x18 0x4 WheelDeltaX
0x1C 0x4 WheelDeltaY
0x20 0x4 Buttons
0x24 0x4 Attributes

KeyboardSharedMemoryFormat

This is "nn::hid::detail::KeyboardSharedMemoryFormat".

Offset Size Description
0x0 0x3D8 #KeyboardLifo

KeyboardLifo

This is "nn::hid::detail::KeyboardLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x38 * 17 Array of #KeyboardStateAtomicStorage

KeyboardStateAtomicStorage

This is "nn::hid::detail::KeyboardStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x30 #KeyboardState
KeyboardState

This is "nn::hid::detail::KeyboardState".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x8 Modifiers
0x10 0x20 Keys

BasicXpadSharedMemoryFormat

This is "nn::hid::detail::BasicXpadSharedMemoryFormat".

Offset Size Description
0x0 0x400 * 4 Array of #BasicXpadSharedMemoryEntry

BasicXpadSharedMemoryEntry

This is "nn::hid::detail::BasicXpadSharedMemoryEntry".

Offset Size Description
0x0 0x2C8 #BasicXpadLifo

BasicXpadLifo

This is "nn::hid::detail::BasicXpadLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x28 * 17 Array of #BasicXpadStateAtomicStorage
BasicXpadStateAtomicStorage

This is "nn::hid::detail::BasicXpadStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x20 #BasicXpadState
BasicXpadState

This is "nn::hid::detail::BasicXpadState".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x4 Attributes
0xC 0x4 Buttons
0x10 0x8 AnalogStickL
0x18 0x8 AnalogStickR

HomeButtonSharedMemoryFormat

This is "nn::hid::detail::HomeButtonSharedMemoryFormat".

Offset Size Description
0x0 0x1B8 #HomeButtonLifo

HomeButtonLifo

This is "nn::hid::detail::HomeButtonLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x18 * 17 Array of #HomeButtonStateAtomicStorage

HomeButtonStateAtomicStorage

This is "nn::hid::detail::HomeButtonStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x10 #HomeButtonState
HomeButtonState

This is "nn::hid::system::HomeButtonState".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x8 Buttons

SleepButtonSharedMemoryFormat

This is "nn::hid::detail::SleepButtonSharedMemoryFormat".

Offset Size Description
0x0 0x1B8 #SleepButtonLifo

SleepButtonLifo

This is "nn::hid::detail::SleepButtonLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x18 * 17 Array of #SleepButtonStateAtomicStorage

SleepButtonStateAtomicStorage

This is "nn::hid::detail::SleepButtonStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x10 #SleepButtonState
SleepButtonState

This is "nn::hid::system::SleepButtonState".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x8 Buttons

CaptureButtonSharedMemoryFormat

This is "nn::hid::detail::CaptureButtonSharedMemoryFormat".

Offset Size Description
0x0 0x1B8 #CaptureButtonLifo

CaptureButtonLifo

This is "nn::hid::detail::CaptureButtonLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x18 * 17 Array of #CaptureButtonStateAtomicStorage

CaptureButtonStateAtomicStorage

This is "nn::hid::detail::CaptureButtonStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x10 #CaptureButtonState
CaptureButtonState

This is "nn::hid::system::CaptureButtonState".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x8 Buttons

InputDetectorSharedMemoryFormat

This is "nn::hid::detail::InputDetectorSharedMemoryFormat".

Offset Size Description
0x0 0x80 * 16 Array of #InputDetectorSharedMemoryEntry

InputDetectorSharedMemoryEntry

This is "nn::hid::detail::InputDetectorSharedMemoryEntry".

Offset Size Description
0x0 0x50 #InputDetectorLifo

InputDetectorLifo

This is "nn::hid::detail::InputDetectorLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x18 * 2 Array of #InputDetectorStateAtomicStorage
InputDetectorStateAtomicStorage

This is "nn::hid::detail::InputDetectorStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x10 #InputDetectorState
InputDetectorState

This is "nn::hid::detail::InputDetectorState".

Offset Size Description
0x0 0x8 InputSourceState
0x8 0x8 SamplingNumber

UniquePadSharedMemoryFormat

This is "nn::hid::detail::UniquePadSharedMemoryFormat".

[5.0.0+] This section has been removed from #SharedMemoryFormat. #UniquePadSharedMemoryFormat is now a specialization of #NpadSharedMemoryFormat.

Offset Size Description
0x0 0x400 * 16 Array of #UniquePadSharedMemoryEntry

UniquePadSharedMemoryEntry

This is "nn::hid::detail::UniquePadSharedMemoryEntry".

Offset Size Description
0x0 0x1E0 #UniquePadLifo

UniquePadLifo

This is "nn::hid::detail::UniquePadLifo". This is a RingLifo object.

Offset Size Description
0x0 0x80 #UniquePadConfigLifo
0x80 0x70 * 2 Array of #AnalogStickCalibrationStateImplLifo
0x160 0x40 #SixAxisSensorUserCalibrationStateLifo
0x1A0 0x8 UniquePadConfigMutex
UniquePadConfigLifo

This is "nn::hid::detail::UniquePadConfigLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x30 * 2 Array of #UniquePadConfigAtomicStorage
UniquePadConfigAtomicStorage

This is "nn::hid::detail::UniquePadConfigAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x28 #UniquePadConfig
= UniquePadConfig =

This is "nn::hid::detail::UniquePadConfig".

Offset Size Description
0x0 0x4 Type
0x4 0x4 Interface
0x8 0x10 SerialNumber
0x18 0x4 ControllerNumber
0x1C 0x1 IsActive
0x1D 0x3 Reserved
0x20 0x8 SamplingNumber
AnalogStickCalibrationStateImplLifo

This is "nn::hid::detail::AnalogStickCalibrationStateImplLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x28 * 2 Array of #AnalogStickCalibrationStateImpl
AnalogStickCalibrationStateImplAtomicStorage

This is "nn::hid::detail::AnalogStickCalibrationStateImplAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x20 #AnalogStickCalibrationStateImpl
= AnalogStickCalibrationStateImpl =

This is "nn::hid::detail::AnalogStickCalibrationStateImpl".

Offset Size Description
0x0 0x8 State
0x8 0x8 Flags
0x10 0x8 Stage
0x18 0x8 SamplingNumber
SixAxisSensorUserCalibrationStateLifo

This is "nn::hid::detail::SixAxisSensorUserCalibrationStateLifo". This is a RingLifo object.

Offset Size Description
0x0 0x8 RingLifoVptr
0x8 0x8 BufferCount
0x10 0x8 Tail
0x18 0x8 Count
0x20 0x20 * 2 Array of #SixAxisSensorUserCalibrationStateAtomicStorage
SixAxisSensorUserCalibrationStateAtomicStorage

This is "nn::hid::detail::SixAxisSensorUserCalibrationStateAtomicStorage".

Offset Size Description
0x0 0x8 SamplingNumber
0x8 0x18 #SixAxisSensorUserCalibrationState
= UniquePadConfig =

This is "nn::hid::detail::UniquePadConfig".

Offset Size Description
0x0 0x8 Flags
0x8 0x8 Stage
0x10 0x8 SamplingNumber

NpadSharedMemoryFormat

This is "nn::hid::detail::NpadSharedMemoryFormat".

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 Other

NpadState

Offset Size Description
0x0 0x28 #NpadStateHeader
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 ([1.0.0-3.0.2] NpadSystemHeader)
0x12B8 0x30 * 17 Array of NpadPalmaState ([1.0.0-3.0.2] NpadSystemState)
0x1408 0x20 NpadSystemExtHeader ([4.0.0+] also used by NpadSystem)
0x1428 0x30 * 17 Array of NpadSystemExtState ([4.0.0+] also used by NpadSystem)
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 BatteryIndex0 state (must be 0-4)
0x41A0 0x4 BatteryIndex1 state (must be 0-4)
0x41A4 0x4 BatteryIndex2 state (must be 0-4)
0x41A8 0x20 [1.0.0-3.0.2] NfcXcdDeviceHandleHeader (Replaced by commands GetXcdHandleForNpadWithNfc/IsNfcActivated)
0x41C8 0x20 * 2 [1.0.0-3.0.2] Array of #NfcXcdDeviceHandleState (See above)
0x41A8 0x4 [9.0.0+] AppletFooterUiAttribute
0x41AC 0x1 [9.0.0+] AppletFooterUiType
0x4208 0x8 Mutex
0x4228 0x20 NpadGcTriggerHeader
0x4248 0x18 * 17 Array of NpadGcTriggerState
0x43E0 0x4
0x43E4 0x4
0x43E8 0x4

NpadStateHeader

Offset Size Description
0x0 0x4 NpadStyleSet
0x4 0x4 NpadJoyAssignmentMode
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 0x4 Controller State (bit0 connected, bit1 wired)
0x2C 0x4 Padding
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 LeftSL
25 LeftSR
26 RightSL
27 RightSR
28 Palma
29
30 HandheldLeftB (Left B button on NES controllers in Handheld mode)
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)

NfcXcdDeviceHandleState

Offset Size Description
0x0 0x8 Timestamp in samples (global)
0x8 0x8 DeviceHandle
0x10 0x1 Flag
0x11 0x1 Flag
0x12 0x6 Padding
0x18 0x8 Timestamp in samples

NpadGcTriggerState

Offset Size Description
0x0 0x8 Timestamp in samples (global)
0x8 0x8 Timestamp in samples
0x10 0x4 L analog trigger. Valid range: 0x0-0x7FFF.
0x14 0x4 R analog trigger. Valid range: 0x0-0x7FFF.

GestureSharedMemoryFormat

This is "nn::hid::detail::GestureSharedMemoryFormat".

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

ConsoleSixAxisSensorSharedMemoryFormat

Offset Size Description
0x0 0x8 Timestamp in samples
0x8 0x1 IsSevenSixAxisSensorAtRest
0x9 0x3 Padding
0xC 0x4 VerticalizationError
0x10 0xC GyroBias
0x1C 0x4 Padding