|   |     | 
| (61 intermediate revisions by 6 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 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
 |  | 
|  | |-
 |  | 
|  | | 0x4E00
 |  | 
|  | | 0x200
 |  | 
|  | | Unknown
 |  | 
|  | |-
 |  | 
|  | | 0x5000
 |  | 
|  | | 0x200
 |  | 
|  | | Unknown
 |  | 
|  | |-
 |  | 
|  | | 0x5200
 |  | 
|  | | 0x800
 |  | 
|  | | Unknown
 |  | 
|  | |-
 |  | 
|  | | 0x5A00
 |  | 
|  | | 0x4000
 |  | 
|  | | Controller Serials?
 |  | 
|  | |-
 |  | 
|  | | 0x9A00
 |  | 
|  | | 0x32000
 |  | 
|  | | Controllers
 |  | 
|  | |-
 |  | 
|  | | 0x3BA00
 |  | 
|  | | 0x4600
 |  | 
|  | | Unknown
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | == Capacitive Touchscreen ==
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x28	
 |  | 
|  | | Touch Header	
 |  | 
|  | |-
 |  | 
|  | | 0x28	
 |  | 
|  | | 0x290 * 17	
 |  | 
|  | | Touch Entries	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | === Touch Header ===
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp	
 |  | 
|  | |-
 |  | 
|  | | 0x8	
 |  | 
|  | | 0x8	
 |  | 
|  | | Number of Entries
 |  | 
|  | |-
 |  | 
|  | | 0x10	
 |  | 
|  | | 0x8	
 |  | 
|  | | Unk	
 |  | 
|  | |-
 |  | 
|  | | 0x18	
 |  | 
|  | | 0x8	
 |  | 
|  | | Unk, 0x10	
 |  | 
|  | |-
 |  | 
|  | | 0x20	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | === Touch Entry ===
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x10	
 |  | 
|  | | Touch Entry Header	
 |  | 
|  | |-
 |  | 
|  | | 0x10	
 |  | 
|  | | 0x28 * 16	
 |  | 
|  | | Touch Data	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | ==== Touch Structure Header ====
 |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp	
 |  | 
|  | |-
 |  | 
|  | | 0x8	
 |  | 
|  | | 0x8	
 |  | 
|  | | Number of Touches	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | ==== Touch Data Entry ====
 |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp	
 |  | 
|  | |-
 |  | 
|  | | 0x8	
 |  | 
|  | | 0x8	
 |  | 
|  | | Unknown	
 |  | 
|  | |-
 |  | 
|  | | 0x10	
 |  | 
|  | | 0x4	
 |  | 
|  | | Touch X	
 |  | 
|  | |-
 |  | 
|  | | 0x14	
 |  | 
|  | | 0x4	
 |  | 
|  | | Touch Y	
 |  | 
|  | |-
 |  | 
|  | | 0x18	
 |  | 
|  | | 0x4	
 |  | 
|  | | Touch Diameter X	
 |  | 
|  | |-
 |  | 
|  | | 0x1C	
 |  | 
|  | | 0x4	
 |  | 
|  | | Touch Diameter Y	
 |  | 
|  | |-
 |  | 
|  | | 0x20	
 |  | 
|  | | 0x4	
 |  | 
|  | | Angle	
 |  | 
|  | |-
 |  | 
|  | | 0x24	
 |  | 
|  | | 0x4	
 |  | 
|  | | Unknown	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | == Mouse ==
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x20	
 |  | 
|  | | Mouse Header	
 |  | 
|  | |-
 |  | 
|  | | 0x20	
 |  | 
|  | | 0x30 * 17	
 |  | 
|  | | Mouse Entries	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | === Mouse Header ===
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp	
 |  | 
|  | |-
 |  | 
|  | | 0x8	
 |  | 
|  | | 0x8	
 |  | 
|  | | Number of Entries
 |  | 
|  | |-
 |  | 
|  | | 0x10	
 |  | 
|  | | 0x8	
 |  | 
|  | | Unk, 6 when connected, 1 disconnected
 |  | 
|  | |-
 |  | 
|  | | 0x18	
 |  | 
|  | | 0x8	
 |  | 
|  | | Unk, 0x10	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | === Mouse Entry ===
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp	
 |  | 
|  | |-
 |  | 
|  | | 0x8	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp 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 in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x20	
 |  | 
|  | | Keyboard Header	
 |  | 
|  | |-
 |  | 
|  | | 0x20	
 |  | 
|  | | 0x30 * 17	
 |  | 
|  | | Keyboard Entries	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | === Keyboard Header ===
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp	
 |  | 
|  | |-
 |  | 
|  | | 0x8	
 |  | 
|  | | 0x8	
 |  | 
|  | | Number of Entries
 |  | 
|  | |-
 |  | 
|  | | 0x10	
 |  | 
|  | | 0x8	
 |  | 
|  | | Unk, 6 when connected
 |  | 
|  | |-
 |  | 
|  | | 0x18	
 |  | 
|  | | 0x8	
 |  | 
|  | | Unk, 0x10	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | === Keyboard Entry ===
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp	
 |  | 
|  | |-
 |  | 
|  | | 0x8	
 |  | 
|  | | 0x8	
 |  | 
|  | | Timestamp 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	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | == Controllers ==
 |  | 
|  |   |  | 
|  | This section contains a series of 10 0x5000 byte structures describing each available controller.
 |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Controller Index
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0 to 7	
 |  | 
|  | | Players 1 to 8	
 |  | 
|  | |-
 |  | 
|  | | 8	
 |  | 
|  | | Handheld Mode	
 |  | 
|  | |-
 |  | 
|  | | 9	
 |  | 
|  | | Unknown	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | === Controller ===
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   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
 |  | 
|  | |-
 |  | 
|  | | 0x41D0	
 |  | 
|  | | 0x10	
 |  | 
|  | | Controller MAC	
 |  | 
|  | |-
 |  | 
|  | | 0x41F0	
 |  | 
|  | | 0x10	
 |  | 
|  | | Controller MAC	
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | ==== Controller Header ====
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   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 ====
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0
 |  | 
|  | | 0x8
 |  | 
|  | | Timestamp
 |  | 
|  | |-
 |  | 
|  | | 0x8
 |  | 
|  | | 0x8
 |  | 
|  | | Number of entries, always 17
 |  | 
|  | |-
 |  | 
|  | | 0x10
 |  | 
|  | | 0x8
 |  | 
|  | | Unknown, increments
 |  | 
|  | |-
 |  | 
|  | | 0x18
 |  | 
|  | | 0x8
 |  | 
|  | | Unknown, 0x10
 |  | 
|  | |-
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | ==== Controller State ====
 |  | 
|  |   |  | 
|  | {| class="wikitable" border="1"
 |  | 
|  | |-
 |  | 
|  | !   Offset
 |  | 
|  | !   Size in bytes
 |  | 
|  | !   Description
 |  | 
|  | |-
 |  | 
|  | | 0x0
 |  | 
|  | | 0x8
 |  | 
|  | | Timestamp
 |  | 
|  | |-
 |  | 
|  | | 0x8
 |  | 
|  | | 0x8
 |  | 
|  | | Timestamp 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
 |  | 
|  | |-
 |  | 
|  | |}
 |  |