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 | PowerInfo0 battery state (must be 0-4) | 
| 0x41A0 | 0x4 | PowerInfo1 battery state (must be 0-4) | 
| 0x41A4 | 0x4 | PowerInfo2 battery state (must be 0-4) | 
| 0x41A8 | 0x20 | NfcXcdDeviceHandleHeader | 
| 0x41C8 | 0x20 * 2 | Array of NfcXcdDeviceHandleState | 
| 0x4208 | 0x8 | Mutex | 
| 0x4248 | 0x20 | NpadGcTriggerHeader | 
| 0x4268 | 0x18 * 17 | Array of NpadGcTriggerState | 
| 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 |