Changes

Jump to navigation Jump to search
5,959 bytes added ,  19:55, 17 January 2020
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".
    
= Memory Map =
 
= Memory Map =
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
 
| 0x0
 
| 0x0
 
| 0x400
 
| 0x400
| Unknown, Header?
+
| [[#DebugPad]]
 
|-
 
|-
 
| 0x400
 
| 0x400
 
| 0x3000
 
| 0x3000
| Capacitive Touchscreen
+
| [[#TouchScreen]]
 
|-
 
|-
 
| 0x3400
 
| 0x3400
 
| 0x400
 
| 0x400
| Mouse
+
| [[#Mouse]]
 
|-
 
|-
 
| 0x3800
 
| 0x3800
 
| 0x400
 
| 0x400
| Keyboard
+
| [[#Keyboard]]
 
|-
 
|-
 
| 0x3C00
 
| 0x3C00
| 0x400
+
| 0x1000 (0x400 * 0x04)
| Unknown, header and 17 entries
+
| [[#BasicXpad]]
|-
  −
| 0x4000
  −
| 0x400
  −
| Unknown, header and 17 entries
  −
|-
  −
| 0x4400
  −
| 0x400
  −
| Unknown, header and 17 entries
  −
|-
  −
| 0x4800
  −
| 0x400
  −
| Unknown, header and 17 entries
   
|-
 
|-
 
| 0x4C00
 
| 0x4C00
 
| 0x200
 
| 0x200
| Unknown, header which says it has 17 entries, but the max entry index is 0
+
| [[#HomeButton]]
 
|-
 
|-
 
| 0x4E00
 
| 0x4E00
 
| 0x200
 
| 0x200
| Unknown, header which says it has 17 entries, but the max entry index is 0
+
| [[#SleepButton]]
 
|-
 
|-
 
| 0x5000
 
| 0x5000
 
| 0x200
 
| 0x200
| Unknown, header which says it has 17 entries, but the max entry index is 0
+
| [[#CaptureButton]]
 
|-
 
|-
 
| 0x5200
 
| 0x5200
| 0x80*0x10
+
| 0x800 (0x80 * 0x10)
| Unknown, 16 structures with a header and 2 entries each
+
| [[#InputDetector]]
 
|-
 
|-
 
| 0x5A00
 
| 0x5A00
| 0x4000
+
| 0x4000 (0x400 * 0x10)
| Controller Serials?
+
| [1.0.0-4.1.0] [[#UniquePad]]
 
|-
 
|-
 
| 0x9A00
 
| 0x9A00
| 0x32000
+
| 0x32000 (0x5000 * 0x0A)
| Controllers
+
| [[#Npad]]
 
|-
 
|-
 
| 0x3BA00
 
| 0x3BA00
| 0x4600
+
| 0x800
| Unknown
+
| [[#Gesture]]
 
|-
 
|-
 
| 0x3C200
 
| 0x3C200
| ?
+
| 0x20
| [5.0.0+] SevenSixAxisSensor
+
| [5.0.0+] [[#ConsoleSixAxisSensor]]
|-
   
|}
 
|}
   −
== Capacitive Touchscreen ==
+
== DebugPad ==
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
| 0x0
+
| 0x0
| 0x28
+
| 0x20
| Touch Header
+
| [[#DebugPadHeader]]
|-
  −
| 0x28
  −
| 0x298 * 17
  −
| Touch Entries
   
|-
 
|-
 +
| 0x20
 +
| 0x28 * 17
 +
| Array of [[#DebugPadState]]
 
|}
 
|}
   −
=== Touch Header ===
+
=== DebugPadHeader ===
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! 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)
 +
|}
 +
 
 +
=== DebugPadState ===
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 0x20
+
| 0x0
| 0x8
+
| 0x8
| Timestamp in samples
+
| Timestamp in samples (global)
 
|-
 
|-
 +
| 0x8
 +
| 0x20
 +
|
 
|}
 
|}
   −
=== Touch Entry ===
+
== TouchScreen ==
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x20
 +
| [[#TouchScreenHeader]]
 +
|-
 +
| 0x20
 +
| 0x298 * 17
 +
| Array of [[#TouchScreenState]]
 +
|}
    +
=== TouchScreenHeader ===
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
| 0x0
+
| 0x0
| 0x10
+
| 0x8
| Touch Entry Header
+
| Timestamp in ticks
 +
|-
 +
| 0x8
 +
| 0x8
 +
| Number of Entries (always 17)
 
|-
 
|-
| 0x10
+
| 0x10
| 0x28 * 16
+
| 0x8
| Touch Data
+
| Latest Entry Index
 
|-
 
|-
 +
| 0x18
 +
| 0x8
 +
| Maximum Entry Index (always 16)
 
|}
 
|}
   −
==== Touch Structure Header ====
+
=== TouchScreenState ===
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| Timestamp in samples (global)
 
|-
 
|-
| 0x0
+
| 0x8
| 0x8
+
| 0x8
 
| Timestamp in samples
 
| Timestamp in samples
 
|-
 
|-
| 0x8
+
| 0x10
| 0x8
+
| 0x8
| Number of Touches
+
| Touch count
 
|-
 
|-
 +
| 0x18
 +
| 0x28 * 16
 +
| [[#TouchScreenStateData]]
 
|}
 
|}
   −
==== Touch Data Entry ====
+
==== TouchScreenStateData ====
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
| 0x0
+
| 0x0
| 0x8
+
| 0x8
 
| Timestamp in samples
 
| Timestamp in samples
 
|-
 
|-
| 0x8
+
| 0x8
| 0x4
+
| 0x4
| Padding
+
| Padding
 
|-
 
|-
 
| 0xC
 
| 0xC
Line 177: Line 202:  
| 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
   
|-
 
|-
 +
| 0x24
 +
| 0x4
 +
| Padding
 
|}
 
|}
    
== Mouse ==
 
== Mouse ==
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
 
| 0x0
 
| 0x0
 
| 0x20
 
| 0x20
| Mouse Header
+
| [[#MouseHeader]]
 
|-
 
|-
 
| 0x20
 
| 0x20
 
| 0x30 * 17
 
| 0x30 * 17
| Mouse Entries
+
| Array of [[#MouseState]]
 +
|}
 +
 
 +
=== MouseHeader ===
 +
{| 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)
 
|}
 
|}
   −
=== Mouse Header ===
+
=== MouseState ===
 +
{| class="wikitable" border="1"
 +
|-
 +
! 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 ==
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
 
| 0x0
 
| 0x0
| 0x8
+
| 0x20
| Timestamp in ticks?
+
| [[#KeyboardHeader]]
 +
|-
 +
| 0x20
 +
| 0x38 * 17
 +
| Array of [[#KeyboardState]]
 +
|}
 +
 
 +
=== KeyboardHeader ===
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| 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"
 +
|-
 +
! 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)
 
|}
 
|}
   −
=== Mouse Entry ===
+
== 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"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
| 0x0
+
| 0x0
| 0x8
+
| 0x8
| Timestamp in samples
+
| Timestamp in samples (global)
 
|-
 
|-
| 0x8
+
| 0x8
| 0x8
+
| 0x20
| Timestamp in samples again?
+
|  
 +
|}
 +
 
 +
== HomeButton ==
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x10
+
! Offset
| 0x4
+
! Size
| Mouse X
+
! Description
 
|-
 
|-
| 0x14
+
| 0x0
| 0x4
+
| 0x20
| Mouse Y
+
| [[#HomeButtonHeader]]
 
|-
 
|-
| 0x18
+
| 0x20
| 0x4
+
| 0x18 * 17
| Mouse X Change
+
| Array of [[#HomeButtonState]]
 +
|}
 +
 
 +
=== HomeButtonHeader ===
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x1C
+
! Offset
| 0x4
+
! Size
| Mouse Y Change
+
! Description
 
|-
 
|-
| 0x20
+
| 0x0
| 0x4
+
| 0x8
| Scroll Change Y
+
| Timestamp in ticks
 
|-
 
|-
| 0x24
+
| 0x8
| 0x4
+
| 0x8
| Scroll Change X?
+
| Number of Entries (always 17)
 
|-
 
|-
| 0x28
+
| 0x10
| 0x8
+
| 0x8
| Mouse Buttons
+
| 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
 +
|
 +
|}
   −
== Keyboard ==
+
== SleepButton ==
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x20
 +
| [[#SleepButtonHeader]]
 +
|-
 +
| 0x20
 +
| 0x18 * 17
 +
| Array of [[#SleepButtonState]]
 +
|}
    +
=== SleepButtonHeader ===
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! 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"
 
|-
 
|-
| 0x0
+
! Offset
| 0x20
+
! Size
| Keyboard Header
+
! Description
 
|-
 
|-
| 0x20
+
| 0x0
| 0x38 * 17
+
| 0x8
| Keyboard Entries
+
| Timestamp in samples (global)
 
|-
 
|-
 +
| 0x8
 +
| 0x10
 +
|
 
|}
 
|}
   −
=== Keyboard Header ===
+
== CaptureButton ==
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x20
 +
| [[#CaptureButtonHeader]]
 +
|-
 +
| 0x20
 +
| 0x18 * 17
 +
| Array of [[#CaptureButtonState]]
 +
|}
    +
=== CaptureButtonHeader ===
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! 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)
 +
|}
 +
 
 +
=== 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]]
 
|}
 
|}
   −
=== Keyboard Entry ===
+
=== 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"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
| 0x0
+
| 0x0
| 0x8
+
| 0x8
| Timestamp in samples
+
| Timestamp in samples (global)
 
|-
 
|-
| 0x8
+
| 0x8
| 0x8
+
| 0x10
| Timestamp in samples again?
+
|  
 +
|}
 +
 
 +
== UniquePad ==
 +
This section contains a series of 16 structures 0x400 bytes large.
 +
 
 +
[5.0.0+] This section has been removed from SharedMemoryFormat. [[#UniquePad]] is now a specialization of [[#Npad]].
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x10
+
! Offset
| 0x8
+
! Size
| Modifier Mask
+
! Description
 
|-
 
|-
| 0x18
+
| 0x0
| 0x20
+
| 0x80
| Keys Down, each key gets one bit based on the HID keyboard scan code (F1 is 0x3A, bit 0x3A is set)
+
| [[#UniquePadConfig]]
 
|-
 
|-
 +
| 0x80
 +
| 0x70 * 2
 +
| Array of [[#AnalogStickCalibration]]
 
|}
 
|}
   −
== Controller Serials? ==
+
=== UniquePadConfig ===
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x20
 +
| [[#UniquePadConfigHeader]]
 +
|-
 +
| 0x20
 +
| 0x30 * 2
 +
| Array of [[#UniquePadConfigState]]
 +
|}
   −
This section contains a series of 16 structures 0x400 bytes large.
+
==== UniquePadConfigHeader ====
 +
{| 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)
 +
|}
    +
==== UniquePadConfigState ====
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
| 0x30
+
| 0x0
| 0xE
+
| 0x8
| Controller Serial
+
| Timestamp in samples (global)
 
|-
 
|-
| 0x60
+
| 0x8
| 0xE
+
| 0x8
| Controller Serial
+
|  
 
|-
 
|-
 +
| 0x10
 +
| 0x20
 +
| Controller Serial
 
|}
 
|}
   −
== Controllers ==
+
=== AnalogStickCalibration ===
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x20
 +
| [[#AnalogStickCalibrationHeader]]
 +
|-
 +
| 0x20
 +
| 0x28 * 2
 +
| Array of [[#AnalogStickCalibrationState]]
 +
|}
   −
This section contains a series of 10 0x5000 byte structures describing each available controller.
+
==== AnalogStickCalibrationHeader ====
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Controller Index
+
! Offset
!   Description
+
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| Timestamp in ticks
 
|-
 
|-
| 0 to 7
+
| 0x8
| Players 1 to 8
+
| 0x8
 +
| Number of Entries (always 17)
 +
|-
 +
| 0x10
 +
| 0x8
 +
| Latest Entry Index
 +
|-
 +
| 0x18
 +
| 0x8
 +
| Maximum Entry Index (always 16)
 +
|}
 +
 
 +
==== AnalogStickCalibrationState ====
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 8
+
! Offset
| Handheld Mode
+
! Size
 +
! Description
 
|-
 
|-
| 9
+
| 0x0
| Unknown
+
| 0x8
 +
| Timestamp in samples (global)
 
|-
 
|-
 +
| 0x8
 +
| 0x28
 +
|
 
|}
 
|}
   −
=== Controller ===
+
== Npad ==
 +
This section contains a series of 10 0x5000 byte structures describing each available controller.
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Index
!   Size in bytes
+
! Description
!   Description
+
|-
 +
| 0 to 7
 +
| Players 1 to 8
 +
|-
 +
| 8
 +
| Handheld Mode
 +
|-
 +
| 9
 +
| Unknown
 +
|}
 +
 
 +
=== NpadState ===
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x28
 +
| [[#NpadStateHeader]]
 +
|-
 +
| 0x28
 +
| 0x20
 +
| NpadFullKeyHeader
 +
|-
 +
| 0x48
 +
| 0x30 * 17
 +
| Array of NpadFullKeyState
 +
|-
 +
| 0x378
 +
| 0x20
 +
| [[#NpadHandheldHeader]]
 
|-
 
|-
| 0x0
+
| 0x398
| 0x28
+
| 0x30 * 17
| Controller Header
+
| Array of [[#NpadHandheldState]]
 
|-
 
|-
| 0x28
+
| 0x6C8
| 0x20 header + 0x30 * 17
+
| 0x20
| Controller Pro Controller State
+
| NpadJoyDualHeader
 
|-
 
|-
| 0x378
+
| 0x6E8
| 0x20 header + 0x30 * 17
+
| 0x30 * 17
| Controller Handheld Joined State
+
| Array of NpadJoyDualState
 
|-
 
|-
| 0x6C8
+
| 0xA18
| 0x20 header + 0x30 * 17
+
| 0x20
| Controller Joined State (Lone Joy-Con or Pair of Joy-Con)
+
| NpadJoyLeftHeader
 
|-
 
|-
| 0xA18
+
| 0xA38
| 0x20 header + 0x30 * 17
+
| 0x30 * 17
| Controller Left State (Vertical Controls w/ Joy-Con Half)
+
| Array of NpadJoyLeftState
 
|-
 
|-
| 0xD68
+
| 0xD68
| 0x20 header + 0x30 * 17
+
| 0x20
| Controller Right State (Vertical Controls w/ Joy-Con Half)
+
| NpadJoyRightHeader
 
|-
 
|-
| 0x10B8
+
| 0xD88
| 0x20 header + 0x30 * 17
+
| 0x30 * 17
| Controller Main State (No Analog Sticks)
+
| Array of NpadJoyRightState
 +
|-
 +
| 0x10B8
 +
| 0x20
 +
| NpadPalmaHeader
 +
|-
 +
| 0x12B8
 +
| 0x30 * 17
 +
| Array of NpadPalmaState
 
|-
 
|-
 
| 0x1408
 
| 0x1408
| 0x20 header + 0x30 * 17
+
| 0x20
| Controller Main State
+
| NpadSystemExtHeader
 +
|-
 +
| 0x1428
 +
| 0x30 * 17
 +
| Array of NpadSystemExtState
 
|-
 
|-
 
| 0x1758
 
| 0x1758
| 0x20 header + 0x68 * 17
+
| 0x20
| SixAxisSensor Pro Controller State
+
| NpadSixAxisSensorFullKeyHeader
 +
|-
 +
| 0x1778
 +
| 0x68 * 17
 +
| Array of NpadSixAxisSensorFullKeyState
 
|-
 
|-
 
| 0x1E60
 
| 0x1E60
| 0x20 header + 0x68 * 17
+
| 0x20
| SixAxisSensor Handheld State
+
| NpadSixAxisSensorHandheldHeader
 +
|-
 +
| 0x1E80
 +
| 0x68 * 17
 +
| Array of NpadSixAxisSensorHandheldState
 
|-
 
|-
 
| 0x2568
 
| 0x2568
| 0x20 header + 0x68 * 17
+
| 0x20
| SixAxisSensor Pair Left State
+
| NpadSixAxisSensorJoyLeftDualHeader
 +
|-
 +
| 0x2588
 +
| 0x68 * 17
 +
| Array of NpadSixAxisSensorJoyLeftDualState
 
|-
 
|-
 
| 0x2C70
 
| 0x2C70
| 0x20 header + 0x68 * 17
+
| 0x20
| SixAxisSensor Pair Right State
+
| NpadSixAxisSensorJoyRightDualHeader
 +
|-
 +
| 0x2C90
 +
| 0x68 * 17
 +
| Array of NpadSixAxisSensorJoyRightDualState
 
|-
 
|-
 
| 0x3378
 
| 0x3378
| 0x20 header + 0x68 * 17
+
| 0x20
| SixAxisSensor Single Left State
+
| NpadSixAxisSensorJoyLeftHeader
 +
|-
 +
| 0x3398
 +
| 0x68 * 17
 +
| Array of NpadSixAxisSensorJoyLeftState
 
|-
 
|-
 
| 0x3A80
 
| 0x3A80
| 0x20 header + 0x68 * 17
+
| 0x20
| SixAxisSensor Single Right State
+
| NpadSixAxisSensorJoyRightHeader
 +
|-
 +
| 0x3AA0
 +
| 0x68 * 17
 +
| Array of NpadSixAxisSensorJoyRightState
 
|-
 
|-
 
| 0x4188
 
| 0x4188
 
| 0x4
 
| 0x4
| DeviceType bitmask
+
| [[HID_services#DeviceType|DeviceType]]
 
|-
 
|-
 
| 0x418C
 
| 0x418C
Line 477: Line 934:  
| 0x4190
 
| 0x4190
 
| 0x8
 
| 0x8
| Flags
+
| [[#NpadSystemProperties]]
 
|-
 
|-
 
| 0x4198
 
| 0x4198
 
| 0x4
 
| 0x4
| Flags2
+
| [[#NpadSystemButtonProperties]]
 
|-
 
|-
 
| 0x419C
 
| 0x419C
 
| 0x4
 
| 0x4
| PowerInfo0 battery state
+
| BatteryIndex0 state (must be 0-4)
 
|-
 
|-
 
| 0x41A0
 
| 0x41A0
 
| 0x4
 
| 0x4
| PowerInfo1 battery state
+
| BatteryIndex1 state (must be 0-4)
 
|-
 
|-
 
| 0x41A4
 
| 0x41A4
 
| 0x4
 
| 0x4
| PowerInfo2 battery state
+
| BatteryIndex2 state (must be 0-4)
 
|-
 
|-
| 0x41D0
+
| 0x41A8
| 0x10
+
| 0x20
| Controller MAC
+
| NfcXcdDeviceHandleHeader
 
|-
 
|-
| 0x41F0
+
| 0x41C8
| 0x10
+
| 0x20 * 2
| Controller MAC
+
| Array of NfcXcdDeviceHandleState
 
|-
 
|-
|}
+
| 0x4208
 
+
| 0x8
The battery state must be 0-4.
+
| Mutex
 
  −
==== Flags ====
  −
{| class="wikitable" border="1"
   
|-
 
|-
!  Bit
+
| 0x4248
!  Description
+
| 0x20
|-
+
| NpadGcTriggerHeader
| 0
  −
| PowerInfo0 flag0
  −
|-
  −
| 1
  −
| PowerInfo1 flag0
  −
|-
  −
| 2
  −
| PowerInfo2 flag0
  −
|-
  −
| 3
  −
| PowerInfo0 flag1
  −
|-
  −
| 4
  −
| PowerInfo1 flag1
  −
|-
  −
| 5
  −
| PowerInfo2 flag1
  −
|-
  −
| 6-8
  −
| Unused
  −
|-
  −
| 9
  −
| UnsupportedButtonPressed_NpadSystem
  −
|-
  −
| 10
  −
| UnsupportedButtonPressed_NpadSystemExt
  −
|-
  −
| 11
  −
| AbxyButtonOriented
  −
|-
  −
| 12
  −
| SlSrButtonOriented
  −
|-
  −
| 13
  −
| PlusButtonCapability
   
|-
 
|-
| 14
+
| 0x4268
| MinusButtonCapability
+
| 0x18 * 17
|-
+
| Array of NpadGcTriggerState
| 15
  −
| DirectionalButtonsSupported
  −
|-
  −
| 16-63
  −
| Unused
   
|}
 
|}
   −
==== Flags2 ====
+
==== NpadStateHeader ====
Bit0: clear = UnintendedHomeButtonInputProtectionEnabled.
  −
 
  −
==== Controller Header ====
  −
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! 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 1,019:  
| 0x4
 
| 0x4
 
| RGBA Button Color (left Joy-Con)
 
| RGBA Button Color (left Joy-Con)
|-
   
|}
 
|}
   −
==== Controller State Header ====
+
==== NpadHandheldHeader ====
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! 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
Line 634: Line 1,042:  
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Maximum Entry Index, always 16
+
| Maximum Entry Index (always 16)
|-
   
|}
 
|}
   −
==== Controller State ====
+
==== NpadHandheldState ====
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples
+
| Timestamp in samples (global)
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Timestamp in samples again
+
| Timestamp in samples
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Button State
+
| [[#NpadButton]]
 
|-
 
|-
 
| 0x18
 
| 0x18
Line 677: Line 1,083:  
| 0x8
 
| 0x8
 
| Controller State (bit0 connected, bit1 wired)
 
| Controller State (bit0 connected, bit1 wired)
|-
   
|}
 
|}
   −
===== Button State =====
+
===== NpadButton =====
 +
This is the u64 bitmask for "nn::hid::NpadButton".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Bit
+
! Bit
!   Button
+
! Button
 
|-
 
|-
 
| 0
 
| 0
Line 764: Line 1,170:  
| 25
 
| 25
 
| SR
 
| SR
|-
   
|}
 
|}
   −
===== SixAxisSensor State Header =====
+
===== NpadSixAxisSensorHandheldHeader =====
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! 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
Line 789: Line 1,193:  
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Maximum Entry Index, up to 16
+
| Maximum Entry Index (up to 16)
|-
   
|}
 
|}
   −
===== SixAxisSensor State Entry =====
+
===== NpadSixAxisSensorHandheldState =====
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
!   Offset
+
! Offset
!   Size in bytes
+
! Size
!   Description
+
! Description
 
|-
 
|-
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Timestamp in samples
+
| Timestamp in samples (global)
 
|-
 
|-
 
| 0x8
 
| 0x8
Line 810: Line 1,213:  
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| Timestamp in samples again
+
| Timestamp in samples
 
|-
 
|-
 
| 0x1C
 
| 0x1C
Line 834: Line 1,237:     
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)
 +
|}
 +
 +
== 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
 +
| Timestamp in samples
 +
|-
 +
| 0x8
 +
| 0x1
 +
| IsSevenSixAxisSensorAtRest
 +
|-
 +
| 0x9
 +
| 0x3
 +
| Padding
 +
|-
 +
| 0xC
 +
| 0x4
 +
| VerticalizationError
 +
|-
 +
| 0x10
 +
| 0xC
 +
| GyroBias
 +
|-
 +
| 0x1C
 +
| 0x4
 +
| Padding
 +
|}

Navigation menu