Difference between revisions of "HID Shared Memory"
Jump to navigation
Jump to search
(Wait I counted wrong crisis averted) |
|||
(24 intermediate revisions by 4 users not shown) | |||
Line 43: | Line 43: | ||
| 0x4C00 | | 0x4C00 | ||
| 0x200 | | 0x200 | ||
− | | Unknown | + | | Unknown, header which says it has 17 entries, but the max entry index is 0 |
|- | |- | ||
| 0x4E00 | | 0x4E00 | ||
| 0x200 | | 0x200 | ||
− | | Unknown | + | | Unknown, header which says it has 17 entries, but the max entry index is 0 |
|- | |- | ||
| 0x5000 | | 0x5000 | ||
| 0x200 | | 0x200 | ||
− | | Unknown | + | | Unknown, header which says it has 17 entries, but the max entry index is 0 |
|- | |- | ||
| 0x5200 | | 0x5200 | ||
− | | | + | | 0x80*0x10 |
− | | Unknown | + | | Unknown, 16 structures with a header and 2 entries each |
|- | |- | ||
| 0x5A00 | | 0x5A00 | ||
Line 68: | Line 68: | ||
| 0x4600 | | 0x4600 | ||
| Unknown | | Unknown | ||
+ | |- | ||
+ | | 0x3C200 | ||
+ | | ? | ||
+ | | [5.0.0+] SevenSixAxisSensor | ||
|- | |- | ||
|} | |} | ||
Line 99: | Line 103: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in ticks? |
|- | |- | ||
| 0x8 | | 0x8 | ||
Line 115: | Line 119: | ||
| 0x20 | | 0x20 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in samples |
|- | |- | ||
|} | |} | ||
Line 146: | Line 150: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in samples |
|- | |- | ||
| 0x8 | | 0x8 | ||
Line 163: | Line 167: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in samples |
|- | |- | ||
| 0x8 | | 0x8 | ||
− | | | + | | 0x4 |
− | | | + | | Padding |
+ | |- | ||
+ | | 0xC | ||
+ | | 0x4 | ||
+ | | Touch Index | ||
|- | |- | ||
| 0x10 | | 0x10 | ||
Line 191: | Line 199: | ||
| 0x24 | | 0x24 | ||
| 0x4 | | 0x4 | ||
− | | | + | | Padding |
|- | |- | ||
|} | |} | ||
Line 223: | Line 231: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in ticks? |
|- | |- | ||
| 0x8 | | 0x8 | ||
Line 249: | Line 257: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in samples |
|- | |- | ||
| 0x8 | | 0x8 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in samples again? |
|- | |- | ||
| 0x10 | | 0x10 | ||
Line 299: | Line 307: | ||
|- | |- | ||
| 0x20 | | 0x20 | ||
− | | | + | | 0x38 * 17 |
| Keyboard Entries | | Keyboard Entries | ||
|- | |- | ||
Line 314: | Line 322: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in ticks? |
|- | |- | ||
| 0x8 | | 0x8 | ||
Line 340: | Line 348: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in samples |
|- | |- | ||
| 0x8 | | 0x8 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in samples again? |
|- | |- | ||
| 0x10 | | 0x10 | ||
Line 435: | Line 443: | ||
| Controller Main State | | Controller Main State | ||
|- | |- | ||
− | | 0x41D0 | + | | 0x1758 |
− | | 0x10 | + | | 0x20 header + 0x68 * 17 |
− | | Controller MAC | + | | SixAxisSensor Pro Controller State |
+ | |- | ||
+ | | 0x1E60 | ||
+ | | 0x20 header + 0x68 * 17 | ||
+ | | SixAxisSensor Handheld State | ||
+ | |- | ||
+ | | 0x2568 | ||
+ | | 0x20 header + 0x68 * 17 | ||
+ | | SixAxisSensor Pair Left State | ||
+ | |- | ||
+ | | 0x2C70 | ||
+ | | 0x20 header + 0x68 * 17 | ||
+ | | SixAxisSensor Pair Right State | ||
+ | |- | ||
+ | | 0x3378 | ||
+ | | 0x20 header + 0x68 * 17 | ||
+ | | SixAxisSensor Single Left State | ||
+ | |- | ||
+ | | 0x3A80 | ||
+ | | 0x20 header + 0x68 * 17 | ||
+ | | SixAxisSensor Single Right State | ||
+ | |- | ||
+ | | 0x4188 | ||
+ | | 0x4 | ||
+ | | [[HID_services#DeviceType|DeviceType]] | ||
+ | |- | ||
+ | | 0x418C | ||
+ | | 0x4 | ||
+ | | Padding | ||
+ | |- | ||
+ | | 0x4190 | ||
+ | | 0x8 | ||
+ | | Flags | ||
+ | |- | ||
+ | | 0x4198 | ||
+ | | 0x4 | ||
+ | | Flags2 | ||
+ | |- | ||
+ | | 0x419C | ||
+ | | 0x4 | ||
+ | | PowerInfo0 battery state | ||
+ | |- | ||
+ | | 0x41A0 | ||
+ | | 0x4 | ||
+ | | PowerInfo1 battery state | ||
+ | |- | ||
+ | | 0x41A4 | ||
+ | | 0x4 | ||
+ | | PowerInfo2 battery state | ||
+ | |- | ||
+ | | 0x41D0 | ||
+ | | 0x10 | ||
+ | | Controller MAC | ||
+ | |- | ||
+ | | 0x41F0 | ||
+ | | 0x10 | ||
+ | | Controller MAC | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | The battery state must be 0-4. | ||
+ | |||
+ | ==== Flags ==== | ||
+ | {| 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 | ||
|} | |} | ||
+ | |||
+ | ==== Flags2 ==== | ||
+ | Bit0: clear = UnintendedHomeButtonInputProtectionEnabled. | ||
==== Controller Header ==== | ==== Controller Header ==== | ||
Line 505: | Line 622: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in ticks? |
|- | |- | ||
| 0x8 | | 0x8 | ||
Line 531: | Line 648: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in samples |
|- | |- | ||
| 0x8 | | 0x8 | ||
| 0x8 | | 0x8 | ||
− | | Timestamp | + | | Timestamp in samples again |
|- | |- | ||
| 0x10 | | 0x10 | ||
Line 649: | Line 766: | ||
|- | |- | ||
|} | |} | ||
+ | |||
+ | ===== SixAxisSensor State Header ===== | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size in bytes | ||
+ | ! 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 | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | ===== SixAxisSensor State Entry ===== | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size in bytes | ||
+ | ! 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. |
Revision as of 21:42, 25 June 2019
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.
Memory Map
Offset | Size in bytes | Description |
---|---|---|
0x0 | 0x400 | Unknown, Header? |
0x400 | 0x3000 | Capacitive Touchscreen |
0x3400 | 0x400 | Mouse |
0x3800 | 0x400 | Keyboard |
0x3C00 | 0x400 | Unknown, header and 17 entries |
0x4000 | 0x400 | Unknown, header and 17 entries |
0x4400 | 0x400 | Unknown, header and 17 entries |
0x4800 | 0x400 | Unknown, header and 17 entries |
0x4C00 | 0x200 | Unknown, header which says it has 17 entries, but the max entry index is 0 |
0x4E00 | 0x200 | Unknown, header which says it has 17 entries, but the max entry index is 0 |
0x5000 | 0x200 | Unknown, header which says it has 17 entries, but the max entry index is 0 |
0x5200 | 0x80*0x10 | Unknown, 16 structures with a header and 2 entries each |
0x5A00 | 0x4000 | Controller Serials? |
0x9A00 | 0x32000 | Controllers |
0x3BA00 | 0x4600 | Unknown |
0x3C200 | ? | [5.0.0+] SevenSixAxisSensor |
Capacitive Touchscreen
Offset | Size in bytes | Description |
---|---|---|
0x0 | 0x28 | Touch Header |
0x28 | 0x298 * 17 | Touch Entries |
Touch Header
Offset | Size in bytes | 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 |
Touch Entry
Offset | Size in bytes | Description |
---|---|---|
0x0 | 0x10 | Touch Entry Header |
0x10 | 0x28 * 16 | Touch Data |
Touch Structure Header
Offset | Size in bytes | Description |
---|---|---|
0x0 | 0x8 | Timestamp in samples |
0x8 | 0x8 | Number of Touches |
Touch Data Entry
Offset | Size in bytes | 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 in bytes | Description |
---|---|---|
0x0 | 0x20 | Mouse Header |
0x20 | 0x30 * 17 | Mouse Entries |
Mouse Header
Offset | Size in bytes | 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 Entry
Offset | Size in bytes | 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
Offset | Size in bytes | Description |
---|---|---|
0x0 | 0x20 | Keyboard Header |
0x20 | 0x38 * 17 | Keyboard Entries |
Keyboard Header
Offset | Size in bytes | 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 |
Keyboard Entry
Offset | Size in bytes | 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.
Offset | Size in bytes | Description |
---|---|---|
0x30 | 0xE | Controller Serial |
0x60 | 0xE | Controller Serial |
Controllers
This section contains a series of 10 0x5000 byte structures describing each available controller.
Controller Index | Description |
---|---|
0 to 7 | Players 1 to 8 |
8 | Handheld Mode |
9 | Unknown |
Controller
Offset | Size in bytes | Description |
---|---|---|
0x0 | 0x28 | Controller Header |
0x28 | 0x20 header + 0x30 * 17 | Controller Pro Controller State |
0x378 | 0x20 header + 0x30 * 17 | Controller Handheld Joined State |
0x6C8 | 0x20 header + 0x30 * 17 | Controller Joined State (Lone Joy-Con or Pair of Joy-Con) |
0xA18 | 0x20 header + 0x30 * 17 | Controller Left State (Vertical Controls w/ Joy-Con Half) |
0xD68 | 0x20 header + 0x30 * 17 | Controller Right State (Vertical Controls w/ Joy-Con Half) |
0x10B8 | 0x20 header + 0x30 * 17 | Controller Main State (No Analog Sticks) |
0x1408 | 0x20 header + 0x30 * 17 | Controller Main State |
0x1758 | 0x20 header + 0x68 * 17 | SixAxisSensor Pro Controller State |
0x1E60 | 0x20 header + 0x68 * 17 | SixAxisSensor Handheld State |
0x2568 | 0x20 header + 0x68 * 17 | SixAxisSensor Pair Left State |
0x2C70 | 0x20 header + 0x68 * 17 | SixAxisSensor Pair Right State |
0x3378 | 0x20 header + 0x68 * 17 | SixAxisSensor Single Left State |
0x3A80 | 0x20 header + 0x68 * 17 | SixAxisSensor Single Right State |
0x4188 | 0x4 | DeviceType |
0x418C | 0x4 | Padding |
0x4190 | 0x8 | Flags |
0x4198 | 0x4 | Flags2 |
0x419C | 0x4 | PowerInfo0 battery state |
0x41A0 | 0x4 | PowerInfo1 battery state |
0x41A4 | 0x4 | PowerInfo2 battery state |
0x41D0 | 0x10 | Controller MAC |
0x41F0 | 0x10 | Controller MAC |
The battery state must be 0-4.
Flags
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 |
Flags2
Bit0: clear = UnintendedHomeButtonInputProtectionEnabled.
Controller Header
Offset | Size in bytes | 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) |
Controller State Header
Offset | Size in bytes | 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 |
Controller State
Offset | Size in bytes | 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
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 |
SixAxisSensor State Header
Offset | Size in bytes | 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 |
SixAxisSensor State Entry
Offset | Size in bytes | 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.