HID services: Difference between revisions

(23 intermediate revisions by 2 users not shown)
Line 157: Line 157:
|-
|-
| 211 || [7.0.0+] [[#IsVibrationDeviceMounted]]
| 211 || [7.0.0+] [[#IsVibrationDeviceMounted]]
|-
| 212 || [11.0.0+] [[#SendVibrationValueInBool]]
|-
|-
| 300 || [3.0.0+] [[#ActivateConsoleSixAxisSensor]]
| 300 || [3.0.0+] [[#ActivateConsoleSixAxisSensor]]
Line 584: Line 586:
== IsVibrationDeviceMounted ==
== IsVibrationDeviceMounted ==
Takes a PID, an [[#VibrationDeviceHandle]], and an u64 [[AM_services|AppletResourceUserId]], returns an output u8 bool.
Takes a PID, an [[#VibrationDeviceHandle]], and an u64 [[AM_services|AppletResourceUserId]], returns an output u8 bool.
== SendVibrationValueInBool ==
Takes a PID, a bool, a [[#VibrationDeviceHandle]], and an [[AM_services|AppletResourceUserId]], no output.
Stubbed, this just returns 0.
This is currently not exposed by sdknso.


== ActivateConsoleSixAxisSensor ==
== ActivateConsoleSixAxisSensor ==
Line 713: Line 722:


sdknso uses an user-specified EventClearMode.
sdknso uses an user-specified EventClearMode.
The Event is signaled when data is available with [[#GetPalmaOperationInfo]].


== GetPalmaOperationInfo ==
== GetPalmaOperationInfo ==
Line 718: Line 729:


sdknso passes [[#PalmaOperationInfo]]+0x8 size 0x140 for the output buffer. [5.1.0+] After using the cmd successfully, [[#GetPalmaOperationResult]] is used.
sdknso passes [[#PalmaOperationInfo]]+0x8 size 0x140 for the output buffer. [5.1.0+] After using the cmd successfully, [[#GetPalmaOperationResult]] is used.
This must be used at some point following using any of the other Palma cmds which trigger an Operation, once the [[#AcquirePalmaOperationCompleteEvent|Event]] is signaled. Up to 4 Operations can be queued at once, the other cmds will throw an error once there's too many operations.


== PlayPalmaActivity ==
== PlayPalmaActivity ==
Takes an input [[#PalmaConnectionHandle]], an u64 (exposed by sdknso as an u16), no output.
Takes an input [[#PalmaConnectionHandle]], an u64 (exposed by sdknso as an u16), no output.
See [[#hidGetPalmaOperationInfo]].


== SetPalmaFrModeType ==
== SetPalmaFrModeType ==
Takes an input [[#PalmaConnectionHandle]], an u64 [[#PalmaFrModeType]], no output.
Takes an input [[#PalmaConnectionHandle]], an u64 [[#PalmaFrModeType]], no output.
See [[#hidGetPalmaOperationInfo]].


== ReadPalmaStep ==
== ReadPalmaStep ==
Takes an input [[#PalmaConnectionHandle]], no output.
Takes an input [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


[[#EnablePalmaStep]] should be used before this.
[[#EnablePalmaStep]] should be used before this.
Line 732: Line 751:
== EnablePalmaStep ==
== EnablePalmaStep ==
Takes an input bool, a [[#PalmaConnectionHandle]], no output.
Takes an input bool, a [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


== ResetPalmaStep ==
== ResetPalmaStep ==
Takes an input [[#PalmaConnectionHandle]], no output.
Takes an input [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


== ReadPalmaApplicationSection ==
== ReadPalmaApplicationSection ==
Takes an input [[#PalmaConnectionHandle]], an u64, an u64, no output.
Takes an input [[#PalmaConnectionHandle]], an u64, an u64 size, no output.


sdknso exposes the first u64 as a s32. sdknso will Abort if the input value for the second u64 is >0x100.
sdknso exposes the first u64 as a s32. sdknso will Abort if the input value for the second u64 is >0x100.
See [[#hidGetPalmaOperationInfo]].


== WritePalmaApplicationSection ==
== WritePalmaApplicationSection ==
Line 745: Line 770:


sdknso exposes the first u64 as a s32. Data is copied from the input [[#PalmaApplicationSectionAccessBuffer]] with the specified size.
sdknso exposes the first u64 as a s32. Data is copied from the input [[#PalmaApplicationSectionAccessBuffer]] with the specified size.
See [[#hidGetPalmaOperationInfo]].


== ReadPalmaUniqueCode ==
== ReadPalmaUniqueCode ==
Takes an input [[#PalmaConnectionHandle]], no output.
Takes an input [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


== SetPalmaUniqueCodeInvalid ==
== SetPalmaUniqueCodeInvalid ==
Takes an input [[#PalmaConnectionHandle]], no output.
Takes an input [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


== WritePalmaActivityEntry ==
== WritePalmaActivityEntry ==
Line 756: Line 787:


sdknso exposes the first u64 as an u16, while the rest are exposed as [[#PalmaActivityEntry]].
sdknso exposes the first u64 as an u16, while the rest are exposed as [[#PalmaActivityEntry]].
See [[#hidGetPalmaOperationInfo]].


== WritePalmaRgbLedPatternEntry ==
== WritePalmaRgbLedPatternEntry ==
Line 761: Line 794:


sdknso exposes the u64 as an u16.
sdknso exposes the u64 as an u16.
See [[#hidGetPalmaOperationInfo]].


== WritePalmaWaveEntry ==
== WritePalmaWaveEntry ==
Line 768: Line 803:


Note that the sysmodule will not properly close the TransferMemory handle if the [[#PalmaConnectionHandle]] is invalid.
Note that the sysmodule will not properly close the TransferMemory handle if the [[#PalmaConnectionHandle]] is invalid.
See [[#hidGetPalmaOperationInfo]].


== SetPalmaDataBaseIdentificationVersion ==
== SetPalmaDataBaseIdentificationVersion ==
Takes an input s32, a [[#PalmaConnectionHandle]], no output.
Takes an input s32, a [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


== GetPalmaDataBaseIdentificationVersion ==
== GetPalmaDataBaseIdentificationVersion ==
Takes an input [[#PalmaConnectionHandle]], no output.
Takes an input [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


== SuspendPalmaFeature ==
== SuspendPalmaFeature ==
Takes an input "nn::util::BitFlagSet<32, [[#PalmaFeature]]>", a [[#PalmaConnectionHandle]], no output.
Takes an input "nn::util::BitFlagSet<32, [[#PalmaFeature]]>", a [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


== GetPalmaOperationResult ==
== GetPalmaOperationResult ==
Line 785: Line 828:
== ReadPalmaPlayLog ==
== ReadPalmaPlayLog ==
Takes an input u16, a [[#PalmaConnectionHandle]], no output.
Takes an input u16, a [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


== ResetPalmaPlayLog ==
== ResetPalmaPlayLog ==
Takes an input u16, a [[#PalmaConnectionHandle]], no output.
Takes an input u16, a [[#PalmaConnectionHandle]], no output.
See [[#hidGetPalmaOperationInfo]].


== SetIsPalmaAllConnectable ==
== SetIsPalmaAllConnectable ==
Line 817: Line 864:
== SetNpadCommunicationMode ==
== SetNpadCommunicationMode ==
Takes a PID, an [[AM_services|AppletResourceUserId]], a s64 [[#NpadCommunicationMode]], no output.
Takes a PID, an [[AM_services|AppletResourceUserId]], a s64 [[#NpadCommunicationMode]], no output.
[2.0.0+] Stubbed, just returns 0.


== GetNpadCommunicationMode ==
== GetNpadCommunicationMode ==
Line 822: Line 871:


sdknso uses a switch-statement to determine the value to write to the output [[#NpadCommunicationMode]], with the s64 (written value is the same as the s64). sdknso will Abort if the s64 is not 0-3.
sdknso uses a switch-statement to determine the value to write to the output [[#NpadCommunicationMode]], with the s64 (written value is the same as the s64). sdknso will Abort if the s64 is not 0-3.
[2.0.0+] Stubbed, just returns hard-coded output mode=3.


== SetTouchScreenConfiguration ==
== SetTouchScreenConfiguration ==
Line 878: Line 929:
|-
|-
| 13 || [9.0.0+] GetTouchScreenConfiguration
| 13 || [9.0.0+] GetTouchScreenConfiguration
|-
| 14 || [11.0.0+] ProcessTouchScreenAutoTune
|-
|-
| 20 || [[#DeactivateMouse]]
| 20 || [[#DeactivateMouse]]
Line 913: Line 966:
| 112 || UnsetHomeButtonAutoPilotState
| 112 || UnsetHomeButtonAutoPilotState
|-
|-
| 120 || DeactivateSleepButton
| 120 || [[#DeactivateSleepButton]]
|-
|-
| 121 || SetSleepButtonAutoPilotState
| 121 || [[#SetSleepButtonAutoPilotState]]
|-
|-
| 122 || UnsetSleepButtonAutoPilotState
| 122 || [[#UnsetSleepButtonAutoPilotState]]
|-
|-
| 123 || [1.0.0-9.2.0] DeactivateInputDetector
| 123 || [1.0.0-9.2.0] DeactivateInputDetector
Line 1,038: Line 1,091:
|-
|-
| 246 || [9.0.0+] GetVidPid
| 246 || [9.0.0+] GetVidPid
|-
| 247 || [11.0.0+] GetAnalogStickCalibrationValue
|-
| 248 || [11.0.0+] GetUniquePadIdsFull
|-
| 249 || [11.0.0+] ConnectUniquePad
|-
| 250 || [12.0.0+] IsVirtual
|-
| 251 || [12.0.0+] GetAnalogStickModuleParam
|-
|-
| 301 || [5.0.0-8.1.0] [[#GetAbstractedPadHandles]]
| 301 || [5.0.0-8.1.0] [[#GetAbstractedPadHandles]]
Line 1,069: Line 1,132:
| 332 || [7.0.0+] [[#SetHdlsState]]
| 332 || [7.0.0+] [[#SetHdlsState]]
|-
|-
| 350 || [5.0.0+] AddRegisteredDevice
| 350 || [5.0.0+] [[#AddRegisteredDevice]]
|-
|-
| 400 || [6.0.0+] DisableExternalMcuOnNxDevice
| 400 || [6.0.0+] DisableExternalMcuOnNxDevice
Line 1,078: Line 1,141:
|-
|-
| 403 || [10.0.0+] EnableShipmentModeAutoClear
| 403 || [10.0.0+] EnableShipmentModeAutoClear
|-
| 404 || [11.0.0+] SetRailEnabled
|-
|-
| 500 || [8.0.0+] SetFactoryInt
| 500 || [8.0.0+] SetFactoryInt
Line 1,090: Line 1,155:
|-
|-
| 600 || [10.0.0+] ConvertPadState
| 600 || [10.0.0+] ConvertPadState
|-
| 650 || [12.0.0+] AddButtonPlayData
|-
| 651 || [12.0.0+] StartButtonPlayData
|-
| 652 || [12.0.0+] StopButtonPlayData
|-
|-
| 2000 || [10.0.0+] DeactivateDigitizer
| 2000 || [10.0.0+] DeactivateDigitizer
Line 1,143: Line 1,214:


This just returns 0.
This just returns 0.
== DeactivateSleepButton ==
No input/output.
== SetSleepButtonAutoPilotState ==
Takes an input [[#SleepButtonAutoPilotState]], no output.
== UnsetSleepButtonAutoPilotState ==
No input/output.


== StartFirmwareUpdate ==
== StartFirmwareUpdate ==
Line 1,291: Line 1,371:


[9.0.0+] Input order was swapped: now takes an input [[#HdlsHandle]] and a [[#HdlsState]], no output.
[9.0.0+] Input order was swapped: now takes an input [[#HdlsHandle]] and a [[#HdlsState]], no output.
== AddRegisteredDevice ==
Takes an input [[#RegisteredDevice]], no output.
[11.0.0+] Takes an input [[#DebugRegisteredDevice]], no output.


= hid:sys =
= hid:sys =
Line 1,402: Line 1,487:
|-
|-
| 513 || [3.0.0+] EndPermitVibrationSession
| 513 || [3.0.0+] EndPermitVibrationSession
|-
| 514 || [12.0.0+] SendVibrationNotificationPattern
|-
|-
| 520 || EnableHandheldHids
| 520 || EnableHandheldHids
Line 1,412: Line 1,499:
|-
|-
| 524 || [10.0.0+] IsHandheldHidsEnabled
| 524 || [10.0.0+] IsHandheldHidsEnabled
|-
| 525 || [11.0.0+] IsJoyConAttachedOnAllRail
|-
|-
| 540 || AcquirePlayReportControllerUsageUpdateEvent
| 540 || AcquirePlayReportControllerUsageUpdateEvent
Line 1,567: Line 1,656:
| 1200 || [10.0.0+] [[#IsButtonConfigSupported]]
| 1200 || [10.0.0+] [[#IsButtonConfigSupported]]
|-
|-
| 1201 || [10.0.0+] [[#DeleteButtonConfig]]
| 1201 || [11.0.0+] [[#IsButtonConfigEmbeddedSupported]] ([10.0.0-10.2.0] [[#DeleteButtonConfig]])
|-
|-
| 1202 || [10.0.0+] [[#SetButtonConfigEnabled]]
| 1202 || [11.0.0+] [[#DeleteButtonConfig]] ([10.0.0-10.2.0] [[#SetButtonConfigEnabled]])
|-
|-
| 1203 || [10.0.0+] [[#IsButtonConfigEnabled]]
| 1203 || [11.0.0+] [[#DeleteButtonConfigEmbedded]] ([10.0.0-10.2.0] [[#IsButtonConfigEnabled]])
|-
|-
| 1204 || [10.0.0+] [[#SetButtonConfigEmbedded]]
| 1204 || [11.0.0+] [[#SetButtonConfigEnabled]] ([10.0.0-10.2.0] [[#SetButtonConfigEmbedded]])
|-
|-
| 1205 || [10.0.0+] [[#SetButtonConfigFull]]
| 1205 || [11.0.0+] [[#SetButtonConfigEmbeddedEnabled]] ([10.0.0-10.2.0] [[#SetButtonConfigFull]])
|-
|-
| 1206 || [10.0.0+] [[#SetButtonConfigLeft]]
| 1206 || [11.0.0+] [[#IsButtonConfigEnabled]] ([10.0.0-10.2.0] [[#SetButtonConfigLeft]])
|-
|-
| 1207 || [10.0.0+] [[#SetButtonConfigRight]]
| 1207 || [11.0.0+] [[#IsButtonConfigEmbeddedEnabled]] ([10.0.0-10.2.0] [[#SetButtonConfigRight]])
|-
|-
| 1208 || [10.0.0+] [[#GetButtonConfigEmbedded]]
| 1208 || [11.0.0+] [[#SetButtonConfigEmbedded]] ([10.0.0-10.2.0] [[#GetButtonConfigEmbedded]])
|-
|-
| 1209 || [10.0.0+] [[#GetButtonConfigFull]]
| 1209 || [11.0.0+] [[#SetButtonConfigFull]] ([10.0.0-10.2.0] [[#GetButtonConfigFull]])
|-
|-
| 1210 || [10.0.0+] [[#GetButtonConfigLeft]]
| 1210 || [10.0.0-10.2.0] [[#GetButtonConfigLeft]]
|-
|-
| 1211 || [10.0.0+] [[#GetButtonConfigRight]]
| 1211 || [11.0.0+] [[#SetButtonConfigRight]] ([10.0.0-10.2.0] [[#GetButtonConfigRight]])
|-
| 1212 || [11.0.0+] [[#GetButtonConfigEmbedded]]
|-
| 1213 || [11.0.0+] [[#GetButtonConfigFull]]
|-
| 1214 || [11.0.0+] [[#GetButtonConfigLeft]]
|-
| 1215 || [11.0.0+] [[#GetButtonConfigRight]]
|-
|-
| 1250 || [10.0.0+] [[#IsCustomButtonConfigSupported]]
| 1250 || [10.0.0+] [[#IsCustomButtonConfigSupported]]
Line 1,607: Line 1,704:
| 1258 || [10.0.0+] [[#IsButtonConfigStorageRightEmpty]]
| 1258 || [10.0.0+] [[#IsButtonConfigStorageRightEmpty]]
|-
|-
| 1259 || [10.0.0+] [[#GetButtonConfigStorageEmbedded]]
| 1259 || [11.0.0+] [[#GetButtonConfigStorageEmbeddedDeprecated]] ([10.0.0-10.2.0] [[#GetButtonConfigStorageEmbeddedDeprecated|GetButtonConfigStorageEmbedded]])
|-
|-
| 1260 || [10.0.0+] [[#GetButtonConfigStorageFull]]
| 1260 || [11.0.0+] [[#GetButtonConfigStorageFullDeprecated]] ([10.0.0-10.2.0] [[#GetButtonConfigStorageFullDeprecated|GetButtonConfigStorageFull]])
|-
|-
| 1261 || [10.0.0+] [[#GetButtonConfigStorageLeft]]
| 1261 || [11.0.0+] [[#GetButtonConfigStorageLeftDeprecated]] ([10.0.0-10.2.0] [[#GetButtonConfigStorageLeftDeprecated|GetButtonConfigStorageLeft]])
|-
|-
| 1262 || [10.0.0+] [[#GetButtonConfigStorageRight]]
| 1262 || [11.0.0+] [[#GetButtonConfigStorageRightDeprecated]] ([10.0.0-10.2.0] [[#GetButtonConfigStorageRightDeprecated|GetButtonConfigStorageRight]])
|-
|-
| 1263 || [10.0.0+] [[#SetButtonConfigStorageEmbedded]]
| 1263 || [11.0.0+] [[#SetButtonConfigStorageEmbeddedDeprecated]] ([10.0.0-10.2.0] [[#SetButtonConfigStorageEmbeddedDeprecated|SetButtonConfigStorageEmbedded]])
|-
|-
| 1264 || [10.0.0+] [[#SetButtonConfigStorageFull]]
| 1264 || [11.0.0+] [[#SetButtonConfigStorageFullDeprecated]] ([10.0.0-10.2.0] [[#SetButtonConfigStorageFullDeprecated|SetButtonConfigStorageFull]])
|-
|-
| 1265 || [10.0.0+] [[#SetButtonConfigStorageLeft]]
| 1265 || [11.0.0+] [[#SetButtonConfigStorageLeftDeprecated]] ([10.0.0-10.2.0] [[#SetButtonConfigStorageLeftDeprecated|SetButtonConfigStorageLeft]])
|-
|-
| 1266 || [10.0.0+] [[#SetButtonConfigStorageRight]]
| 1266 || [11.0.0+] [[#SetButtonConfigStorageRightDeprecated]] ([10.0.0-10.2.0] [[#SetButtonConfigStorageRightDeprecated|SetButtonConfigStorageRight]])
|-
|-
| 1267 || [10.0.0+] [[#DeleteButtonConfigStorageEmbedded]]
| 1267 || [10.0.0+] [[#DeleteButtonConfigStorageEmbedded]]
Line 1,656: Line 1,753:
|-
|-
| 1283 || [10.0.0+] [[#GetHidButtonConfigRight]]
| 1283 || [10.0.0+] [[#GetHidButtonConfigRight]]
|-
| 1284 || [11.0.0+] [[#GetButtonConfigStorageEmbedded]]
|-
| 1285 || [11.0.0+] [[#GetButtonConfigStorageFull]]
|-
| 1286 || [11.0.0+] [[#GetButtonConfigStorageLeft]]
|-
| 1287 || [11.0.0+] [[#GetButtonConfigStorageRight]]
|-
| 1288 || [11.0.0+] [[#SetButtonConfigStorageEmbedded]]
|-
| 1289 || [11.0.0+] [[#SetButtonConfigStorageFull]]
|-
| 1290 || [11.0.0+] [[#SetButtonConfigStorageLeft]]
|-
| 1291 || [11.0.0+] [[#SetButtonConfigStorageRight]]
|-
| 12010 || [11.0.0+] [[#SetButtonConfigLeft]]
|}
|}


Line 1,757: Line 1,872:
== IsButtonConfigSupported ==
== IsButtonConfigSupported ==
Takes an input [[#UniquePadId]], returns an output bool.
Takes an input [[#UniquePadId]], returns an output bool.
[11.0.0+] Takes an input [[Bluetooth_Driver_services#Address|Address]], returns an output bool.
== IsButtonConfigEmbeddedSupported ==
No input, returns an output bool.


== DeleteButtonConfig ==
== DeleteButtonConfig ==
Takes an input [[#UniquePadId]], no output.
Takes an input [[#UniquePadId]], no output.
[11.0.0+] Takes an input [[Bluetooth_Driver_services#Address|Address]], no output.
== DeleteButtonConfigEmbedded ==
No input/output.


== SetButtonConfigEnabled ==
== SetButtonConfigEnabled ==
Takes an input bool, an [[#UniquePadId]], no output.
Takes an input bool, an [[#UniquePadId]], no output.
[11.0.0+] Takes an input bool, an [[Bluetooth_Driver_services#Address|Address]], no output.
== SetButtonConfigEmbeddedEnabled ==
Takes an input bool, no output.


== IsButtonConfigEnabled ==
== IsButtonConfigEnabled ==
Takes an input [[#UniquePadId]], returns an output bool.
Takes an input [[#UniquePadId]], returns an output bool.
[11.0.0+] Takes an input [[Bluetooth_Driver_services#Address|Address]], returns an output bool.
== IsButtonConfigEmbeddedEnabled ==
No input, returns an output bool.


== SetButtonConfigEmbedded ==
== SetButtonConfigEmbedded ==
Takes an input [[#UniquePadId]], a type-0x15 input buffer containing a [[#SystemButtonConfigEmbedded]], no output.
Takes ([10.0.0-10.2.0] an input [[#UniquePadId]]), a type-0x15 input buffer containing a [[#SystemButtonConfigEmbedded]], no output.


== SetButtonConfigFull ==
== SetButtonConfigFull ==
Takes an input [[#UniquePadId]], a type-0x15 input buffer containing a [[#SystemButtonConfigFull]], no output.
Takes an input [[#UniquePadId]], a type-0x15 input buffer containing a [[#SystemButtonConfigFull]], no output.
[11.0.0+] Takes an input [[Bluetooth_Driver_services#Address|Address]], a type-0x15 input buffer containing a [[#SystemButtonConfigFull]], no output.


== SetButtonConfigLeft ==
== SetButtonConfigLeft ==
Takes an input [[#UniquePadId]], a type-0x15 input buffer containing a [[#SystemButtonConfigLeft]], no output.
Takes an input [[#UniquePadId]], a type-0x15 input buffer containing a [[#SystemButtonConfigLeft]], no output.
[11.0.0+] Takes an input [[Bluetooth_Driver_services#Address|Address]], a type-0x15 input buffer containing a [[#SystemButtonConfigLeft]], no output.


== SetButtonConfigRight ==
== SetButtonConfigRight ==
Takes an input [[#UniquePadId]], a type-0x15 input buffer containing a [[#SystemButtonConfigRight]], no output.
Takes an input [[#UniquePadId]], a type-0x15 input buffer containing a [[#SystemButtonConfigRight]], no output.
[11.0.0+] Takes an input [[Bluetooth_Driver_services#Address|Address]], a type-0x15 input buffer containing a [[#SystemButtonConfigRight]], no output.


== GetButtonConfigEmbedded ==
== GetButtonConfigEmbedded ==
Takes an input [[#UniquePadId]], and a type-0x16 output buffer containing a [[#SystemButtonConfigEmbedded]].
Takes ([10.0.0-10.2.0] an input [[#UniquePadId]]), and a type-0x16 output buffer containing a [[#SystemButtonConfigEmbedded]].


== GetButtonConfigFull ==
== GetButtonConfigFull ==
Takes an input [[#UniquePadId]], and a type-0x16 output buffer containing a [[#SystemButtonConfigFull]].
Takes an input [[#UniquePadId]], and a type-0x16 output buffer containing a [[#SystemButtonConfigFull]].
[11.0.0+] Takes an input [[Bluetooth_Driver_services#Address|Address]], and a type-0x16 output buffer containing a [[#SystemButtonConfigFull]].


== GetButtonConfigLeft ==
== GetButtonConfigLeft ==
Takes an input [[#UniquePadId]], and a type-0x16 output buffer containing a [[#SystemButtonConfigLeft]].
Takes an input [[#UniquePadId]], and a type-0x16 output buffer containing a [[#SystemButtonConfigLeft]].
[11.0.0+] Takes an input [[Bluetooth_Driver_services#Address|Address]], and a type-0x16 output buffer containing a [[#SystemButtonConfigLeft]].


== GetButtonConfigRight ==
== GetButtonConfigRight ==
Takes an input [[#UniquePadId]], and a type-0x16 output buffer containing a [[#SystemButtonConfigRight]].
Takes an input [[#UniquePadId]], and a type-0x16 output buffer containing a [[#SystemButtonConfigRight]].
[11.0.0+] Takes an input [[Bluetooth_Driver_services#Address|Address]], and a type-0x16 output buffer containing a [[#SystemButtonConfigRight]].


== IsCustomButtonConfigSupported ==
== IsCustomButtonConfigSupported ==
Line 1,817: Line 1,964:
Takes an input s32 entry-index, returns an output bool.
Takes an input s32 entry-index, returns an output bool.


[10.1.0+] This will now Abort if the s32 is negative or >=5.
[10.1.0-10.2.0] This will now Abort if the s32 is negative or >=5. [11.0.0+] This value must now be unsigned <=4, otherwise 0 is returned.


Uses [[Settings_services#GetButtonConfigSettingsEmbedded|GetButtonConfigSettingsEmbedded]] with count=5 (output s32 ignored). The input entry-index is used with this array. Then the output bool is set to [[Settings_services#ButtonConfigSettings|IsFull]] bit0 == 0. Then 0 is returned.
Uses [[Settings_services#GetButtonConfigSettingsEmbedded|GetButtonConfigSettingsEmbedded]] with count=5 (output s32 ignored). The input entry-index is used with this array. Then the output bool is set to [[Settings_services#ButtonConfigSettings|IsFull]] bit0 == 0. Then 0 is returned.
Line 1,836: Line 1,983:
Same as [[#IsButtonConfigStorageEmbeddedEmpty]] except with a different setsys cmd.
Same as [[#IsButtonConfigStorageEmbeddedEmpty]] except with a different setsys cmd.


== GetButtonConfigStorageEmbedded ==
== GetButtonConfigStorageEmbeddedDeprecated ==
Takes an input s32 entry-index, and a type-0x16 output buffer containing a [[#ButtonConfigEmbedded]].
Takes an input s32 entry-index, and a type-0x16 output buffer containing a [[#ButtonConfigEmbedded]].


[10.1.0+] This will now Abort if the s32 is negative or >=5.
[10.1.0-10.2.0] This will now Abort if the s32 is negative or >=5.
 
[11.0.0+] This now calls the same func internally as [[#GetButtonConfigStorageEmbedded]], except the [[#StorageName]] isn't exposed.


Uses [[Settings_services#GetButtonConfigSettingsEmbedded|GetButtonConfigSettingsEmbedded]] with count=5 (output s32 ignored). The input entry-index is used with this array. Then an error is thrown if [[Settings_services#ButtonConfigSettings|IsFull]] bit0 is clear. Then the data at +0x1C8 is converted to [[#ButtonConfigEmbedded]], copied to output, and returns 0.
Uses [[Settings_services#GetButtonConfigSettingsEmbedded|GetButtonConfigSettingsEmbedded]] with count=5 (output s32 ignored). The input entry-index is used with this array. Then an error is thrown if [[Settings_services#ButtonConfigSettings|IsFull]] bit0 is clear. Then the data at +0x1C8 is converted to [[#ButtonConfigEmbedded]], copied to output, and returns 0.


== GetButtonConfigStorageFull ==
== GetButtonConfigStorageFullDeprecated ==
Takes an input s32 entry-index, and a type-0x16 output buffer containing a [[#ButtonConfigFull]].
Takes an input s32 entry-index, and a type-0x16 output buffer containing a [[#ButtonConfigFull]].


Same as [[#GetButtonConfigStorageEmbedded]], except this uses a different setsys cmd, and uses a different conversion func / different output struct.
Same as [[#GetButtonConfigStorageEmbeddedDeprecated]], except this uses a different setsys cmd, and uses a different conversion func / different output struct.


== GetButtonConfigStorageLeft ==
== GetButtonConfigStorageLeftDeprecated ==
Takes an input s32 entry-index, and a type-0x16 output buffer containing a [[#ButtonConfigLeft]].
Takes an input s32 entry-index, and a type-0x16 output buffer containing a [[#ButtonConfigLeft]].


Same as [[#GetButtonConfigStorageEmbedded]], except this uses a different setsys cmd, and uses a different conversion func / different output struct.
Same as [[#GetButtonConfigStorageEmbeddedDeprecated]], except this uses a different setsys cmd, and uses a different conversion func / different output struct.


== GetButtonConfigStorageRight ==
== GetButtonConfigStorageRightDeprecated ==
Takes an input s32 entry-index, and a type-0x16 output buffer containing a [[#ButtonConfigRight]].
Takes an input s32 entry-index, and a type-0x16 output buffer containing a [[#ButtonConfigRight]].


Same as [[#GetButtonConfigStorageEmbedded]], except this uses a different setsys cmd, and uses a different conversion func / different output struct.
Same as [[#GetButtonConfigStorageEmbeddedDeprecated]], except this uses a different setsys cmd, and uses a different conversion func / different output struct.


== SetButtonConfigStorageEmbedded ==
== SetButtonConfigStorageEmbeddedDeprecated ==
Takes an input s32 entry-index, and a type-0x15 input buffer containing a [[#ButtonConfigEmbedded]].
Takes an input s32 entry-index, and a type-0x15 input buffer containing a [[#ButtonConfigEmbedded]].


[10.1.0+] This will now Abort if the s32 is negative or >=5.
[10.1.0-10.2.0] This will now Abort if the s32 is negative or >=5.
 
[11.0.0+] This now calls the same func internally as [[#SetButtonConfigStorageEmbedded]], except the [[#StorageName]] isn't exposed.


If the input config matches the [[#IsDefaultButtonConfigEmbedded|default]], this first does:  
If the input config matches the [[#IsDefaultButtonConfigEmbedded|default]], this first does:  
Line 1,868: Line 2,019:
Afterwards, this uses [[Settings_services#GetButtonConfigSettingsEmbedded|GetButtonConfigSettingsEmbedded]] with count=5 (output s32 ignored). The input entry-index is used with this array. The input struct is converted, the output from that is copied to +0x1C8 size 0x3E0, IsFull is set, [[Settings_services#SetButtonConfigSettingsEmbedded|SetButtonConfigSettingsEmbedded]] is used with the updated array, and then returns 0.
Afterwards, this uses [[Settings_services#GetButtonConfigSettingsEmbedded|GetButtonConfigSettingsEmbedded]] with count=5 (output s32 ignored). The input entry-index is used with this array. The input struct is converted, the output from that is copied to +0x1C8 size 0x3E0, IsFull is set, [[Settings_services#SetButtonConfigSettingsEmbedded|SetButtonConfigSettingsEmbedded]] is used with the updated array, and then returns 0.


== SetButtonConfigStorageFull ==
== SetButtonConfigStorageFullDeprecated ==
Takes an input s32 entry-index, and a type-0x15 input buffer containing a [[#ButtonConfigFull]].
Takes an input s32 entry-index, and a type-0x15 input buffer containing a [[#ButtonConfigFull]].


Same as [[#SetButtonConfigStorageEmbedded]], except this uses different setsys cmds, and uses a different structs etc.
Same as [[#SetButtonConfigStorageEmbeddedDeprecated]], except this uses different setsys cmds, and uses a different structs etc.


== SetButtonConfigStorageLeft ==
== SetButtonConfigStorageLeftDeprecated ==
Takes an input s32 entry-index, and a type-0x15 input buffer containing a [[#ButtonConfigLeft]].
Takes an input s32 entry-index, and a type-0x15 input buffer containing a [[#ButtonConfigLeft]].


Same as [[#SetButtonConfigStorageEmbedded]], except this uses different setsys cmds, and uses a different structs etc.
Same as [[#SetButtonConfigStorageEmbeddedDeprecated]], except this uses different setsys cmds, and uses a different structs etc.


== SetButtonConfigStorageRight ==
== SetButtonConfigStorageRightDeprecated ==
Takes an input s32 entry-index, and a type-0x15 input buffer containing a [[#ButtonConfigRight]].
Takes an input s32 entry-index, and a type-0x15 input buffer containing a [[#ButtonConfigRight]].


Same as [[#SetButtonConfigStorageEmbedded]], except this uses different setsys cmds, and uses a different structs etc.
Same as [[#SetButtonConfigStorageEmbeddedDeprecated]], except this uses different setsys cmds, and uses a different structs etc.


== DeleteButtonConfigStorageEmbedded ==
== DeleteButtonConfigStorageEmbedded ==
Takes an input s32 entry-index, no output.
Takes an input s32 entry-index, no output.


[10.1.0+] This will now Abort if the s32 is negative or >=5.
[10.1.0-10.2.0] This will now Abort if the s32 is negative or >=5. [11.0.0+] When the input s32 is larger than unsigned value 4, an error is returned.


Uses [[Settings_services#GetButtonConfigSettingsEmbedded|GetButtonConfigSettingsEmbedded]] with count=5 (output s32 ignored). The input entry-index is used with this array. Then an error is thrown if [[Settings_services#ButtonConfigSettings|IsFull]] bit0 is clear. Then the data at +0x1C8 size 0x3E0 is cleared, IsFull bit0 is cleared, [[Settings_services#SetButtonConfigSettingsEmbedded|SetButtonConfigSettingsEmbedded]] is used with the updated array, and then returns 0.
Uses [[Settings_services#GetButtonConfigSettingsEmbedded|GetButtonConfigSettingsEmbedded]] with count=5 (output s32 ignored). The input entry-index is used with this array. Then an error is thrown if [[Settings_services#ButtonConfigSettings|IsFull]] bit0 is clear. Then the data at +0x1C8 size 0x3E0 is cleared, IsFull bit0 is cleared, [[Settings_services#SetButtonConfigSettingsEmbedded|SetButtonConfigSettingsEmbedded]] is used with the updated array, and then returns 0.
Line 1,893: Line 2,044:
Takes an input s32 entry-index, no output.
Takes an input s32 entry-index, no output.


Same as [[#IsButtonConfigStorageEmbeddedEmpty]] except with different setsys cmds.
Same as [[#DeleteButtonConfigStorageEmbedded]] except with different setsys cmds.


== DeleteButtonConfigStorageLeft ==
== DeleteButtonConfigStorageLeft ==
Takes an input s32 entry-index, no output.
Takes an input s32 entry-index, no output.


Same as [[#IsButtonConfigStorageEmbeddedEmpty]] except with different setsys cmds.
Same as [[#DeleteButtonConfigStorageEmbedded]] except with different setsys cmds.


== DeleteButtonConfigStorageRight ==
== DeleteButtonConfigStorageRight ==
Takes an input s32 entry-index, no output.
Takes an input s32 entry-index, no output.


Same as [[#IsButtonConfigStorageEmbeddedEmpty]] except with different setsys cmds.
Same as [[#DeleteButtonConfigStorageEmbedded]] except with different setsys cmds.


== IsUsingCustomButtonConfig ==
== IsUsingCustomButtonConfig ==
Line 1,943: Line 2,094:
== GetHidButtonConfigRight ==
== GetHidButtonConfigRight ==
Takes an input [[#UniquePadId]], and a type-0x16 output buffer containing a [[#ButtonConfigRight]].
Takes an input [[#UniquePadId]], and a type-0x16 output buffer containing a [[#ButtonConfigRight]].
== GetButtonConfigStorageEmbedded ==
Takes an input s32, a type-0x16 output buffer containing a [[#ButtonConfigEmbedded]], a type-0x1A output buffer containing a [[#StorageName]].
When the input s32 is larger than unsigned value 4, an error is returned.
== GetButtonConfigStorageFull ==
Takes an input s32, a type-0x16 output buffer containing a [[#ButtonConfigFull]], a type-0x1A output buffer containing a [[#StorageName]].
== GetButtonConfigStorageLeft ==
Takes an input s32, a type-0x16 output buffer containing a [[#ButtonConfigLeft]], a type-0x1A output buffer containing a [[#StorageName]].
== GetButtonConfigStorageRight ==
Takes an input s32, a type-0x16 output buffer containing a [[#ButtonConfigRight]], a type-0x1A output buffer containing a [[#StorageName]].
== SetButtonConfigStorageEmbedded ==
Takes an input s32, a type-0x15 input buffer containing a [[#ButtonConfigEmbedded]], a type-0x19 input buffer containing a [[#StorageName]].
When the input s32 is larger than unsigned value 4, this will immediately return (this cmd always returns 0 regardless).
== SetButtonConfigStorageFull ==
Takes an input s32, a type-0x15 input buffer containing a [[#ButtonConfigFull]], a type-0x19 input buffer containing a [[#StorageName]].
== SetButtonConfigStorageLeft ==
Takes an input s32, a type-0x15 input buffer containing a [[#ButtonConfigLeft]], a type-0x19 input buffer containing a [[#StorageName]].
== SetButtonConfigStorageRight ==
Takes an input s32, a type-0x15 input buffer containing a [[#ButtonConfigRight]], a type-0x19 input buffer containing a [[#StorageName]].


== IHidbusSystemServer ==
== IHidbusSystemServer ==
Line 5,928: Line 6,107:
This is "nn::hid::KeyboardKeySet". This is a BitFlagSet object for [[#KeyboardKey]].
This is "nn::hid::KeyboardKeySet". This is a BitFlagSet object for [[#KeyboardKey]].


= KeyboardLockKeyEventSet =
= KeyboardKey =
This is "nn::hid::system::KeyboardLockKeyEventSet". This is a BitFlagSet object for [[#KeyboardLockKeyEvent]].
This is "nn::hid::KeyboardKey". This is a 256-bit flag.
 
= KeyboardLockKeyEvent =
This is "nn::hid::system::KeyboardLockKeyEvent". This is a 32-bit flag.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 5,939: Line 6,115:
! Description
! Description
|-
|-
| 0
| 4
| NumLockOn
| A
|-
|-
| 1
| 5
| NumLockOff
| B
|-
| 2
| NumLockToggle
|-
| 3
| CapsLockOn
|-
| 4
| CapsLockOff
|-
| 5
| CapsLockToggle
|-
|-
| 6
| 6
| ScrollLockOn
| C
|-
|-
| 7
| 7
| ScrollLockOff
| D
|-
|-
| 8
| 8
| ScrollLockToggle
| E
|}
 
= BasicXpadButtonSet =
This is "nn::hid::BasicXpadButtonSet". This is a BitFlagSet object for [[#BasicXpadButton]].
 
= HomeButtonSet =
This is "nn::hid::system::HomeButtonSet". This is a BitFlagSet object for [[#HomeButton]].
 
= SleepButtonSet =
This is "nn::hid::system::SleepButtonSet". This is a BitFlagSet object for [[#SleepButton]].
 
= CaptureButtonSet =
This is "nn::hid::system::CaptureButtonSet". This is a BitFlagSet object for [[#CaptureButton]].
 
= NpadButtonSet =
This is "nn::hid::NpadButtonSet". This is a BitFlagSet object for [[#NpadButton]].
 
= NpadButton =
This is "nn::hid::NpadButton". This is a 64-bit flag.
 
{| class="wikitable" border="1"
|-
|-
! Bit
| 9
! Description
| F
|-
|-
| 0
| 10
| A
| G
|-
|-
| 1
| 11
| B
| H
|-
|-
| 2
| 12
| X
| I
|-
|-
| 3
| 13
| Y
| J
|-
|-
| 4
| 14
| StickL
| K
|-
|-
| 5
| 15
| StickR
| L
|-
| 6
| L
|-
| 7
| R
|-
| 8
| ZL
|-
| 9
| ZR
|-
| 10
| Plus
|-
| 11
| Minus
|-
| 12
| Left
|-
| 13
| Up
|-
| 14
| Right
|-
| 15
| Down
|-
|-
| 16
| 16
| StickLLeft
| M
|-
|-
| 17
| 17
| StickLUp
| N
|-
|-
| 18
| 18
| StickLRight
| O
|-
|-
| 19
| 19
| StickLDown
| P
|-
|-
| 20
| 20
| StickRLeft
| Q
|-
|-
| 21
| 21
| StickRUp
| R
|-
|-
| 22
| 22
| StickRRight
| S
|-
|-
| 23
| 23
| StickRDown
| T
|-
|-
| 24
| 24
| LeftSL
| U
|-
|-
| 25
| 25
| LeftSR
| V
|-
|-
| 26
| 26
| RightSL
| W
|-
|-
| 27
| 27
| RightSR
| X
|-
|-
| 28
| 28
| Palma
| Y
|-
|-
| 29
| 29
|  
| Z
|-
|-
| 30
| 30
| HandheldLeftB (Left B button on NES controllers in Handheld mode)
| D1
|}
|-
 
| 31
= AnalogStickCalibrationFlagsSet =
| D2
This is "nn::hid::detail::AnalogStickCalibrationFlagsSet". This is a BitFlagSet object for [[#AnalogStickCalibrationFlags]].
|-
 
| 32
= SixAxisSensorUserCalibrationFlagsSet =
| D3
This is "nn::hid::detail::SixAxisSensorUserCalibrationFlagsSet". This is a BitFlagSet object for [[#SixAxisSensorUserCalibrationFlags]].
|-
 
| 33
= NpadStyleSet =
| D4
This is "nn::hid::NpadStyleSet". This is a BitFlagSet object for [[#NpadStyleTag]].
|-
 
| 34
= NpadStyleTag =
| D5
This is "nn::hid::NpadStyleTag".
|-
 
| 35
{| class="wikitable" border="1"
| D6
!  Bits
|-
!  Description
| 36
!  Notes
| D7
|-
| 37
| D8
|-
|-
| 0
| 38
| NpadStyleFullKey
| D9
| Pro Controller
|-
|-
| 1
| 39
| NpadStyleHandheld
| D0
| Joy-Con controller in handheld mode
|-
|-
| 2
| 40
| NpadStyleJoyDual
| Return
| Joy-Con controller in dual mode
|-
|-
| 3
| 41
| NpadStyleJoyLeft
| Escape
| Joy-Con left controller in single mode
|-
|-
| 4
| 42
| NpadStyleJoyRight
| Backspace
| Joy-Con right controller in single mode
|-
|-
| 5
| 43
| NpadStyleGc
| Tab
| GameCube controller
|-
|-
| 6
| 44
| NpadStylePalma
| Space
| Poké Ball Plus controller
|-
|-
| 7
| 45
| NpadStyleLark
| Minus
| NES/Famicom controller
|-
|-
| 8
| 46
| NpadStyleHandheldLark
| Plus
| NES/Famicom controller in handheld mode
|-
|-
| 9
| 47
| NpadStyleLucia
| OpenBracket
| SNES controller
|-
|-
| 10-28
| 48
| Reserved
| CloseBracket
|
|-
|-
| 29
| 49
| NpadStyleSystemExt
| Pipe
| Generic external controller
|-
|-
| 30
| 50
| NpadStyleSystem
| Tilde
| Generic controller
|-
|-
| 31
| 51
| Reserved
| Semicolon
|
|-
|}
| 52
 
| Quote
= NpadDeviceTypeSet =
|-
This is "nn::hid::system::NpadDeviceType". This is a BitFlagSet object for [[#NpadDeviceType]].
| 53
 
| Backquote
= NpadSystemPropertiesSet =
This is "nn::hid::detail::NpadSystemPropertiesSet". This is a BitFlagSet object for [[#NpadSystemProperties]].
 
= NpadSystemProperties =
This is "nn::hid::NpadSystemProperties". This is a 64-bit flag.
 
{| class="wikitable" border="1"
|-
|-
! Bit
| 54
! Description
| Comma
|-
|-
| 0
| 55
| IsChargingJoyDual
| Period
|-
|-
| 1
| 56
| IsChargingJoyLeft
| Slash
|-
|-
| 2
| 57
| IsChargingJoyRight
| CapsLock
|-
|-
| 3
| 58
| IsPoweredJoyDual
| F1
|-
|-
| 4
| 59
| IsPoweredJoyLeft
| F2
|-
|-
| 5
| 60
| IsPoweredJoyRight
| F3
|-
|-
| 9
| 61
| IsUnsuportedButtonPressedOnNpadSystem
| F4
|-
|-
| 10
| 62
| IsUnsuportedButtonPressedOnNpadSystemExt
| F5
|-
|-
| 11
| 63
| IsAbxyButtonOriented
| F6
|-
|-
| 12
| 64
| IsSlSrButtonOriented
| F7
|-
|-
| 13
| 65
| [4.0.0+] IsPlusAvailable
| F8
|-
|-
| 14
| 66
| [4.0.0+] IsMinusAvailable
| F9
|-
|-
| 15
| 67
| [8.0.0+] IsDirectionalButtonsAvailable
| F10
|}
 
= NpadSystemButtonPropertiesSet =
This is "nn::hid::detail::NpadSystemButtonPropertiesSet". This is a BitFlagSet object for [[#NpadSystemButtonProperties]].
 
= NpadSystemButtonProperties =
This is "nn::hid::NpadSystemButtonProperties". This is a 32-bit flag.
 
{| class="wikitable" border="1"
|-
|-
! Bit
| 68
! Description
| F11
|-
|-
| 0
| 69
| IsUnintendedHomeButtonInputProtectionEnabled
| F12
|}
|-
 
| 70
= AppletFooterUiAttributesSet =
| PrintScreen
This is "nn::hid::system::AppletFooterUiAttributesSet". This is a BitFlagSet object for [[#AppletFooterUiAttribute]].
|-
 
| 71
= UniquePadType =
| ScrollLock
This is "nn::hid::system::UniquePadType".
|-
 
| 72
{| class="wikitable" border="1"
| Pause
!  Value
!  Description
|-
|-
| 0 || Embedded
| 73
| Insert
|-
|-
| 1 || FullKeyController
| 74
| Home
|-
|-
| 2 || RightController
| 75
| PageUp
|-
|-
| 3 || LeftController
| 76
| Delete
|-
|-
| 4 || DebugPadController
| 77
|}
| End
 
= UniquePadInterface =
This is "nn::hid::system::UniquePadInterface".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Embedded
| 78
| PageDown
|-
|-
| 1 || Rail
| 79
| RightArrow
|-
|-
| 2 || Bluetooth
| 80
| LeftArrow
|-
|-
| 3 || Usb
| 81
|}
| DownArrow
 
= UniquePadSerialNumber =
This is "nn::hid::system::UniquePadSerialNumber". This is a 0x10 byte value.
 
= UniquePadId =
This is "nn::hid::system::UniquePadId". This is a 8 byte value.
 
= AnalogStickManualCalibrationStage =
This is "nn::hid::system::AnalogStickManualCalibrationStage".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || ReleaseFromRight
| 82
| UpArrow
|-
|-
| 1 || ReleaseFromBottom
| 83
| NumLock
|-
|-
| 2 || ReleaseFromLeft
| 84
| NumPadDivide
|-
|-
| 3 || ReleaseFromTop
| 85
| NumPadMultiply
|-
|-
| 4 || Rotate
| 86
| NumPadSubtract
|-
|-
| 5 || Update
| 87
| NumPadAdd
|-
|-
| 6 || Completed
| 88
| NumPadEnter
|-
|-
| 7 || Clear
| 89
| NumPad1
|-
|-
| 8 || ClearCompleted
| 90
|}
| NumPad2
 
|-
= SixAxisSensorUserCalibrationStage =
| 91
This is "nn::hid::system::SixAxisSensorUserCalibrationStage".
| NumPad3
 
|-
{| class="wikitable" border="1"
| 92
!  Value
| NumPad4
!  Description
|-
| 93
| NumPad5
|-
|-
| 0 || Measuring
| 94
| NumPad6
|-
|-
| 1 || Update
| 95
| NumPad7
|-
|-
| 2 || Completed
| 96
|}
| NumPad8
 
= NpadJoyHoldType =
This is "nn::hid::NpadJoyHoldType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Vertical
| 97
| NumPad9
|-
|-
| 1 || Horizontal
| 98
|}
| NumPad0
 
= NpadJoyDeviceType =
This is "nn::hid::NpadJoyDeviceType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Left
| 99
| NumPadDot
|-
|-
| 1 || Right
| 100
|}
| Backslash
 
= NpadHandheldActivationMode =
This is "nn::hid::NpadHandheldActivationMode".
 
This controls how many joycons must be attached for handheld mode to be triggered (Dual = 2, Single = 1, None = 0).
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Dual
| 101
| Application
|-
|-
| 1 || Single
| 102
| Power
|-
|-
| 2 || None
| 103
|}
| NumPadEquals
 
= NpadJoyAssignmentMode =
This is "nn::hid::NpadJoyAssignmentMode".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Dual
| 104
| F13
|-
|-
| 1 || Single
| 105
|}
| F14
 
= NpadCommunicationMode =
This is "nn::hid::NpadCommunicationMode".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || 5ms
| 106
| F15
|-
|-
| 1 || 10ms
| 107
| F16
|-
|-
| 2 || 15ms
| 108
| F17
|-
|-
| 3 || Default
| 109
|}
| F18
 
= AppletDetailedUiType =
This is "nn::hid::system::AppletDetailedUiType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0x00000000 || None
| 110
| F19
|-
|-
| 0x01000000 || HandheldNone
| 111
| F20
|-
|-
| 0x02000000 || HandheldJoyConLeftOnly
| 112
| F21
|-
|-
| 0x02000001 || HandheldLarkHvc1Only
| 113
| F22
|-
|-
| 0x02000002 || HandheldLarkNesLeftOnly
| 114
| F23
|-
|-
| 0x03000000 || HandheldJoyConRightOnly
| 115
| F24
|-
|-
| 0x03000001 || HandheldLarkHvc2Only
| 133
| NumPadComma
|-
|-
| 0x03000002 || HandheldLarkNesRightOnly
| 135
| Ro
|-
|-
| 0x04000000 || HandheldJoyConLeftJoyConRight
| 136
| KatakanaHiragana
|-
|-
| 0x04000001 || HandheldJoyConLeftLarkHvc2
| 137
| Yen
|-
|-
| 0x04000002 || HandheldJoyConLeftLarkNesRight
| 138
| Henkan
|-
|-
| 0x04000003 || HandheldLarkHvc1JoyConRight
| 139
| Muhenkan
|-
|-
| 0x04000004 || HandheldLarkHvc1LarkHvc2
| 140
| NumPadCommaPc98
|-
|-
| 0x04000005 || HandheldLarkHvc1LarkNesRight
| 144
| HangulEnglish
|-
|-
| 0x04000006 || HandheldLarkNesLeftJoyConRight
| 145
| Hanja
|-
|-
| 0x04000007 || HandheldLarkNesLeftLarkHvc2
| 146
| Katakana
|-
|-
| 0x04000008 || HandheldLarkNesLeftLarkNesRight
| 147
| Hiragana
|-
|-
| 0x05000000 || JoyDual
| 148
| ZenkakuHankaku
|-
|-
| 0x06000000 || JoyDualLeftOnly
| 224
| LeftControl
|-
|-
| 0x07000000 || JoyDualRightOnly
| 225
| LeftShift
|-
|-
| 0x08000000 || JoyLeftHorizontal
| 226
| LeftAlt
|-
|-
| 0x09000000 || JoyLeftVertical
| 227
| LeftGui
|-
|-
| 0x0A000000 || JoyRightHorizontal
| 228
| RightControl
|-
|-
| 0x0B000000 || JoyRightVertical
| 229
| RightShift
|-
|-
| 0x0C000000 || SwitchProController
| 230
| RightAlt
|-
|-
| 0x0D000000 || CompatibleProController
| 231
| RightGui
|}
 
= KeyboardLockKeyEventSet =
This is "nn::hid::system::KeyboardLockKeyEventSet". This is a BitFlagSet object for [[#KeyboardLockKeyEvent]].
 
= KeyboardLockKeyEvent =
This is "nn::hid::system::KeyboardLockKeyEvent". This is a 32-bit flag.
 
{| class="wikitable" border="1"
|-
|-
| 0x0E000000 || CompatibleJoyCon
! Bit
! Description
|-
|-
| 0x0F000000 || LarkHvc1
| 0
| NumLockOn
|-
|-
| 0x10000000 || LarkHvc2
| 1
| NumLockOff
|-
|-
| 0x11000000 || LarkNesLeft
| 2
| NumLockToggle
|-
|-
| 0x12000000 || LarkNesRight
| 3
| CapsLockOn
|-
|-
| 0x13000000 || LuciaU
| 4
| CapsLockOff
|-
|-
| 0x13000001 || LuciaJ
| 5
| CapsLockToggle
|-
|-
| 0x13000002 || LuciaE
| 6
| ScrollLockOn
|-
|-
| 0x14000000 || Verification
| 7
| ScrollLockOff
|-
|-
| 0xFFFFFFFF || Unknown
| 8
| ScrollLockToggle
|}
|}


= AppletFooterUiType =
= BasicXpadButtonSet =
This is "nn::hid::system::AppletFooterUiType".
This is "nn::hid::BasicXpadButtonSet". This is a BitFlagSet object for [[#BasicXpadButton]].
 
= HomeButtonSet =
This is "nn::hid::system::HomeButtonSet". This is a BitFlagSet object for [[#HomeButton]].
 
= SleepButtonSet =
This is "nn::hid::system::SleepButtonSet". This is a BitFlagSet object for [[#SleepButton]].
 
= CaptureButtonSet =
This is "nn::hid::system::CaptureButtonSet". This is a BitFlagSet object for [[#CaptureButton]].
 
= NpadButtonSet =
This is "nn::hid::NpadButtonSet". This is a BitFlagSet object for [[#NpadButton]].
 
= NpadButton =
This is "nn::hid::NpadButton". This is a 64-bit flag.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || None
! Bit
! Description
|-
|-
| 1 || HandheldNone
| 0
| A
|-
|-
| 2 || HandheldJoyConLeftOnly
| 1
| B
|-
| 2
| X
|-
|-
| 3 || HandheldJoyConRightOnly
| 3
| Y
|-
|-
| 4 || HandheldJoyConLeftJoyConRight
| 4
| StickL
|-
|-
| 5 || JoyDual
| 5
| StickR
|-
|-
| 6 || JoyDualLeftOnly
| 6
| L
|-
|-
| 7 || JoyDualRightOnly
| 7
| R
|-
|-
| 8 || JoyLeftHorizontal
| 8
| ZL
|-
|-
| 9 || JoyLeftVertical
| 9
| ZR
|-
|-
| 10 || JoyRightHorizontal
| 10
| Plus
|-
|-
| 11 || JoyRightVertical
| 11
| Minus
|-
|-
| 12 || SwitchProController
| 12
| Left
|-
|-
| 13 || CompatibleProController
| 13
| Up
|-
|-
| 14 || CompatibleJoyCon
| 14
| Right
|-
|-
| 15 || LarkHvc1
| 15
| Down
|-
|-
| 16 || LarkHvc2
| 16
| StickLLeft
|-
|-
| 17 || LarkNesLeft
| 17
| StickLUp
|-
|-
| 18 || LarkNesRight
| 18
| StickLRight
|-
|-
| 19 || Lucia
| 19
| StickLDown
|-
|-
| 20 || Verification
| 20
|}
| StickRLeft
 
= NpadIdType =
This is "nn::hid::NpadIdType". This is the controller index used in [[#SharedMemoryFormat|sharedmem]].
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0x0 || No1
| 21
| StickRUp
|-
|-
| 0x1 || No2
| 22
| StickRRight
|-
|-
| 0x2 || No3
| 23
| StickRDown
|-
|-
| 0x3 || No4
| 24
| LeftSL
|-
|-
| 0x4 || No5
| 25
| LeftSR
|-
|-
| 0x5 || No6
| 26
| RightSL
|-
|-
| 0x6 || No7
| 27
| RightSR
|-
|-
| 0x7 || No8
| 28
| Palma
|-
|-
| 0x10 || Other
| 29
|  
|-
|-
| 0x20 || Handheld
| 30
| HandheldLeftB (Left B button on NES controllers in Handheld mode)
|}
|}


= NpadInterfaceType =
= AnalogStickCalibrationFlagsSet =
This is "nn::hid::NpadInterfaceType".
This is "nn::hid::detail::AnalogStickCalibrationFlagsSet". This is a BitFlagSet object for [[#AnalogStickCalibrationFlags]].
 
= SixAxisSensorUserCalibrationFlagsSet =
This is "nn::hid::detail::SixAxisSensorUserCalibrationFlagsSet". This is a BitFlagSet object for [[#SixAxisSensorUserCalibrationFlags]].
 
= NpadStyleSet =
This is "nn::hid::NpadStyleSet". This is a BitFlagSet object for [[#NpadStyleTag]].
 
= NpadStyleTag =
This is "nn::hid::NpadStyleTag".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Value
Bits
!  Description
!  Description
!  Notes
|-
|-
| 1 || Bluetooth
| 0
| NpadStyleFullKey
| Pro Controller
|-
|-
| 2 || Rail
| 1
| NpadStyleHandheld
| Joy-Con controller in handheld mode
|-
|-
| 3 || USB
| 2
| NpadStyleJoyDual
| Joy-Con controller in dual mode
|-
|-
| 4 || Unknown
| 3
|}
| NpadStyleJoyLeft
 
| Joy-Con left controller in single mode
= NpadLarkType =
This is "nn::hid::NpadLarkType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Invalid
| 4
| NpadStyleJoyRight
| Joy-Con right controller in single mode
|-
|-
| 1 || H1
| 5
| NpadStyleGc
| GameCube controller
|-
|-
| 2 || H2
| 6
| NpadStylePalma
| Poké Ball Plus controller
|-
|-
| 3 || NL
| 7
| NpadStyleLark
| NES/Famicom controller
|-
|-
| 4 || NR
| 8
|}
| NpadStyleHandheldLark
 
| NES/Famicom controller in handheld mode
= NpadLuciaType =
This is "nn::hid::NpadLuciaType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Invalid
| 9
| NpadStyleLucia
| SNES controller
|-
|-
| 1 || J
| 10-28
| Reserved
|
|-
|-
| 2 || E
| 29
| NpadStyleSystemExt
| Generic external controller
|-
| 30
| NpadStyleSystem
| Generic controller
|-
|-
| 3 || U
| 31
| Reserved
|
|}
|}


= GestureDirection =
= NpadDeviceTypeSet =
This is "nn::hid::GestureDirection".
This is "nn::hid::system::NpadDeviceType". This is a BitFlagSet object for [[#NpadDeviceType]].
 
= NpadSystemPropertiesSet =
This is "nn::hid::detail::NpadSystemPropertiesSet". This is a BitFlagSet object for [[#NpadSystemProperties]].
 
= NpadSystemProperties =
This is "nn::hid::NpadSystemProperties". This is a 64-bit flag.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || None
! Bit
! Description
|-
|-
| 1 || Left
| 0
| IsChargingJoyDual
|-
|-
| 2 || Up
| 1
| IsChargingJoyLeft
|-
|-
| 3 || Right
| 2
| IsChargingJoyRight
|-
|-
| 4 || Down
| 3
|}
| IsPoweredJoyDual
 
= GestureType =
This is "nn::hid::GestureType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Idle
| 4
| IsPoweredJoyLeft
|-
|-
| 1 || Complete
| 5
| IsPoweredJoyRight
|-
|-
| 2 || Cancel
| 9
| IsUnsuportedButtonPressedOnNpadSystem
|-
|-
| 3 || Touch
| 10
| IsUnsuportedButtonPressedOnNpadSystemExt
|-
|-
| 4 || Press
| 11
| IsAbxyButtonOriented
|-
| 12
| IsSlSrButtonOriented
|-
|-
| 5 || Tap
| 13
| [4.0.0+] IsPlusAvailable
|-
|-
| 6 || Pan
| 14
| [4.0.0+] IsMinusAvailable
|-
|-
| 7 || Swipe
| 15
| [8.0.0+] IsDirectionalButtonsAvailable
|}
 
= NpadSystemButtonPropertiesSet =
This is "nn::hid::detail::NpadSystemButtonPropertiesSet". This is a BitFlagSet object for [[#NpadSystemButtonProperties]].
 
= NpadSystemButtonProperties =
This is "nn::hid::NpadSystemButtonProperties". This is a 32-bit flag.
 
{| class="wikitable" border="1"
|-
|-
| 8 || Pinch
! Bit
! Description
|-
|-
| 9 || Rotate
| 0
| IsUnintendedHomeButtonInputProtectionEnabled
|}
|}


= DeviceHandle =
= AppletFooterUiAttributesSet =
This is "nn::xcd::DeviceHandle". This is a 8 byte value.
This is "nn::hid::system::AppletFooterUiAttributesSet". This is a BitFlagSet object for [[#AppletFooterUiAttribute]].


= DeviceType =
= UniquePadType =
This is "nn::hid::system::DeviceType".
This is "nn::hid::system::UniquePadType".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Bits
Value
!  Description
!  Description
|-
|-
| 0
| 0 || Embedded
| FullKey
|-
|-
| 1
| 1 || FullKeyController
| DebugPad
|-
|-
| 2
| 2 || RightController
| HandheldLeft
|-
|-
| 3
| 3 || LeftController
| HandheldRight
|-
|-
| 4
| 4 || DebugPadController
| JoyLeft
|}
|-
 
| 5
= UniquePadInterface =
| JoyRight
This is "nn::hid::system::UniquePadInterface".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
| 0 || Embedded
|-
|-
| 6
| 1 || Rail
| Palma
|-
|-
| 7
| 2 || Bluetooth
| LarkHvcLeft
|-
|-
| 8
| 3 || Usb
| LarkHvcRight
|}
 
= UniquePadSerialNumber =
This is "nn::hid::system::UniquePadSerialNumber". This is a 0x10 byte value.
 
= UniquePadId =
This is "nn::hid::system::UniquePadId". This is a 8 byte value.
 
= AnalogStickManualCalibrationStage =
This is "nn::hid::system::AnalogStickManualCalibrationStage".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 9
| 0 || ReleaseFromRight
| LarkNesLeft
|-
|-
| 10
| 1 || ReleaseFromBottom
| LarkNesRight
|-
|-
| 11
| 2 || ReleaseFromLeft
| HandheldLarkHvcLeft
|-
|-
| 12
| 3 || ReleaseFromTop
| HandheldLarkHvcRight
|-
|-
| 13
| 4 || Rotate
| HandheldLarkNesLeft
|-
|-
| 14
| 5 || Update
| HandheldLarkNesRight
|-
|-
| 15
| 6 || Completed
| Lucia
|-
|-
| 16-30
| 7 || Clear
| Reserved
|-
|-
| 31
| 8 || ClearCompleted
| System
|}
|}


= DeviceTypeInternal =
= SixAxisSensorUserCalibrationStage =
This is "nn::hid::detail::DeviceTypeInternal".
This is "nn::hid::system::SixAxisSensorUserCalibrationStage".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Bits
Value
!  Description
!  Description
|-
|-
| 0-7
| 0 || Measuring
| BIT(N*4+0) = Pro Controller, BIT(N*4+1) = Joy-Con Left, BIT(N*4+2) = Joy-Con Right, BIT(N*4+3) = invalid. Where N is 0-1.
|-
|-
| 8-10
| 1 || Update
| Pro Controller
|-
|-
| 11
| 2 || Completed
| Famicom left controller
|}
 
= NpadJoyHoldType =
This is "nn::hid::NpadJoyHoldType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 12
| 0 || Vertical
| Famicom right controller (with microphone)
|-
|-
| 13
| 1 || Horizontal
| NES left controller
|-
| 14
| NES right controller
|-
| 15-16
| Invalid
|-
| 17
| Generic external controller
|-
| 18-20
| Invalid
|-
| 21-23
| Generic controller
|}
|}


[9.0.0+] This is "nn::hidtypes::DeviceType".
= NpadJoyDeviceType =
This is "nn::hid::NpadJoyDeviceType".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Value
!  [[#DeviceType|DeviceType]]
!  [[#UniquePadType|UniquePadType]]
!  Description
!  Description
|-
|-
| 1 || JoyRight, HandheldRight || JoyRight || Joy-Con right controller
| 0 || Left
|-
|-
| 2 || JoyLeft, HandheldLeft || JoyLeft || Joy-Con left controller
| 1 || Right
|-
|}
| 3 || FullKey || FullKey || Pro Controller
 
= NpadHandheldActivationMode =
This is "nn::hid::NpadHandheldActivationMode".
 
This controls how many joycons must be attached for handheld mode to be triggered (Dual = 2, Single = 1, None = 0).
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 4 || JoyLeft || JoyLeft || Reserved
| 0 || Dual
|-
|-
| 5 || JoyRight || JoyRight || Reserved
| 1 || Single
|-
|-
| 6 || FullKey || FullKey || Reserved
| 2 || None
|}
 
= NpadJoyAssignmentMode =
This is "nn::hid::NpadJoyAssignmentMode".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 7 || LarkHvcLeft, HandheldLarkHvcLeft || JoyLeft || Famicom left controller
| 0 || Dual
|-
|-
| 8 || LarkHvcRight, HandheldLarkHvcRight || JoyRight || Famicom right controller (with microphone)
| 1 || Single
|}
 
= NpadCommunicationMode =
This is "nn::hid::NpadCommunicationMode".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 9 || LarkNesLeft, HandheldLarkNesLeft || JoyLeft || NES left controller
| 0 || 5ms
|-
|-
| 10 || LarkNesRight, HandheldLarkNesRight || JoyRight || NES right controller
| 1 || 10ms
|-
|-
| 11 || Lucia || FullKey || SNES controller
| 2 || 15ms
|-
|-
| 12 || Palma || Other || Poké Ball Plus controller
| 3 || Default
|}
 
= AppletDetailedUiType =
This is "nn::hid::system::AppletDetailedUiType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 13 || FullKey || FullKey || Gc controller
| 0x00000000 || None
|-
|-
| 14 || HandheldLeft || JoyLeft || Reserved
| 0x01000000 || HandheldNone
|-
|-
| 15 || FullKey || FullKey || Reserved
| 0x02000000 || HandheldJoyConLeftOnly
|-
|-
| 16 || FullKey || FullKey || Reserved
| 0x02000001 || HandheldLarkHvc1Only
|-
|-
| 17 || DebugPad || DebugPad || Debug controller
| 0x02000002 || HandheldLarkNesLeftOnly
|-
| 0x03000000 || HandheldJoyConRightOnly
|-
|-
| 18 || HandheldRight || JoyRight || Reserved
| 0x03000001 || HandheldLarkHvc2Only
|-
|-
| 19 || System || Other || Unknown (has [[#NpadStyleTag|NpadFullKey]] style tag)
| 0x03000002 || HandheldLarkNesRightOnly
|-
|-
| 20 || System || Other || Unknown (has [[#NpadStyleTag|NpadJoyDual]] style tag)
| 0x04000000 || HandheldJoyConLeftJoyConRight
|-
|-
| 21 || System || Other || Unknown (has [[#NpadStyleTag|NpadJoyDual]] style tag)
| 0x04000001 || HandheldJoyConLeftLarkHvc2
|}
 
= NpadPowerInfo =
This is "nn::hid::system::NpadPowerInfo".
 
{| class="wikitable" border="1"
|-
|-
! Offset
| 0x04000002 || HandheldJoyConLeftLarkNesRight
! Size
! Description
|-
|-
| 0x0
| 0x04000003 || HandheldLarkHvc1JoyConRight
| 0x1
| IsPowered
|-
|-
| 0x1
| 0x04000004 || HandheldLarkHvc1LarkHvc2
| 0x1
| IsCharging
|-
|-
| 0x2
| 0x04000005 || HandheldLarkHvc1LarkNesRight
| 0x6
| Reserved
|-
|-
| 0x8
| 0x04000006 || HandheldLarkNesLeftJoyConRight
| 0x6
| [[#BatteryLevel|BatteryLevel]]
|}
 
= BatteryLevel =
This is "nn::hid::system::NpadBatteryLevel". This is a 4 byte value.
 
= ConsoleSixAxisSensorHandle =
This is "nn::hid::ConsoleSixAxisSensorHandle". This is a 4-byte struct with 4-byte alignment.
 
sdknso GetConsoleSixAxisSensorHandle always returns a handle with value 0x13.
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 0x04000007 || HandheldLarkNesLeftLarkHvc2
|-
|-
| 0x0 || 0x4 || TypeValue
| 0x04000008 || HandheldLarkNesLeftLarkNesRight
|-
|-
| 0x0 || 0x1 ||  
| 0x05000000 || JoyDual
|-
|-
| 0x1 || 0x1 ||  
| 0x06000000 || JoyDualLeftOnly
|}
|-
 
| 0x07000000 || JoyDualRightOnly
= SixAxisSensorHandle =
|-
This is "nn::hid::SixAxisSensorHandle". This is a 4-byte struct with 4-byte alignment.
| 0x08000000 || JoyLeftHorizontal
 
|-
{| class="wikitable" border="1"
| 0x09000000 || JoyLeftVertical
|-
| 0x0A000000 || JoyRightHorizontal
|-
|-
! Offset || Size || Description
| 0x0B000000 || JoyRightVertical
|-
|-
| 0x0 || 0x4 || TypeValue
| 0x0C000000 || SwitchProController
|-
|-
| 0x0 || 0x1 || NpadStyleIndex
| 0x0D000000 || CompatibleProController
|-
|-
| 0x1 || 0x1 || [[#NpadIdType|PlayerNumber]]
| 0x0E000000 || CompatibleJoyCon
|-
|-
| 0x2 || 0x1 || DeviceIdx
| 0x0F000000 || LarkHvc1
|}
 
= VibrationDeviceHandle =
This is "nn::hid::VibrationDeviceHandle". This is a 4-byte struct with 4-byte alignment.
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 0x10000000 || LarkHvc2
|-
|-
| 0x0 || 0x4 || TypeValue
| 0x11000000 || LarkNesLeft
|-
|-
| 0x0 || 0x1 || NpadStyleIndex
| 0x12000000 || LarkNesRight
|-
|-
| 0x1 || 0x1 || [[#NpadIdType|PlayerNumber]]
| 0x13000000 || LuciaU
|-
|-
| 0x2 || 0x1 || DeviceIdx
| 0x13000001 || LuciaJ
|}
 
= VibrationDeviceInfo =
This is "nn::hid::VibrationDeviceInfo" / "nn::hid::VibrationDeviceInfoForIpc". This is a 0x8-byte struct.
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 0x13000002 || LuciaE
|-
|-
| 0x0 || 0x4 || [[#VibrationDeviceType|DeviceType]]
| 0x14000000 || Verification
|-
|-
| 0x4 || 0x4 || [[#VibrationDevicePosition|Position]]
| 0xFFFFFFFF || Unknown
|}
|}


= VibrationDeviceType =
= AppletFooterUiType =
This is "nn::hid::VibrationDeviceType".
This is "nn::hid::system::AppletFooterUiType".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 6,882: Line 7,049:
!  Description
!  Description
|-
|-
| 0 || Unknown
| 0 || None
|-
|-
| 1 || LinearResonantActuator
| 1 || HandheldNone
|-
|-
| 2 || GcErm
| 2 || HandheldJoyConLeftOnly
|}
 
= VibrationDevicePosition =
This is "nn::hid::VibrationDevicePosition".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || None
| 3 || HandheldJoyConRightOnly
|-
|-
| 1 || Left
| 4 || HandheldJoyConLeftJoyConRight
|-
|-
| 2 || Right
| 5 || JoyDual
|}
 
= VibrationValue =
This is "nn::hid::VibrationValue". This is a 0x10-byte struct, which contains 4 float values.
 
{| class="wikitable" border="1"
|-
|-
! Offset
| 6 || JoyDualLeftOnly
! Size
! Description
|-
|-
| 0x0
| 7 || JoyDualRightOnly
| 0x4
| AmplitudeLow
|-
|-
| 0x4
| 8 || JoyLeftHorizontal
| 0x4
| FrequencyLow
|-
|-
| 0x8
| 9 || JoyLeftVertical
| 0x4
| AmplitudeHigh
|-
|-
| 0xC
| 10 || JoyRightHorizontal
| 0x4
| FrequencyHigh
|}
 
= VibrationGcErmCommand =
This is "nn::hid::VibrationGcErmCommand".
 
{| class="wikitable" border="1"
!  Value
!  Name
!  Description
|-
|-
| 0 || Stop || Stops the vibration with a decay phase.
| 11 || JoyRightVertical
|-
|-
| 1 || Start || Starts the vibration.
| 12 || SwitchProController
|-
|-
| 2 || StopHard || Stops the vibration immediately, with no decay phase.
| 13 || CompatibleProController
|-
| 14 || CompatibleJoyCon
|-
| 15 || LarkHvc1
|-
| 16 || LarkHvc2
|-
| 17 || LarkNesLeft
|-
| 18 || LarkNesRight
|-
| 19 || Lucia
|-
| 20 || Verification
|}
|}


= AccelerometerPlayMode =
= NpadIdType =
This is "nn::hid::debug::AccelerometerPlayMode" (pre-10.0.0 this is "nn::hid::AccelerometerPlayMode").
This is "nn::hid::NpadIdType". This is the controller index used in [[#SharedMemoryFormat|sharedmem]].


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 6,951: Line 7,099:
!  Description
!  Description
|-
|-
| 0 || Loose
| 0x0 || No1
|-
| 0x1 || No2
|-
| 0x2 || No3
|-
| 0x3 || No4
|-
| 0x4 || No5
|-
| 0x5 || No6
|-
| 0x6 || No7
|-
| 0x7 || No8
|-
| 0x10 || Other
|-
|-
| 1 || Tight
| 0x20 || Handheld
|}
|}


= GyroscopeZeroDriftMode =
= NpadInterfaceType =
This is "nn::hid::GyroscopeZeroDriftMode".
This is "nn::hid::NpadInterfaceType".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 6,963: Line 7,127:
!  Description
!  Description
|-
|-
| 0 || Loose
| 1 || Bluetooth
|-
| 2 || Rail
|-
|-
| 1 || Standard
| 3 || USB
|-
|-
| 2 || Tight
| 4 || Unknown
|}
|}


= PalmaConnectionHandle =
= NpadLarkType =
This is "nn::hid::PalmaConnectionHandle". This is a 0x8-byte struct with 8-byte alignment.
This is "nn::hid::NpadLarkType".
 
= PalmaOperationInfo =
This is "nn::hid::PalmaOperationInfo". This is a 0x148-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Description
|-
| 0 || Invalid
|-
|-
! Offset || Size || Description
| 1 || H1
|-
|-
| 0x0 || 0x4 || [[#PalmaOperationType]]
| 2 || H2
|-
|-
| 0x4 || 0x4 || Result
| 3 || NL
|-
|-
| 0x8 || 0x140 || Buffer for [[#GetPalmaOperationInfo]].
| 4 || NR
|}
|}


= PalmaOperationType =
= NpadLuciaType =
This is "nn::hid::PalmaOperationType".
This is "nn::hid::NpadLuciaType".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 6,994: Line 7,161:
!  Description
!  Description
|-
|-
| 0 || PlayActivity
| 0 || Invalid
|-
|-
| 1 || SetFrModeType
| 1 || J
|-
|-
| 2 || ReadStep
| 2 || E
|-
|-
| 3 || EnableStep
| 3 || U
|}
 
= GestureDirection =
This is "nn::hid::GestureDirection".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 4 || ResetStep
| 0 || None
|-
|-
| 5 || ReadApplicationSection
| 1 || Left
|-
|-
| 6 || WriteApplicationSection
| 2 || Up
|-
|-
| 7 || ReadUniqueCode
| 3 || Right
|-
|-
| 8 || SetUniqueCodeInvalid
| 4 || Down
|}
 
= GestureType =
This is "nn::hid::GestureType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 9 || WriteActivityEntry
| 0 || Idle
|-
|-
| 10 || WriteRgbLedPatternEntry
| 1 || Complete
|-
|-
| 11 || WriteWaveEntry
| 2 || Cancel
|-
|-
| 12 || ReadDataBaseIdentificationVersion
| 3 || Touch
|-
|-
| 13 || WriteDataBaseIdentificationVersion
| 4 || Press
|-
| 5 || Tap
|-
| 6 || Pan
|-
|-
| 14 || SuspendFeature
| 7 || Swipe
|-
|-
| [[5.1.0]]+ 15 || ReadPlayLog
| 8 || Pinch
|-
|-
| [[5.1.0]]+ 16 || ResetPlayLog
| 9 || Rotate
|}
|}


= PalmaFrModeType =
= DeviceHandle =
This is "nn::hid::PalmaFrModeType".
This is "nn::xcd::DeviceHandle". This is a 8 byte value.
 
= DeviceType =
This is "nn::hid::system::DeviceType".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Value
Bits
!  Description
!  Description
|-
|-
| 0 || Off
| 0
| FullKey
|-
|-
| 1 || B01
| 1
| DebugPad
|-
|-
| 2 || B02
| 2
| HandheldLeft
|-
|-
| 3 || B03
| 3
| HandheldRight
|-
|-
| 4 || Downloaded
| 4
|}
| JoyLeft
 
= PalmaApplicationSectionAccessBuffer =
This is "nn::hid::PalmaApplicationSectionAccessBuffer". This is a 0x100-byte struct.
 
= PalmaActivityEntry =
This is "nn::hid::PalmaActivityEntry".
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 5
| JoyRight
|-
|-
| 0x0 || 0x2 || RgbLedPatternIndex.
| 6
| Palma
|-
|-
| 0x2 || 0x2 || Padding
| 7
| LarkHvcLeft
|-
|-
| 0x4 || 0x4 || [[#PalmaWaveSet|WaveSet]].
| 8
| LarkHvcRight
|-
|-
| 0x8 || 0x2 || WaveIndex.
| 9
|}
| LarkNesLeft
 
= PalmaWaveSet =
This is "nn::hid::PalmaWaveSet".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Small
| 10
| LarkNesRight
|-
|-
| 1 || Medium
| 11
| HandheldLarkHvcLeft
|-
|-
| 2 || Large
| 12
|}
| HandheldLarkHvcRight
 
= PalmaFeature =
This is "nn::hid::PalmaFeature".
 
{| class="wikitable" border="1"
|-
|-
! Bit
| 13
! Description
| HandheldLarkNesLeft
|-
|-
| 0
| 14
| FrMode
| HandheldLarkNesRight
|-
|-
| 1
| 15
| RumbleFeedback
| Lucia
|-
|-
| 2
| 16-30
| Step
| Reserved
|-
| 3
| MuteSwitch
|-
|-
| 31
| System
|}
|}


= AbstractedPadState =
= DeviceTypeInternal =
This is "nn::hid::detail::DeviceTypeInternal".
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Bits
!  Description
|-
|-
! Offset || Size || Description
| 0-7
| BIT(N*4+0) = Pro Controller, BIT(N*4+1) = Joy-Con Left, BIT(N*4+2) = Joy-Con Right, BIT(N*4+3) = invalid. Where N is 0-1.
|-
|-
| 0x0 || 0x4 || Type, only 1 bit can be set. Converted to [[#HdlsDeviceInfo]]::type internally by [[#SetAutoPilotVirtualPadState]].
| 8-10
| Pro Controller
|-
|-
| 0x4 || 0x1 || Flags. [[#SetAutoPilotVirtualPadState]] only uses bit0: when clear it will skip using the rest of the input and run [[#UnsetAutoPilotVirtualPadState]] internally.
| 11
| Famicom left controller
|-
|-
| 0x5 || 0x3 || Padding
| 12
| Famicom right controller (with microphone)
|-
|-
| 0x8 || 0x4 || RGBA Single Body Color
| 13
| NES left controller
|-
|-
| 0xC || 0x4 || RGBA Single Buttons Color
| 14
| NES right controller
|-
|-
| 0x10 || 0x1 || See [[#HiddbgHdlsDeviceInfo]]::[[#NpadInterfaceType]].
| 15-16
| Invalid
|-
|-
| 0x11 || 0x3 || Padding
| 17
| Generic external controller
|-
|-
| 0x14 || 0x24 || [[#HdlsState]]. Unknown if the last 4-bytes are included in this struct, [[#SetAutoPilotVirtualPadState]]/[[#hiddbgGetAbstractedPadsState]] only uses the first 0x20-bytes.
| 18-20
| Invalid
|-
|-
| 0x38 || 0x60 || Unused with [[#SetAutoPilotVirtualPadState]]/[[#GetAbstractedPadsState]].
| 21-23
| Generic controller
|}
|}


Normally the input state is merged with an existing controller selected by Type. However in some cases (BIT(2-5) with type2!=0x2 and BIT(31)) it's detected as a dedicated controller.
[9.0.0+] This is "nn::hidtypes::DeviceType".


Type:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Bits
Value
!  [[#HdlsDeviceInfo]]::type bits
!  [[#DeviceType|DeviceType]]
!  [[#UniquePadType|UniquePadType]]
!  Description
!  Description
!  Notes
|-
|-
| 0 || 0 || ||  
| 1 || JoyRight, HandheldRight || JoyRight || Joy-Con right controller
|-
|-
| 1 || 15 || || [[#DeviceType]] |= BIT(1)
| 2 || JoyLeft, HandheldLeft || JoyLeft || Joy-Con left controller
|-
|-
| 2 || 1 || ||  
| 3 || FullKey || FullKey || Pro Controller
|-
|-
| 3 || 2 || ||  
| 4 || JoyLeft || JoyLeft || Reserved
|-
|-
| 4 || 1 || ||  
| 5 || JoyRight || JoyRight || Reserved
|-
|-
| 5 || 2 || ||  
| 6 || FullKey || FullKey || Reserved
|-
|-
| 6 || 3 || ||  
| 7 || LarkHvcLeft, HandheldLarkHvcLeft || JoyLeft || Famicom left controller
|-
|-
| 7 || 11 || || [[#DeviceType]] |= BIT(11)
| 8 || LarkHvcRight, HandheldLarkHvcRight || JoyRight || Famicom right controller (with microphone)
|-
|-
| 8 || 12 || || [[#DeviceType]] |= BIT(12)
| 9 || LarkNesLeft, HandheldLarkNesLeft || JoyLeft || NES left controller
|-
|-
| 9 || 13 || || [[#DeviceType]] |= BIT(13)
| 10 || LarkNesRight, HandheldLarkNesRight || JoyRight || NES right controller
|-
|-
| 10 || 14 || || [[#DeviceType]] |= BIT(14)
| 11 || Lucia || FullKey || SNES controller
|-
|-
| 11 || 15 || || [[#DeviceType]] |= BIT(11)
| 12 || Palma || Other || Poké Ball Plus controller
|-
|-
| 12 || 12 || || [[#DeviceType]] |= BIT(12)
| 13 || FullKey || FullKey || Gc controller
|-
|-
| 13 || 13 || || [[#DeviceType]] |= BIT(13)
| 14 || HandheldLeft || JoyLeft || Reserved
|-
| 15 || FullKey || FullKey || Reserved
|-
| 16 || FullKey || FullKey || Reserved
|-
| 17 || DebugPad || DebugPad || Debug controller
|-
|-
| 14 || 14 || || [[#DeviceType]] |= BIT(14)
| 18 || HandheldRight || JoyRight || Reserved
|-
|-
| 15 || 17 || ||  
| 19 || System || Other || Unknown (has [[#NpadStyleTag|NpadFullKey]] style tag)
|-
|-
| 31 || 21 || || [[#DeviceType]] = BIT(31)
| 20 || System || Other || Unknown (has [[#NpadStyleTag|NpadJoyDual]] style tag)
|-
|-
| 21 || System || Other || Unknown (has [[#NpadStyleTag|NpadJoyDual]] style tag)
|}
|}


The above "[[#DeviceType]] |=" notes only apply when type2 is 0x2.
= NpadPowerInfo =
 
This is "nn::hid::system::NpadPowerInfo".
= DebugPadAutoPilotState =
This is "nn::hid::debug::DebugPadAutoPilotState"


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 7,183: Line 7,380:
|-
|-
| 0x0
| 0x0
| 0x4
| 0x1
| [[#DebugPadAttributeSet|Attributes]]
| IsPowered
|-
|-
| 0x4
| 0x1
| 0x4
| 0x1
| [[#DebugPadButtonSet|Buttons]]
| IsCharging
|-
|-
| 0x8
| 0x2
| 0x8
| 0x6
| [[#AnalogStickState|AnalogStickL]]
| Reserved
|-
|-
| 0x10
| 0x8
| 0x8
| [[#AnalogStickState|AnalogStickR]]
| 0x6
| [[#BatteryLevel|BatteryLevel]]
|}
|}


= MouseAutoPilotState =
= BatteryLevel =
This is "nn::hid::debug::MouseAutoPilotState".
This is "nn::hid::system::NpadBatteryLevel". This is a 4 byte value.
 
= ConsoleSixAxisSensorHandle =
This is "nn::hid::ConsoleSixAxisSensorHandle". This is a 4-byte struct with 4-byte alignment.
 
sdknso GetConsoleSixAxisSensorHandle always returns a handle with value 0x13.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset || Size || Description
! Size
! Description
|-
|-
| 0x0
| 0x0 || 0x4 || TypeValue
| 0x4
| X
|-
|-
| 0x4
| 0x0 || 0x1 ||  
| 0x4
| Y
|-
|-
| 0x8
| 0x1 || 0x1 ||  
| 0x4
| DeltaX
|-
| 0xC
| 0x4
| DeltaY
|-
| 0x10
| 0x4
| WheelDelta
|-
| 0x14
| 0x4
| [[#MouseButtonSet|Buttons]]
|-
| 0x18
| 0x4
| [[#MouseAttributeSet|Attributes]]
|}
|}


= KeyboardAutoPilotState =
= SixAxisSensorHandle =
This is "nn::hid::debug::KeyboardAutoPilotState".
This is "nn::hid::SixAxisSensorHandle". This is a 4-byte struct with 4-byte alignment.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset || Size || Description
! Size
|-
! Description
| 0x0 || 0x4 || TypeValue
|-
| 0x0 || 0x1 || NpadStyleIndex
|-
|-
| 0x0
| 0x1 || 0x1 || [[#NpadIdType|PlayerNumber]]
| 0x8
| [[#KeyboardModifierSet|Modifiers]]
|-
|-
| 0x8
| 0x2 || 0x1 || DeviceIdx
| 0x20
| [[#KeyboardKeySet|Keys]]
|}
|}


= HdlsHandle =
= VibrationDeviceHandle =
This is "nn::hid::debug::HdlsHandle". This is a 0x8-byte struct with 8-byte alignment.
This is "nn::hid::VibrationDeviceHandle". This is a 4-byte struct with 4-byte alignment.
 
= HdlsNpadAssignment =
This is a 0x208-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 7,265: Line 7,438:
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x4 || s32 Total entries
| 0x0 || 0x4 || TypeValue
|-
| 0x0 || 0x1 || NpadStyleIndex
|-
|-
| 0x4 || 0x4 || Padding
| 0x1 || 0x1 || [[#NpadIdType|PlayerNumber]]
|-
|-
| 0x8 || 0x200(0x20*0x10) || Array of [[#HdlsNpadAssignmentEntry]].
| 0x2 || 0x1 || DeviceIdx
|}
|}
 
 
= HdlsNpadAssignmentEntry =
= VibrationDeviceInfo =
This is a 0x20-byte struct.
This is "nn::hid::VibrationDeviceInfo" / "nn::hid::VibrationDeviceInfoForIpc". This is a 0x8-byte struct.
 
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x8 || [[#HdlsHandle]]
| 0x0 || 0x4 || [[#VibrationDeviceType|DeviceType]]
|-
|-
| 0x8 || 0x4 || ?
| 0x4 || 0x4 || [[#VibrationDevicePosition|Position]]
|-
|}
| 0xC || 0x4 || ?
 
|-
= VibrationDeviceType =
| 0x10 || 0x8 || ?
This is "nn::hid::VibrationDeviceType".
|-
 
| 0x18 || 0x1 || ?
{| class="wikitable" border="1"
|-
!  Value
| 0x19 || 0x7 || Padding
!  Description
|}
|-
 
| 0 || Unknown
= HdlsStateList =
|-
This is a 0x408-byte struct.
| 1 || LinearResonantActuator
 
|-
[9.0.0+] This is a 0x488-byte struct.
| 2 || GcErm
 
|}
{| class="wikitable" border="1"
 
|-
= VibrationDevicePosition =
! Offset || Size || Description
This is "nn::hid::VibrationDevicePosition".
|-
 
| 0x0 || 0x4 || s32 Total entries
{| class="wikitable" border="1"
|-
!  Value
| 0x4 || 0x4 || Padding
!  Description
|-
|-
| 0x8 || <[[#HdlsStateListEntry]] size>*0x10 || Array of [[#HdlsStateListEntry]].
| 0 || None
|}
|-
 
| 1 || Left
This contains a list of all controllers, including non-virtual controllers.
|-
 
| 2 || Right
= HdlsStateListEntry =
|}
This is a 0x40-byte struct.  
 
 
= VibrationValue =
[9.0.0+] This is a 0x48-byte struct.
This is "nn::hid::VibrationValue". This is a 0x10-byte struct, which contains 4 float values.
 
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset
|-
! Size
| 0x0 || 0x8 || [[#HdlsHandle]]
! Description
|-
|-
| 0x8 || [[#HdlsDeviceInfo]] size || [[#HdlsDeviceInfo]]. With [[#ApplyHdlsStateList]] this is only used when creating new devices.
| 0x0
|-
| 0x4
| 0x8 + [[#HdlsDeviceInfo]] size, with 8-byte alignment || 0x24 || [[#HdlsState]]
| AmplitudeLow
|-
|-
| <Immediately following the above> || 0x4 || Padding
| 0x4
|}
| 0x4
 
| FrequencyLow
= HdlsDeviceInfo =
|-
This is a 0x10-byte struct.
| 0x8
 
| 0x4
{| class="wikitable" border="1"
| AmplitudeHigh
|-
|-
! Offset || Size || Description
| 0xC
|-
| 0x4
| 0x0 || 0x4 || [[#DeviceTypeInternal]]
| FrequencyHigh
|-
|}
| 0x4 || 0x4 || RGBA Single Body Color
 
|-
= VibrationGcErmCommand =
| 0x8 || 0x4 || RGBA Single Buttons Color
This is "nn::hid::VibrationGcErmCommand".
|-
 
| 0xC || 0x1 || [[#NpadInterfaceType]]. Additional type field used with the above type field, if the value doesn't match one of the following a default is used. Type Pro-Controller: value 0x3 indicates that the controller is connected via USB. Type bit21: value 0x3 = unknown. When value is 0x2, state is merged with an existing controller (when the type value is compatible with this). Otherwise, it's a dedicated controller.
{| class="wikitable" border="1"
|-
!  Value
| 0xD || 0x3 || Padding
!  Name
|}
!  Description
 
|-
| 0 || Stop || Stops the vibration with a decay phase.
|-
| 1 || Start || Starts the vibration.
|-
| 2 || StopHard || Stops the vibration immediately, with no decay phase.
|}
 
= AccelerometerPlayMode =
This is "nn::hid::debug::AccelerometerPlayMode" (pre-10.0.0 this is "nn::hid::AccelerometerPlayMode").
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
| 0 || Loose
|-
| 1 || Tight
|}
 
= GyroscopeZeroDriftMode =
This is "nn::hid::GyroscopeZeroDriftMode".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
| 0 || Loose
|-
| 1 || Standard
|-
| 2 || Tight
|}
 
= PalmaConnectionHandle =
This is "nn::hid::PalmaConnectionHandle". This is a 0x8-byte struct with 8-byte alignment.
 
= PalmaOperationInfo =
This is "nn::hid::PalmaOperationInfo". This is a 0x148-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || [[#PalmaOperationType]]
|-
| 0x4 || 0x4 || Result
|-
| 0x8 || 0x140 || Buffer for [[#GetPalmaOperationInfo]].
|}
 
= PalmaOperationType =
This is "nn::hid::PalmaOperationType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
| 0 || PlayActivity
|-
| 1 || SetFrModeType
|-
| 2 || ReadStep
|-
| 3 || EnableStep
|-
| 4 || ResetStep
|-
| 5 || ReadApplicationSection
|-
| 6 || WriteApplicationSection
|-
| 7 || ReadUniqueCode
|-
| 8 || SetUniqueCodeInvalid
|-
| 9 || WriteActivityEntry
|-
| 10 || WriteRgbLedPatternEntry
|-
| 11 || WriteWaveEntry
|-
| 12 || ReadDataBaseIdentificationVersion
|-
| 13 || WriteDataBaseIdentificationVersion
|-
| 14 || SuspendFeature
|-
| [[5.1.0]]+ 15 || ReadPlayLog
|-
| [[5.1.0]]+ 16 || ResetPlayLog
|}
 
= PalmaFrModeType =
This is "nn::hid::PalmaFrModeType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
| 0 || Off
|-
| 1 || B01
|-
| 2 || B02
|-
| 3 || B03
|-
| 4 || Downloaded
|}
 
= PalmaApplicationSectionAccessBuffer =
This is "nn::hid::PalmaApplicationSectionAccessBuffer". This is a 0x100-byte struct.
 
= PalmaActivityEntry =
This is "nn::hid::PalmaActivityEntry".
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x2 || RgbLedPatternIndex.
|-
| 0x2 || 0x2 || Padding
|-
| 0x4 || 0x4 || [[#PalmaWaveSet|WaveSet]].
|-
| 0x8 || 0x2 || WaveIndex.
|}
 
= PalmaWaveSet =
This is "nn::hid::PalmaWaveSet".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
| 0 || Small
|-
| 1 || Medium
|-
| 2 || Large
|}
 
= PalmaFeature =
This is "nn::hid::PalmaFeature".
 
{| class="wikitable" border="1"
|-
! Bit
! Description
|-
| 0
| FrMode
|-
| 1
| RumbleFeedback
|-
| 2
| Step
|-
| 3
| MuteSwitch
|-
|}
 
= AbstractedPadState =
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || Type, only 1 bit can be set. Converted to [[#HdlsDeviceInfo]]::type internally by [[#SetAutoPilotVirtualPadState]].
|-
| 0x4 || 0x1 || Flags. [[#SetAutoPilotVirtualPadState]] only uses bit0: when clear it will skip using the rest of the input and run [[#UnsetAutoPilotVirtualPadState]] internally.
|-
| 0x5 || 0x3 || Padding
|-
| 0x8 || 0x4 || RGBA Single Body Color
|-
| 0xC || 0x4 || RGBA Single Buttons Color
|-
| 0x10 || 0x1 || See [[#HiddbgHdlsDeviceInfo]]::[[#NpadInterfaceType]].
|-
| 0x11 || 0x3 || Padding
|-
| 0x14 || 0x24 || [[#HdlsState]]. Unknown if the last 4-bytes are included in this struct, [[#SetAutoPilotVirtualPadState]]/[[#hiddbgGetAbstractedPadsState]] only uses the first 0x20-bytes.
|-
| 0x38 || 0x60 || Unused with [[#SetAutoPilotVirtualPadState]]/[[#GetAbstractedPadsState]].
|}
 
Normally the input state is merged with an existing controller selected by Type. However in some cases (BIT(2-5) with type2!=0x2 and BIT(31)) it's detected as a dedicated controller.
 
Type:
{| class="wikitable" border="1"
!  Bits
!  [[#HdlsDeviceInfo]]::type bits
!  Description
!  Notes
|-
| 0 || 0 || ||
|-
| 1 || 15 || || [[#DeviceType]] |= BIT(1)
|-
| 2 || 1 || ||
|-
| 3 || 2 || ||
|-
| 4 || 1 || ||
|-
| 5 || 2 || ||
|-
| 6 || 3 || ||
|-
| 7 || 11 || || [[#DeviceType]] |= BIT(11)
|-
| 8 || 12 || || [[#DeviceType]] |= BIT(12)
|-
| 9 || 13 || || [[#DeviceType]] |= BIT(13)
|-
| 10 || 14 || || [[#DeviceType]] |= BIT(14)
|-
| 11 || 15 || || [[#DeviceType]] |= BIT(11)
|-
| 12 || 12 || || [[#DeviceType]] |= BIT(12)
|-
| 13 || 13 || || [[#DeviceType]] |= BIT(13)
|-
| 14 || 14 || || [[#DeviceType]] |= BIT(14)
|-
| 15 || 17 || ||
|-
| 31 || 21 || || [[#DeviceType]] = BIT(31)
|-
|}
 
The above "[[#DeviceType]] |=" notes only apply when type2 is 0x2.
 
= DebugPadAutoPilotState =
This is "nn::hid::debug::DebugPadAutoPilotState"
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| [[#DebugPadAttributeSet|Attributes]]
|-
| 0x4
| 0x4
| [[#DebugPadButtonSet|Buttons]]
|-
| 0x8
| 0x8
| [[#AnalogStickState|AnalogStickL]]
|-
| 0x10
| 0x8
| [[#AnalogStickState|AnalogStickR]]
|}
 
= MouseAutoPilotState =
This is "nn::hid::debug::MouseAutoPilotState".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x4
| X
|-
| 0x4
| 0x4
| Y
|-
| 0x8
| 0x4
| DeltaX
|-
| 0xC
| 0x4
| DeltaY
|-
| 0x10
| 0x4
| WheelDelta
|-
| 0x14
| 0x4
| [[#MouseButtonSet|Buttons]]
|-
| 0x18
| 0x4
| [[#MouseAttributeSet|Attributes]]
|}
 
= KeyboardAutoPilotState =
This is "nn::hid::debug::KeyboardAutoPilotState".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8
| [[#KeyboardModifierSet|Modifiers]]
|-
| 0x8
| 0x20
| [[#KeyboardKeySet|Keys]]
|}
 
= SleepButtonAutoPilotState =
This is "nn::hid::debug::SleepButtonAutoPilotState". This is a 0x8-byte struct with 8-byte alignment.
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x8 || Buttons (only bit0 is used)
|}
 
= PowerInfo =
This is "nn::hidtypes::PowerInfo".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x4 || BatteryLevel
|-
| 0x4 || 0x4 || [[#PowerAttribute]]
|}
 
= PowerAttribute =
This is "nn::hidtypes::PowerAttribute". This is a 32-bit flag.
 
{| class="wikitable" border="1"
!  Bits
!  Description
|-
| 0
| IsPowered
|-
| 1
| IsCharging
|}
 
= HdlsAttribute =
This is "nn::hidtypes::HdlsAttribute". This is a 32-bit flag.
 
{| class="wikitable" border="1"
!  Bits
!  Description
|-
| 0
| HasVirtualSixAxisSensorAcceleration
|-
| 1
| HasVirtualSixAxisSensorAngle
|}
 
= HdlsHandle =
This is "nn::hid::debug::HdlsHandle". This is a 0x8-byte struct with 8-byte alignment.
 
= HdlsNpadAssignment =
This is a 0x208-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || s32 Total entries
|-
| 0x4 || 0x4 || Padding
|-
| 0x8 || 0x200(0x20*0x10) || Array of [[#HdlsNpadAssignmentEntry]].
|}
 
= HdlsNpadAssignmentEntry =
This is a 0x20-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x8 || [[#HdlsHandle]]
|-
| 0x8 || 0x4 || ?
|-
| 0xC || 0x4 || ?
|-
| 0x10 || 0x8 || ?
|-
| 0x18 || 0x1 || ?
|-
| 0x19 || 0x7 || Padding
|}
 
= HdlsStateList =
This is a 0x408-byte struct.
 
[9.0.0+] This is a 0x488-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || s32 Total entries
|-
| 0x4 || 0x4 || Padding
|-
| 0x8 || <[[#HdlsStateListEntry]] size>*0x10 || Array of [[#HdlsStateListEntry]].
|}
 
This contains a list of all controllers, including non-virtual controllers.
 
= HdlsStateListEntry =
This is a 0x40-byte struct.  
 
[9.0.0+] This is a 0x48-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x8 || [[#HdlsHandle]]
|-
| 0x8 || [[#HdlsDeviceInfo]] size || [[#HdlsDeviceInfo]]. With [[#ApplyHdlsStateList]] this is only used when creating new devices.
|-
| 0x8 + [[#HdlsDeviceInfo]] size, with 8-byte alignment || 0x24 || [[#HdlsState]]
|-
| <Immediately following the above> || 0x4 || Padding
|}
 
= HdlsDeviceInfo =
This is "nn::hid::debug::HdlsDeviceInfo". This is a 0x10-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || [[#DeviceTypeInternal]]
|-
| 0x4 || 0x4 || RGBA Single Body Color
|-
| 0x8 || 0x4 || RGBA Single Buttons Color
|-
| 0xC || 0x1 || [[#NpadInterfaceType]]. Additional type field used with the above type field, if the value doesn't match one of the following a default is used. Type Pro-Controller: value 0x3 indicates that the controller is connected via USB. Type bit21: value 0x3 = unknown. When value is 0x2, state is merged with an existing controller (when the type value is compatible with this). Otherwise, it's a dedicated controller.
|-
| 0xD || 0x3 || Padding
|}
 
[9.0.0+] This is a 0x14-byte struct.
[9.0.0+] This is a 0x14-byte struct.


Line 7,368: Line 8,006:


= HdlsState =
= HdlsState =
This is a 0x24-byte struct.
This is "nn::hid::debug::HdlsState". This is a 0x24-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 7,386: Line 8,024:
| 0x10 || 0x10(4*2*2) || Joystick data.
| 0x10 || 0x10(4*2*2) || Joystick data.
|-
|-
| 0x20 || 0x1 || Unused for input. Set with output from [[#DumpHdlsStates]] (zero in some cases).
| 0x20 || 0x1 || Indicator. Unused for input. Set with output from [[#DumpHdlsStates]] (zero in some cases).
|-
|-
| 0x21 || 0x3 || Padding
| 0x21 || 0x3 || Padding
|}
|}


[9.0.0+]:
[9.0.0+] (0x28-bytes):
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x4 || BatteryLevel for the main PowerInfo.
| 0x0 || 0x8 || [[#PowerInfo]]
|-
| 0x8 || 0x8 || [[#NpadButton|Buttons]], masked with 0xfffffffff00fffff. See above table regarding HOME/Capture buttons.
|-
| 0x10 || 0x10(4*2*2) || Joystick data.
|-
| 0x20 || 0x1 || Indicator. Unused for input. Set with output from [[#DumpHdlsStates]] (zero in some cases).
|-
|-
| 0x4 || 0x4 || Flags. Used to set the main PowerInfo for [[#NpadSystemProperties]]. Bit0 -> IsPowered, bit1 -> IsCharging.
| 0x21 || 0x7 || Padding
|}
 
[12.0.0+] (0x40-bytes):
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x8 || [[#PowerInfo]]
|-
|-
| 0x8 || 0x8 || [[#NpadButton|Buttons]], masked with 0xfffffffff00fffff. See above table regarding HOME/Capture buttons.
| 0x8 || 0x8 || [[#NpadButton|Buttons]], masked with 0xfffffffff00fffff. See above table regarding HOME/Capture buttons.
Line 7,404: Line 8,056:
| 0x10 || 0x10(4*2*2) || Joystick data.
| 0x10 || 0x10(4*2*2) || Joystick data.
|-
|-
| 0x20 || 0x1 || Unused for input. Set with output from [[#DumpHdlsStates]] (zero in some cases).
| 0x20 || 0xC || VirtualSixAxisSensorAcceleration
|-
| 0x2C || 0xC || VirtualSixAxisSensorAngle
|-
|-
| 0x21 || 0x3 || Padding
| 0x38 || 0x4 || [[#HdlsAttribute]]
|-
| 0x3C || 0x1 || Indicator. Unused for input.
|-
| 0x3D || 0x3 || Padding
|}
|}
= DebugRegisteredDevice =
This is "nn::hid::debug::RegisteredDevice". This is a 0x58-byte struct with 2-byte alignment.
= RegisteredDevice =
This is "nn::hid::system::RegisteredDevice". This is a 0x68-byte struct with 4-byte alignment.


= NotificationLedPattern =
= NotificationLedPattern =
Line 7,790: Line 8,454:
| 0x28 || 0x8 || [[#AnalogStickAssignment|HardwareStickR]]
| 0x28 || 0x8 || [[#AnalogStickAssignment|HardwareStickR]]
|}
|}
= StorageName =
This is "nn::hidconfig::StorageName". This is a 0x81-byte struct.
This is an UTF-8 NUL-terminated name string.


= IrCameraHandle =
= IrCameraHandle =
Line 8,438: Line 9,107:
| 1 || RightJoyRail
| 1 || RightJoyRail
|-
|-
| 2 || [6.0.0+] RightLarkRail (for microphone)
| 2 || [6.0.0+] InternalBus (for Lark microphone)
|}
|}