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.
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
|
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
|
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
|
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
|