Difference between revisions of "HID Shared Memory"

From Nintendo Switch Brew
Jump to navigation Jump to search
(Redirected page to HID services)
Tag: New redirect
 
(28 intermediate revisions by 3 users not shown)
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.
+
#REDIRECT [[HID_services]]
 
 
= Memory Map =
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x400
 
| DebugPad
 
|-
 
| 0x400
 
| 0x3000
 
| [[#TouchScreen]]
 
|-
 
| 0x3400
 
| 0x400
 
| [[#Mouse]]
 
|-
 
| 0x3800
 
| 0x400
 
| [[#Keyboard]]
 
|-
 
| 0x3C00
 
| 0x1000 (0x400 * 0x04)
 
| BasicXpad
 
|-
 
| 0x4C00
 
| 0x200
 
| HomeButton
 
|-
 
| 0x4E00
 
| 0x200
 
| SleepButton
 
|-
 
| 0x5000
 
| 0x200
 
| CaptureButton
 
|-
 
| 0x5200
 
| 0x800 (0x80 * 0x10)
 
| InputDetector
 
|-
 
| 0x5A00
 
| 0x4000
 
| Controller Serials?
 
|-
 
| 0x9A00
 
| 0x32000 (0x5000 * 0x0A)
 
| Npad
 
|-
 
| 0x3BA00
 
| 0x800
 
| Gesture
 
|-
 
| 0x3C200
 
| 0x20
 
| [5.0.0+] ConsoleSixAxisSensor
 
|}
 
 
 
== TouchScreen ==
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x28
 
| [[#TouchScreenHeader]]
 
|-
 
| 0x28
 
| 0x298 * 17
 
| Array of [[#TouchScreenState]]
 
|}
 
 
 
=== TouchScreenHeader ===
 
{| 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
 
|-
 
| 0x20
 
| 0x8
 
| Timestamp in samples
 
|}
 
 
 
=== TouchScreenState ===
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x10
 
| [[#TouchScreenStateHeader]]
 
|-
 
| 0x10
 
| 0x28 * 16
 
| [[#TouchScreenStateData]]
 
|}
 
 
 
==== TouchScreenStateHeader ====
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x8
 
| Timestamp in samples
 
|-
 
| 0x8
 
| 0x8
 
| Touch count
 
|}
 
 
 
==== TouchScreenStateData ====
 
{| class="wikitable" border="1"
 
|-
 
! 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 ==
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x20
 
| [[#MouseHeader]]
 
|-
 
| 0x20
 
| 0x30 * 17
 
| 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
 
|}
 
 
 
=== MouseState ===
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x8
 
| Timestamp in samples
 
|-
 
| 0x8
 
| 0x8
 
| Timestamp in samples again?
 
|-
 
| 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"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x20
 
| [[#KeyboardHeader]]
 
|-
 
| 0x20
 
| 0x38 * 17
 
| Array of [[#KeyboardState]]
 
|}
 
 
 
=== KeyboardHeader ===
 
{| 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
 
|}
 
 
 
=== KeyboardState ===
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x8
 
| Timestamp in samples
 
|-
 
| 0x8
 
| 0x8
 
| Timestamp in samples again?
 
|-
 
| 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)
 
|}
 
 
 
== Controller Serials? ==
 
This section contains a series of 16 structures 0x400 bytes large.
 
 
 
{| class="wikitable" border="1"
 
|-
 
!  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.
 
 
 
{| class="wikitable" border="1"
 
|-
 
! Index
 
! Description
 
|-
 
| 0 to 7
 
| Players 1 to 8
 
|-
 
| 8
 
| Handheld Mode
 
|-
 
| 9
 
| Unknown
 
|}
 
 
 
=== NpadInternalState ===
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x28
 
| [[#NpadInternalStateHeader]]
 
|-
 
| 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
 
| [[HID_services#DeviceType|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
 
|}
 
 
 
==== NpadInternalStateHeader ====
 
{| class="wikitable" border="1"
 
|-
 
! 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 ====
 
{| 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
 
|}
 
 
 
==== NpadHandheldState ====
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x8
 
| Timestamp in samples
 
|-
 
| 0x8
 
| 0x8
 
| Timestamp in samples again
 
|-
 
| 0x10
 
| 0x8
 
| [[#Button State]]
 
|-
 
| 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)
 
|}
 
 
 
===== Button State =====
 
{| class="wikitable" border="1"
 
|-
 
! 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 =====
 
{| 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, up to 16
 
|}
 
 
 
===== NpadSixAxisSensorHandheldState =====
 
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x8
 
| Timestamp in samples
 
|-
 
| 0x8
 
| 0x8
 
| Unknown
 
|-
 
| 0x10
 
| 0x8
 
| Timestamp in samples again
 
|-
 
| 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 ====
 
{| 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)
 
|}
 

Latest revision as of 18:21, 22 November 2020

Redirect to: