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
DebugPad
| 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
 | 
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
 | 
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
 | 
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
 | 
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
 | 
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
 | 
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
 | 
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
 | 
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.
[5.0.0+] This section has been removed from SharedMemoryFormat. #UniquePad is now a specialization of #Npad.
UniquePadConfig
| 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
| Offset
 | 
Size
 | 
Description
 | 
| 0x0
 | 
0x8
 | 
Timestamp in samples (global)
 | 
| 0x8
 | 
0x8
 | 
 | 
| 0x10
 | 
0x20
 | 
Controller Serial
 | 
AnalogStickCalibration
| 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)
 | 
AnalogStickCalibrationState
| 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.
| 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
 | 
| 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
 | 
BatteryIndex0 state (must be 0-4)
 | 
| 0x41A0
 | 
0x4
 | 
BatteryIndex1 state (must be 0-4)
 | 
| 0x41A4
 | 
0x4
 | 
BatteryIndex2 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
 | 
| Offset
 | 
Size
 | 
Description
 | 
| 0x0
 | 
0x4
 | 
NpadStyleSet
 | 
| 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
 | 
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)
 | 
Gesture
| 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
 | 
Timestamp in samples
 | 
| 0x8
 | 
0x1
 | 
IsSevenSixAxisSensorAtRest
 | 
| 0x9
 | 
0x3
 | 
Padding
 | 
| 0xC
 | 
0x4
 | 
VerticalizationError
 | 
| 0x10
 | 
0xC
 | 
GyroBias
 | 
| 0x1C
 | 
0x4
 | 
Padding
 |