HID services: Difference between revisions

No edit summary
Line 7,281: Line 7,281:
| "MY" || [[#DeviceTypeInternal|DeviceType]] 4 and [[#DeviceTypeInternal|DeviceType]] 5
| "MY" || [[#DeviceTypeInternal|DeviceType]] 4 and [[#DeviceTypeInternal|DeviceType]] 5
|-
|-
| "LC" || [[#DeviceTypeInternal|DeviceType]] 6 and [[#DeviceTypeInternal|DeviceType]] 30
| "LC" || "Tarragon" ([[#DeviceTypeInternal|DeviceType]] 6) and [[#DeviceTypeInternal|DeviceType]] 30
|-
|-
| "HL" || Famicom left controller
| "HL" || Famicom left controller
Line 7,477: Line 7,477:
| 2 || Rail
| 2 || Rail
|-
|-
| 3 || USB
| 3 || Usb
|-
|-
| 4 || Embedded
| 4 || Embedded
Line 7,723: Line 7,723:
| 5 || JoyRight || RightController || ||
| 5 || JoyRight || RightController || ||
|-
|-
| 6 || FullKey || FullKeyController || ||
| 6 || FullKey || FullKeyController || || "Tarragon" controller
|-
|-
| 7 || LarkHvcLeft, HandheldLarkHvcLeft || LeftController || LarkHvc1, HandheldLarkHvc1Only, HandheldLarkHvc1JoyConRight, HandheldLarkHvc1LarkHvc2, HandheldLarkHvc1LarkNesRight, HandheldNone || Famicom left controller
| 7 || LarkHvcLeft, HandheldLarkHvcLeft || LeftController || LarkHvc1, HandheldLarkHvc1Only, HandheldLarkHvc1JoyConRight, HandheldLarkHvc1LarkHvc2, HandheldLarkHvc1LarkNesRight, HandheldNone || Famicom left controller
Line 7,774: Line 7,774:
|}
|}


= NpadPowerInfo =
= VidPidDefinition =
This is "nn::hid::system::NpadPowerInfo".
This is "nn::hidtypes::VidPidDefinition".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 7,784: Line 7,784:
|-
|-
| 0x0
| 0x0
| 0x1
| 0x2
| IsPowered
| Vid
|-
|-
| 0x1
| 0x2
| 0x1
| 0x2
| IsCharging
| PidRangeMax
|-
|-
| 0x4
| 0x2
| 0x2
| PidRangeMin
|-
| 0x6
| 0x6
| 0x1
| [[#DeviceTypeInternal|DeviceType]]
|-
| 0x7
| 0x1
| Reserved
| Reserved
|-
| 0x8
| 0x6
| [[#BatteryLevel|BatteryLevel]]
|}
|}


= BatteryLevel =
= VidPidDefinitions =
This is "nn::hid::system::NpadBatteryLevel". This is a 4 byte value.
This is "nn::hidtypes::detail::VidPidDefinitions". This is a list of [[#VidPidDefinition|VidPidDefinition]] objects maintained by the hid-sysmodule.
 
= 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 || Size || Description
! Vid || PidRangeMax || PidRangeMin || [[#DeviceTypeInternal|DeviceType]]
|-
|-
| 0x0 || 0x4 || TypeValue
| 0x57E || 0x2006 || 0x2006 || 2
|-
|-
| 0x0 || 0x1 ||  
| 0x57E || 0x2007 || 0x2007 || 1
|-
|-
| 0x1 || 0x1 ||  
| 0x57E || 0x2009 || 0x2009 || 3
|}
 
= SixAxisSensorHandle =
This is "nn::hid::SixAxisSensorHandle". This is a 4-byte struct with 4-byte alignment.
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 0x57E || 0x200F || 0x200F || 24
|-
|-
| 0x0 || 0x4 || TypeValue
| 0x57E || 0x200E || 0x200E || 23
|-
|-
| 0x0 || 0x1 || NpadStyleIndex
| 0x57E || 0x2008 || 0x2008 || 25
|-
|-
| 0x1 || 0x1 || [[#NpadIdType|PlayerNumber]]
| 0x57E || 0x2017 || 0x2017 || 11
|-
|-
| 0x2 || 0x1 || DeviceIdx
| 0x57E || 0x2018 || 0x2018 || 26
|}
 
= VibrationDeviceHandle =
This is "nn::hid::VibrationDeviceHandle". This is a 4-byte struct with 4-byte alignment.
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 0x57E || 0x2019 || 0x2019 || 22
|-
|-
| 0x0 || 0x4 || TypeValue
| 0x57E || 0x201A || 0x201A || 27
|-
|-
| 0x0 || 0x1 || NpadStyleIndex
| 0x57E || 0x201E || 0x201E || 28
|-
|-
| 0x1 || 0x1 || [[#NpadIdType|PlayerNumber]]
| 0x57E || 0x201F || 0x201F || 29
|-
|-
| 0x2 || 0x1 || DeviceIdx
| 0x57E || 0x337 || 0x337 || 13
|}
 
= VibrationDeviceInfo =
This is "nn::hid::VibrationDeviceInfo" / "nn::hid::VibrationDeviceInfoForIpc". This is a 0x8-byte struct.
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 0xF0D || 0x92 || 0x92 || 15
|-
| 0xF0D || 0xAB || 0xAA || 15
|-
| 0xF0D || 0xC1 || 0xC1 || 15
|-
|-
| 0x0 || 0x4 || [[#VibrationDeviceType|DeviceType]]
| 0xF0D || 0xFF || 0xF0 || 15
|-
|-
| 0x4 || 0x4 || [[#VibrationDevicePosition|Position]]
| 0xF0D || 0x22F || 0x200 || 15
|}
 
= VibrationDeviceType =
This is "nn::hid::VibrationDeviceType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Unknown
| 0xE6F || 0x193 || 0x180 || 15
|-
|-
| 1 || LinearResonantActuator
| 0x20D6 || 0xA719 || 0xA710 || 15
|-
|-
| 2 || GcErm
| 0x20D6 || 0xA729 || 0xA720 || 15
|-
|-
| 3 || Erm
| 0x33DD || 0xB || 0x1 || 15
|}
|}


= VibrationDevicePosition =
= NpadPowerInfo =
This is "nn::hid::VibrationDevicePosition".
This is "nn::hid::system::NpadPowerInfo".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || None
! Offset
! Size
! Description
|-
|-
| 1 || Left
| 0x0
| 0x1
| IsPowered
|-
| 0x1
| 0x1
| IsCharging
|-
|-
| 2 || Right
| 0x2
| 0x6
| Reserved
|-
| 0x8
| 0x6
| [[#BatteryLevel|BatteryLevel]]
|}
|}


= VibrationValue =
= BatteryLevel =
This is "nn::hid::VibrationValue". This is a 0x10-byte struct, which contains 4 float values.
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
| AmplitudeLow
|-
|-
| 0x4
| 0x0 || 0x1 ||  
| 0x4
| FrequencyLow
|-
|-
| 0x8
| 0x1 || 0x1 ||  
| 0x4
| AmplitudeHigh
|-
| 0xC
| 0x4
| FrequencyHigh
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Name
!  Description
|-
|-
| 0 || Stop || Stops the vibration with a decay phase.
! Offset || Size || Description
|-
| 0x0 || 0x4 || TypeValue
|-
|-
| 1 || Start || Starts the vibration.
| 0x0 || 0x1 || NpadStyleIndex
|-
|-
| 2 || StopHard || Stops the vibration immediately, with no decay phase.
| 0x1 || 0x1 || [[#NpadIdType|PlayerNumber]]
|}
|-
| 0x2 || 0x1 || DeviceIdx
|}


= AccelerometerPlayMode =
= VibrationDeviceHandle =
This is "nn::hid::debug::AccelerometerPlayMode" (pre-10.0.0 this is "nn::hid::AccelerometerPlayMode").
This is "nn::hid::VibrationDeviceHandle". This is a 4-byte struct with 4-byte alignment.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Loose
! Offset || Size || Description
|-
| 0x0 || 0x4 || TypeValue
|-
| 0x0 || 0x1 || NpadStyleIndex
|-
| 0x1 || 0x1 || [[#NpadIdType|PlayerNumber]]
|-
|-
| 1 || Tight
| 0x2 || 0x1 || DeviceIdx
|}
|}


= GyroscopeZeroDriftMode =
= VibrationDeviceInfo =
This is "nn::hid::GyroscopeZeroDriftMode".
This is "nn::hid::VibrationDeviceInfo" / "nn::hid::VibrationDeviceInfoForIpc". This is a 0x8-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || Loose
! Offset || Size || Description
|-
|-
| 1 || Standard
| 0x0 || 0x4 || [[#VibrationDeviceType|DeviceType]]
|-
|-
| 2 || Tight
| 0x4 || 0x4 || [[#VibrationDevicePosition|Position]]
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
! Offset || Size || Description
| 0 || Unknown
|-
|-
| 0x0 || 0x4 || [[#PalmaOperationType]]
| 1 || LinearResonantActuator
|-
|-
| 0x4 || 0x4 || Result
| 2 || GcErm
|-
|-
| 0x8 || 0x140 || Buffer for [[#GetPalmaOperationInfo]].
| 3 || Erm
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 7,984: Line 7,968:
!  Description
!  Description
|-
|-
| 0 || PlayActivity
| 0 || None
|-
|-
| 1 || SetFrModeType
| 1 || Left
|-
|-
| 2 || ReadStep
| 2 || Right
|}
 
= VibrationValue =
This is "nn::hid::VibrationValue". This is a 0x10-byte struct, which contains 4 float values.
 
{| class="wikitable" border="1"
|-
|-
| 3 || EnableStep
! Offset
! Size
! Description
|-
|-
| 4 || ResetStep
| 0x0
| 0x4
| AmplitudeLow
|-
|-
| 5 || ReadApplicationSection
| 0x4
| 0x4
| FrequencyLow
|-
|-
| 6 || WriteApplicationSection
| 0x8
| 0x4
| AmplitudeHigh
|-
|-
| 7 || ReadUniqueCode
| 0xC
|-
| 0x4
| 8 || SetUniqueCodeInvalid
| FrequencyHigh
|}
 
= VibrationGcErmCommand =
This is "nn::hid::VibrationGcErmCommand".
 
{| class="wikitable" border="1"
!  Value
!  Name
!  Description
|-
|-
| 9 || WriteActivityEntry
| 0 || Stop || Stops the vibration with a decay phase.
|-
|-
| 10 || WriteRgbLedPatternEntry
| 1 || Start || Starts the vibration.
|-
|-
| 11 || WriteWaveEntry
| 2 || StopHard || Stops the vibration immediately, with no decay phase.
|-
| 12 || ReadDataBaseIdentificationVersion
|-
| 13 || WriteDataBaseIdentificationVersion
|-
| 14 || SuspendFeature
|-
| 15 || [5.1.0+] ReadPlayLog
|-
| 16 || [5.1.0+] ResetPlayLog
|}
|}


= PalmaFrModeType =
= AccelerometerPlayMode =
This is "nn::hid::PalmaFrModeType".
This is "nn::hid::debug::AccelerometerPlayMode" (pre-10.0.0 this is "nn::hid::AccelerometerPlayMode").


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 8,026: Line 8,023:
!  Description
!  Description
|-
|-
| 0 || Off
| 0 || Loose
|-
|-
| 1 || B01
| 1 || Tight
|}
 
= GyroscopeZeroDriftMode =
This is "nn::hid::GyroscopeZeroDriftMode".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 2 || B02
| 0 || Loose
|-
|-
| 3 || B03
| 1 || Standard
|-
|-
| 4 || Downloaded
| 2 || Tight
|}
|}


= PalmaApplicationSectionAccessBuffer =
= PalmaConnectionHandle =
This is "nn::hid::PalmaApplicationSectionAccessBuffer". This is a 0x100-byte struct.
This is "nn::hid::PalmaConnectionHandle". This is a 0x8-byte struct with 8-byte alignment.


= PalmaActivityEntry =
= PalmaOperationInfo =
This is "nn::hid::PalmaActivityEntry".
This is "nn::hid::PalmaOperationInfo". This is a 0x148-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 8,047: Line 8,052:
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x2 || RgbLedPatternIndex.
| 0x0 || 0x4 || [[#PalmaOperationType]]
|-
|-
| 0x2 || 0x2 || Padding
| 0x4 || 0x4 || Result
|-
|-
| 0x4 || 0x4 || [[#PalmaWaveSet|WaveSet]].
| 0x8 || 0x140 || Buffer for [[#GetPalmaOperationInfo]].
|-
| 0x8 || 0x2 || WaveIndex.
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 8,063: Line 8,066:
!  Description
!  Description
|-
|-
| 0 || Small
| 0 || PlayActivity
|-
|-
| 1 || Medium
| 1 || SetFrModeType
|-
|-
| 2 || Large
| 2 || ReadStep
|}
 
= PalmaFeature =
This is "nn::hid::PalmaFeature".
 
{| class="wikitable" border="1"
|-
|-
! Bit
| 3 || EnableStep
! Description
|-
|-
| 0
| 4 || ResetStep
| FrMode
|-
|-
| 1
| 5 || ReadApplicationSection
| RumbleFeedback
|-
|-
| 2
| 6 || WriteApplicationSection
| Step
|-
|-
| 3
| 7 || ReadUniqueCode
| MuteSwitch
|-
|-
|}
| 8 || SetUniqueCodeInvalid
 
= AbstractedPadState =
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 9 || WriteActivityEntry
|-
|-
| 0x0 || 0x4 || Type, only 1 bit can be set. Converted to [[#HdlsDeviceInfo]]::type internally by [[#SetAutoPilotVirtualPadState]].
| 10 || WriteRgbLedPatternEntry
|-
|-
| 0x4 || 0x1 || Flags. [[#SetAutoPilotVirtualPadState]] only uses bit0: when clear it will skip using the rest of the input and run [[#UnsetAutoPilotVirtualPadState]] internally.
| 11 || WriteWaveEntry
|-
|-
| 0x5 || 0x3 || Padding
| 12 || ReadDataBaseIdentificationVersion
|-
|-
| 0x8 || 0x4 || RGBA Single Body Color
| 13 || WriteDataBaseIdentificationVersion
|-
|-
| 0xC || 0x4 || RGBA Single Buttons Color
| 14 || SuspendFeature
|-
|-
| 0x10 || 0x1 || See [[#HiddbgHdlsDeviceInfo]]::[[#NpadInterfaceType]].
| 15 || [5.1.0+] ReadPlayLog
|-
|-
| 0x11 || 0x3 || Padding
| 16 || [5.1.0+] ResetPlayLog
|-
|}
| 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.
= PalmaFrModeType =
This is "nn::hid::PalmaFrModeType".


Type:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Bits
Value
!  [[#HdlsDeviceInfo]]::type bits
!  Description
!  Description
!  Notes
|-
|-
| 0 || 0 || ||
| 0 || Off
|-
|-
| 1 || 15 || || [[#DeviceType]] |= BIT(1)
| 1 || B01
|-
|-
| 2 || 1 || ||
| 2 || B02
|-
|-
| 3 || 2 || ||
| 3 || B03
|-
|-
| 4 || 1 || ||  
| 4 || Downloaded
|-
|}
| 5 || 2 || ||
 
|-
= PalmaApplicationSectionAccessBuffer =
| 6 || 3 || ||
This is "nn::hid::PalmaApplicationSectionAccessBuffer". This is a 0x100-byte struct.
 
= PalmaActivityEntry =
This is "nn::hid::PalmaActivityEntry".
 
{| class="wikitable" border="1"
|-
|-
| 7 || 11 || || [[#DeviceType]] |= BIT(11)
! Offset || Size || Description
|-
|-
| 8 || 12 || || [[#DeviceType]] |= BIT(12)
| 0x0 || 0x2 || RgbLedPatternIndex.
|-
|-
| 9 || 13 || || [[#DeviceType]] |= BIT(13)
| 0x2 || 0x2 || Padding
|-
|-
| 10 || 14 || || [[#DeviceType]] |= BIT(14)
| 0x4 || 0x4 || [[#PalmaWaveSet|WaveSet]].
|-
|-
| 11 || 15 || || [[#DeviceType]] |= BIT(11)
| 0x8 || 0x2 || WaveIndex.
|}
 
= PalmaWaveSet =
This is "nn::hid::PalmaWaveSet".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 12 || 12 || || [[#DeviceType]] |= BIT(12)
| 0 || Small
|-
|-
| 13 || 13 || || [[#DeviceType]] |= BIT(13)
| 1 || Medium
|-
| 14 || 14 || || [[#DeviceType]] |= BIT(14)
|-
| 15 || 17 || ||
|-
| 31 || 21 || || [[#DeviceType]] = BIT(31)
|-
|-
| 2 || Large
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Bit
! Size
! Description
! Description
|-
|-
| 0x0
| 0
| 0x4
| FrMode
| [[#DebugPadAttributeSet|Attributes]]
|-
|-
| 0x4
| 1
| 0x4
| RumbleFeedback
| [[#DebugPadButtonSet|Buttons]]
|-
|-
| 0x8
| 2
| 0x8
| Step
| [[#AnalogStickState|AnalogStickL]]
|-
| 3
| MuteSwitch
|-
|-
| 0x10
| 0x8
| [[#AnalogStickState|AnalogStickR]]
|}
|}


= MouseAutoPilotState =
= AbstractedPadState =
This is "nn::hid::debug::MouseAutoPilotState".
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset || Size || Description
! Size
! Description
|-
|-
| 0x0
| 0x0 || 0x4 || Type, only 1 bit can be set. Converted to [[#HdlsDeviceInfo]]::type internally by [[#SetAutoPilotVirtualPadState]].
| 0x4
| X
|-
|-
| 0x4
| 0x4 || 0x1 || Flags. [[#SetAutoPilotVirtualPadState]] only uses bit0: when clear it will skip using the rest of the input and run [[#UnsetAutoPilotVirtualPadState]] internally.
| 0x4
| Y
|-
|-
| 0x8
| 0x5 || 0x3 || Padding
| 0x4
| DeltaX
|-
|-
| 0xC
| 0x8 || 0x4 || RGBA Single Body Color
| 0x4
|-
| DeltaY
| 0xC || 0x4 || RGBA Single Buttons Color
|-
| 0x10 || 0x1 || See [[#HiddbgHdlsDeviceInfo]]::[[#NpadInterfaceType]].
|-
|-
| 0x10
| 0x11 || 0x3 || Padding
| 0x4
| WheelDelta
|-
|-
| 0x14
| 0x14 || 0x24 || [[#HdlsState]]. Unknown if the last 4-bytes are included in this struct, [[#SetAutoPilotVirtualPadState]]/[[#hiddbgGetAbstractedPadsState]] only uses the first 0x20-bytes.
| 0x4
| [[#MouseButtonSet|Buttons]]
|-
|-
| 0x18
| 0x38 || 0x60 || Unused with [[#SetAutoPilotVirtualPadState]]/[[#GetAbstractedPadsState]].
| 0x4
| [[#MouseAttributeSet|Attributes]]
|}
|}


= KeyboardAutoPilotState =
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.
This is "nn::hid::debug::KeyboardAutoPilotState".


Type:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Bits
!  [[#HdlsDeviceInfo]]::type bits
!  Description
!  Notes
|-
|-
! Offset
| 0 || 0 || ||
! Size
! Description
|-
|-
| 0x0
| 1 || 15 || || [[#DeviceType]] |= BIT(1)
| 0x8
| [[#KeyboardModifierSet|Modifiers]]
|-
|-
| 0x8
| 2 || 1 || ||  
| 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
| 3 || 2 || ||
! Size
! Description
|-
|-
| 0x0 || 0x8 || Buttons (only bit0 is used)
| 4 || 1 || ||  
|}
 
= PowerInfo =
This is "nn::hidtypes::PowerInfo".
 
{| class="wikitable" border="1"
|-
|-
! Offset
| 5 || 2 || ||
! Size
|-
! Description
| 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 || ||
|-
|-
| 0x0 || 0x4 || BatteryLevel
| 31 || 21 || || [[#DeviceType]] = BIT(31)
|-
|-
| 0x4 || 0x4 || [[#PowerAttribute]]
|}
|}


= PowerAttribute =
The above "[[#DeviceType]] |=" notes only apply when type2 is 0x2.
This is "nn::hidtypes::PowerAttribute". This is a 32-bit flag.
 
= DebugPadAutoPilotState =
This is "nn::hid::debug::DebugPadAutoPilotState"


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Bits
!  Description
|-
|-
| 0
! Offset
| IsPowered
! Size
! Description
|-
| 0x0
| 0x4
| [[#DebugPadAttributeSet|Attributes]]
|-
| 0x4
| 0x4
| [[#DebugPadButtonSet|Buttons]]
|-
| 0x8
| 0x8
| [[#AnalogStickState|AnalogStickL]]
|-
|-
| 1
| 0x10
| IsCharging
| 0x8
| [[#AnalogStickState|AnalogStickR]]
|}
|}


= HdlsAttribute =
= MouseAutoPilotState =
This is "nn::hidtypes::HdlsAttribute". This is a 32-bit flag.
This is "nn::hid::debug::MouseAutoPilotState".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Bits
!  Description
|-
|-
| 0
! Offset
| HasVirtualSixAxisSensorAcceleration
! Size
! Description
|-
|-
| 1
| 0x0
| HasVirtualSixAxisSensorAngle
| 0x4
|}
| X
 
= HdlsHandle =
This is "nn::hid::debug::HdlsHandle". This is a 0x8-byte struct with 8-byte alignment.
 
= HdlsSessionId =
This is "nn::hid::debug::detail::HdlsSessionId". This is a 0x8-byte struct with 8-byte alignment.
 
= HdlsNpadAssignment =
This is a 0x208-byte struct.
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 0x4
| 0x4
| Y
|-
| 0x8
| 0x4
| DeltaX
|-
|-
| 0x0 || 0x4 || s32 Total entries
| 0xC
| 0x4
| DeltaY
|-
| 0x10
| 0x4
| WheelDelta
|-
|-
| 0x4 || 0x4 || Padding
| 0x14
| 0x4
| [[#MouseButtonSet|Buttons]]
|-
|-
| 0x8 || 0x200(0x20*0x10) || Array of [[#HdlsNpadAssignmentEntry]].
| 0x18
| 0x4
| [[#MouseAttributeSet|Attributes]]
|}
|}


= HdlsNpadAssignmentEntry =
= KeyboardAutoPilotState =
This is a 0x20-byte struct.
This is "nn::hid::debug::KeyboardAutoPilotState".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset
! Size
! Description
|-
|-
| 0x0 || 0x8 || [[#HdlsHandle]]
| 0x0
| 0x8
| [[#KeyboardModifierSet|Modifiers]]
|-
|-
| 0x8 || 0x4 || ?
| 0x8
|-
| 0x20
| 0xC || 0x4 || ?
| [[#KeyboardKeySet|Keys]]
|-
| 0x10 || 0x8 || ?
|-
| 0x18 || 0x1 || ?
|-
| 0x19 || 0x7 || Padding
|}
|}


= HdlsStateList =
= SleepButtonAutoPilotState =
This is a 0x408-byte struct.
This is "nn::hid::debug::SleepButtonAutoPilotState". This is a 0x8-byte struct with 8-byte alignment.
 
[9.0.0+] This is a 0x488-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset
! Size
! Description
|-
|-
| 0x0 || 0x4 || s32 Total entries
| 0x0 || 0x8 || Buttons (only bit0 is used)
|-
|}
| 0x4 || 0x4 || Padding
|-
| 0x8 || <[[#HdlsStateListEntry]] size>*0x10 || Array of [[#HdlsStateListEntry]].
|}


This contains a list of all controllers, including non-virtual controllers.
= PowerInfo =
 
This is "nn::hidtypes::PowerInfo".
= HdlsStateListEntry =
This is a 0x40-byte struct.
 
[9.0.0+] This is a 0x48-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset
! Size
! Description
|-
|-
| 0x0 || 0x8 || [[#HdlsHandle]]
| 0x0 || 0x4 || BatteryLevel
|-
|-
| 0x8 || [[#HdlsDeviceInfo]] size || [[#HdlsDeviceInfo]]. With [[#ApplyHdlsStateList]] this is only used when creating new devices.
| 0x4 || 0x4 || [[#PowerAttribute]]
|-
| 0x8 + [[#HdlsDeviceInfo]] size, with 8-byte alignment || 0x24 || [[#HdlsState]]
|-
| <Immediately following the above> || 0x4 || Padding
|}
|}


= HdlsDeviceInfo =
= PowerAttribute =
This is "nn::hid::debug::HdlsDeviceInfo". This is a 0x10-byte struct.
This is "nn::hidtypes::PowerAttribute". This is a 32-bit flag.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Bits
!  Description
|-
|-
! Offset || Size || Description
| 0
| IsPowered
|-
|-
| 0x0 || 0x4 || [[#DeviceTypeInternal]]
| 1
|-
| IsCharging
| 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.
= HdlsAttribute =
This is "nn::hidtypes::HdlsAttribute". This is a 32-bit flag.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Bits
!  Description
|-
|-
! Offset || Size || Description
| 0
| HasVirtualSixAxisSensorAcceleration
|-
|-
| 0x0 || 0x1 || [[#DeviceTypeInternal]]
| 1
|-
| HasVirtualSixAxisSensorAngle
| 0x1 || 0x1 || [[#NpadInterfaceType]]. Similar to the field from the old struct.
|}
 
= HdlsHandle =
This is "nn::hid::debug::HdlsHandle". This is a 0x8-byte struct with 8-byte alignment.
 
= HdlsSessionId =
This is "nn::hid::debug::detail::HdlsSessionId". This is a 0x8-byte struct with 8-byte alignment.
 
= HdlsNpadAssignment =
This is a 0x208-byte struct.
 
{| class="wikitable" border="1"
|-
|-
| 0x2 || 0x2 || Padding
! Offset || Size || Description
|-
|-
| 0x4 || 0x4 || RGBA Single Body Color
| 0x0 || 0x4 || s32 Total entries
|-
|-
| 0x8 || 0x4 || RGBA Single Buttons Color
| 0x4 || 0x4 || Padding
|-
|-
| 0xC || 0x4 || RGBA Left Grip Color
| 0x8 || 0x200(0x20*0x10) || Array of [[#HdlsNpadAssignmentEntry]].
|-
| 0x10 || 0x4 || RGBA Right Grip Color
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 8,421: Line 8,408:
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x1 || IsPowered for the main PowerInfo.
| 0x0 || 0x8 || [[#HdlsHandle]]
|-
|-
| 0x1 || 0x1 || ORRed with IsPowered to set the value of the first byte for the controller [[#NpadSystemProperties]].
| 0x8 || 0x4 || ?
|-
|-
| 0x2 || 0x6 || Unknown
| 0xC || 0x4 || ?
|-
|-
| 0x8 || 0x4 || BatteryLevel for the main PowerInfo.
| 0x10 || 0x8 || ?
|-
|-
| 0xC || 0x4 || [[#NpadButton|Buttons]]. Bit18 = HOME and bit19 = Capture.
| 0x18 || 0x1 || ?
|-
|-
| 0x10 || 0x10(4*2*2) || Joystick data.
| 0x19 || 0x7 || Padding
|-
| 0x20 || 0x1 || Indicator. Unused for input. Set with output from [[#DumpHdlsStates]] (zero in some cases).
|-
| 0x21 || 0x3 || Padding
|}
|}


[9.0.0+] (0x28-bytes):
= HdlsStateList =
This is a 0x408-byte struct.
 
[9.0.0+] This is a 0x488-byte struct.
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x8 || [[#PowerInfo]]
| 0x0 || 0x4 || s32 Total entries
|-
|-
| 0x8 || 0x8 || [[#NpadButton|Buttons]], masked with 0xfffffffff00fffff. See above table regarding HOME/Capture buttons.
| 0x4 || 0x4 || Padding
|-
|-
| 0x10 || 0x10(4*2*2) || Joystick data.
| 0x8 || <[[#HdlsStateListEntry]] size>*0x10 || Array of [[#HdlsStateListEntry]].
|-
| 0x20 || 0x1 || Indicator. Unused for input. Set with output from [[#DumpHdlsStates]] (zero in some cases).
|-
| 0x21 || 0x7 || Padding
|}
|}


[12.0.0+] (0x40-bytes):
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"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x8 || [[#PowerInfo]]
| 0x0 || 0x8 || [[#HdlsHandle]]
|-
|-
| 0x8 || 0x8 || [[#NpadButton|Buttons]], masked with 0xfffffffff00fffff. See above table regarding HOME/Capture buttons.
| 0x8 || [[#HdlsDeviceInfo]] size || [[#HdlsDeviceInfo]]. With [[#ApplyHdlsStateList]] this is only used when creating new devices.
|-
|-
| 0x10 || 0x10(4*2*2) || Joystick data.
| 0x8 + [[#HdlsDeviceInfo]] size, with 8-byte alignment || 0x24 || [[#HdlsState]]
|-
|-
| 0x20 || 0xC || VirtualSixAxisSensorAcceleration
| <Immediately following the above> || 0x4 || Padding
|}
 
= HdlsDeviceInfo =
This is "nn::hid::debug::HdlsDeviceInfo". This is a 0x10-byte struct.
 
{| class="wikitable" border="1"
|-
|-
| 0x2C || 0xC || VirtualSixAxisSensorAngle
! Offset || Size || Description
|-
|-
| 0x38 || 0x4 || [[#HdlsAttribute]]
| 0x0 || 0x4 || [[#DeviceTypeInternal]]
|-
|-
| 0x3C || 0x1 || Indicator. Unused for input.
| 0x4 || 0x4 || RGBA Single Body Color
|-
|-
| 0x3D || 0x3 || Padding
| 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
|}
|}


= DebugRegisteredDevice =
[9.0.0+] This is a 0x14-byte struct.
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 =
This is "nn::hid::system::NotificationLedPattern". This is a 0x48-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset || Size || Description
! Size
|-
! Description
| 0x0 || 0x1 || [[#DeviceTypeInternal]]
|-
|-
| 0x0
| 0x1 || 0x1 || [[#NpadInterfaceType]]. Similar to the field from the old struct.
| 0x1
| TimeUnit
|-
|-
| 0x1
| 0x2 || 0x2 || Padding
| 0x1
| FrameCount
|-
|-
| 0x2
| 0x4 || 0x4 || RGBA Single Body Color
| 0x1
| CycleCount
|-
|-
| 0x3
| 0x8 || 0x4 || RGBA Single Buttons Color
| 0x1
| InitialBrightness
|-
|-
| 0x4
| 0xC || 0x4 || RGBA Left Grip Color
| 0x4 * 15
| [[#Frame|Frames]]
|-
|-
| 0x40
| 0x10 || 0x4 || RGBA Right Grip Color
| 0x1
| FinalBrightness
|-
| 0x41
| 0x1
| TimeTowardsFinalBrightness
|-
| 0x42
| 0x6
| Reserved
|}
|}


== Frame ==
= HdlsState =
This is "nn::hid::debug::HdlsState". This is a 0x24-byte struct.
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset || Size || Description
! Size
|-
! Description
| 0x0 || 0x1 || IsPowered for the main PowerInfo.
|-
| 0x1 || 0x1 || ORRed with IsPowered to set the value of the first byte for the controller [[#NpadSystemProperties]].
|-
| 0x2 || 0x6 || Unknown
|-
| 0x8 || 0x4 || BatteryLevel for the main PowerInfo.
|-
|-
| 0x0
| 0xC || 0x4 || [[#NpadButton|Buttons]]. Bit18 = HOME and bit19 = Capture.
| 0x1
| Brightness
|-
|-
| 0x1
| 0x10 || 0x10(4*2*2) || Joystick data.
| 0x1
| TimeTowards
|-
|-
| 0x2
| 0x20 || 0x1 || Indicator. Unused for input. Set with output from [[#DumpHdlsStates]] (zero in some cases).
| 0x1
| TimeToHold
|-
|-
| 0x3
| 0x21 || 0x3 || Padding
| 0x1
| Reserved
|}
|}


= SystemButtonConfigEmbedded =
[9.0.0+] (0x28-bytes):
This is "nn::hid::system::ButtonConfigEmbedded". This is a 0x2C8-byte struct.
{| class="wikitable" border="1"
 
= SystemButtonConfigFull =
This is "nn::hid::system::ButtonConfigFull". This is a 0x2C8-byte struct.
 
= SystemButtonConfigLeft =
This is "nn::hid::system::ButtonConfigLeft". This is a 0x1C8-byte struct.
 
= SystemButtonConfigRight =
This is "nn::hid::system::ButtonConfigRight". This is a 0x1A0-byte struct.
 
= ButtonConfigEmbedded =
This is "nn::hidconfig::ButtonConfigEmbedded". This is a 0x54-byte struct.
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonLeft]]
| 0x0 || 0x8 || [[#PowerInfo]]
|-
|-
| 0x4 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonUp]]
| 0x8 || 0x8 || [[#NpadButton|Buttons]], masked with 0xfffffffff00fffff. See above table regarding HOME/Capture buttons.
|-
|-
| 0x8 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonRight]]
| 0x10 || 0x10(4*2*2) || Joystick data.
|-
|-
| 0xC || 0x4 || [[#DigitalButtonAssignment|HardwareButtonDown]]
| 0x20 || 0x1 || Indicator. Unused for input. Set with output from [[#DumpHdlsStates]] (zero in some cases).
|-
|-
| 0x10 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonA]]
| 0x21 || 0x7 || Padding
|}
 
[12.0.0+] (0x40-bytes):
{| class="wikitable" border="1"
|-
|-
| 0x14 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonB]]
! Offset || Size || Description
|-
|-
| 0x18 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonX]]
| 0x0 || 0x8 || [[#PowerInfo]]
|-
|-
| 0x1C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonY]]
| 0x8 || 0x8 || [[#NpadButton|Buttons]], masked with 0xfffffffff00fffff. See above table regarding HOME/Capture buttons.
|-
|-
| 0x20 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStickL]]
| 0x10 || 0x10(4*2*2) || Joystick data.
|-
|-
| 0x24 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStickR]]
| 0x20 || 0xC || VirtualSixAxisSensorAcceleration
|-
|-
| 0x28 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonL]]
| 0x2C || 0xC || VirtualSixAxisSensorAngle
|-
|-
| 0x2C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonR]]
| 0x38 || 0x4 || [[#HdlsAttribute]]
|-
|-
| 0x30 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonZL]]
| 0x3C || 0x1 || Indicator. Unused for input.
|-
|-
| 0x34 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonZR]]
| 0x3D || 0x3 || Padding
|-
| 0x38 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonSelect]]
|-
| 0x3C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStart]]
|-
| 0x40 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonCapture]]
|-
| 0x44 || 0x8 || [[#AnalogStickAssignment|HardwareStickL]]
|-
| 0x4C || 0x8 || [[#AnalogStickAssignment|HardwareStickR]]
|}
|}


== DigitalButtonAssignment ==
= DebugRegisteredDevice =
This is "nn::hidconfig::DigitalButtonAssignment".
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 =
This is "nn::hid::system::NotificationLedPattern". This is a 0x48-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || A
! Offset
! Size
! Description
|-
|-
| 1 || B
| 0x0
| 0x1
| TimeUnit
|-
|-
| 2 || X
| 0x1
| 0x1
| FrameCount
|-
|-
| 3 || Y
| 0x2
| 0x1
| CycleCount
|-
|-
| 4 || StickL
| 0x3
| 0x1
| InitialBrightness
|-
|-
| 5 || StickR
| 0x4
| 0x4 * 15
| [[#Frame|Frames]]
|-
|-
| 6 || L
| 0x40
| 0x1
| FinalBrightness
|-
|-
| 7 || R
| 0x41
| 0x1
| TimeTowardsFinalBrightness
|-
|-
| 8 || ZL
| 0x42
| 0x6
| Reserved
|}
 
== Frame ==
{| class="wikitable" border="1"
|-
|-
| 9 || ZR
! Offset
! Size
! Description
|-
|-
| 10 || Select
| 0x0
| 0x1
| Brightness
|-
|-
| 11 || Start
| 0x1
| 0x1
| TimeTowards
|-
|-
| 12 || Left
| 0x2
| 0x1
| TimeToHold
|-
|-
| 13 || Up
| 0x3
|-
| 0x1
| 14 || Right
| Reserved
|-
|}
| 15 || Down
 
|-
= SystemButtonConfigEmbedded =
| 16 || LeftSL
This is "nn::hid::system::ButtonConfigEmbedded". This is a 0x2C8-byte struct.
|-
 
| 17 || LeftSR
= SystemButtonConfigFull =
|-
This is "nn::hid::system::ButtonConfigFull". This is a 0x2C8-byte struct.
| 18 || RightSL
 
|-
= SystemButtonConfigLeft =
| 19 || RightSR
This is "nn::hid::system::ButtonConfigLeft". This is a 0x1C8-byte struct.
|-
 
| 20 || HomeButton
= SystemButtonConfigRight =
|-
This is "nn::hid::system::ButtonConfigRight". This is a 0x1A0-byte struct.
| 21 || CaptureButton
|-
| 22 || Invalid
|}


== AnalogStickAssignment ==
= ButtonConfigEmbedded =
This is "nn::hidconfig::AnalogStickAssignment".
This is "nn::hidconfig::ButtonConfigEmbedded". This is a 0x54-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 8,667: Line 8,649:
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x4 || [[#AnalogStickRotation]]
| 0x0 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonLeft]]
|-
| 0x4 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonUp]]
|-
|-
| 0x4 || 0x1 || IsPairedStickAssigned
| 0x8 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonRight]]
|-
|-
| 0x5 || 0x3 || Reserved
| 0xC || 0x4 || [[#DigitalButtonAssignment|HardwareButtonDown]]
|}
 
== AnalogStickRotation ==
This is "nn::hidconfig::AnalogStickRotation".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 0 || None
| 0x10 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonA]]
|-
|-
| 1 || Clockwise90
| 0x14 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonB]]
|-
|-
| 2 || Anticlockwise90
| 0x18 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonX]]
|}
 
= ButtonConfigFull =
This is "nn::hidconfig::ButtonConfigFull". This is a 0x54-byte struct.
 
This is identical to [[#ButtonConfigEmbedded]].
 
= ButtonConfigLeft =
This is "nn::hidconfig::ButtonConfigLeft". This is a 0x34-byte struct.
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 0x1C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonY]]
|-
|-
| 0x0 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonLeft]]
| 0x20 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStickL]]
|-
|-
| 0x4 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonUp]]
| 0x24 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStickR]]
|-
|-
| 0x8 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonRight]]
| 0x28 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonL]]
|-
|-
| 0xC || 0x4 || [[#DigitalButtonAssignment|HardwareButtonDown]]
| 0x2C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonR]]
|-
|-
| 0x10 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStickL]]
| 0x30 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonZL]]
|-
|-
| 0x14 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonL]]
| 0x34 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonZR]]
|-
|-
| 0x18 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonZL]]
| 0x38 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonSelect]]
|-
|-
| 0x1C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonSelect]]
| 0x3C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStart]]
|-
|-
| 0x20 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonLeftSL]]
| 0x40 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonCapture]]
|-
|-
| 0x24 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonLeftSR]]
| 0x44 || 0x8 || [[#AnalogStickAssignment|HardwareStickL]]
|-
|-
| 0x28 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonCapture]]
| 0x4C || 0x8 || [[#AnalogStickAssignment|HardwareStickR]]
|-
| 0x2C || 0x8 || [[#AnalogStickAssignment|HardwareStickL]]
|}
|}


= ButtonConfigRight =
== DigitalButtonAssignment ==
This is "nn::hidconfig::ButtonConfigRight". This is a 0x30-byte struct.
This is "nn::hidconfig::DigitalButtonAssignment".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
! Offset || Size || Description
| 0 || A
|-
|-
| 0x0 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonA]]
| 1 || B
|-
| 2 || X
|-
| 3 || Y
|-
|-
| 0x4 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonB]]
| 4 || StickL
|-
|-
| 0x8 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonX]]
| 5 || StickR
|-
|-
| 0xC || 0x4 || [[#DigitalButtonAssignment|HardwareButtonY]]
| 6 || L
|-
|-
| 0x10 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStickR]]
| 7 || R
|-
|-
| 0x14 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonR]]
| 8 || ZL
|-
|-
| 0x18 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonZR]]
| 9 || ZR
|-
|-
| 0x1C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStart]]
| 10 || Select
|-
|-
| 0x20 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonRightSL]]
| 11 || Start
|-
|-
| 0x24 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonRightSR]]
| 12 || Left
|-
|-
| 0x28 || 0x8 || [[#AnalogStickAssignment|HardwareStickR]]
| 13 || Up
|}
 
= StorageName =
This is "nn::hidconfig::StorageName". This is a 0x81-byte struct.
 
This is an UTF-8 NUL-terminated name string.
 
= InterfaceType =
This is "nn::hidtypes::InterfaceType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 1 || Bluetooth
| 14 || Right
|-
|-
| 2 || Rail
| 15 || Down
|-
|-
| 3 || USB
| 16 || LeftSL
|-
|-
| 4 || Embedded
| 17 || LeftSR
|}
 
= DigitalButton =
This is "nn::hidtypes::DigitalButton". This is a 64-bit flag.
 
{| class="wikitable" border="1"
|-
|-
! Bit
| 18 || RightSL
! Description
|-
|-
| 0
| 19 || RightSR
| A
|-
|-
| 1
| 20 || HomeButton
| B
|-
|-
| 2
| 21 || CaptureButton
| X
|-
|-
| 3
| 22 || Invalid
| Y
|}
 
== AnalogStickAssignment ==
This is "nn::hidconfig::AnalogStickAssignment".
 
{| class="wikitable" border="1"
|-
|-
| 4
! Offset || Size || Description
| StickL
|-
|-
| 5
| 0x0 || 0x4 || [[#AnalogStickRotation]]
| StickR
|-
|-
| 6
| 0x4 || 0x1 || IsPairedStickAssigned
| L
|-
|-
| 7
| 0x5 || 0x3 || Reserved
| R
|}
 
== AnalogStickRotation ==
This is "nn::hidconfig::AnalogStickRotation".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
|-
| 8
| 0 || None
| ZL
|-
|-
| 9
| 1 || Clockwise90
| ZR
|-
|-
| 10
| 2 || Anticlockwise90
| Start
|}
 
= ButtonConfigFull =
This is "nn::hidconfig::ButtonConfigFull". This is a 0x54-byte struct.
 
This is identical to [[#ButtonConfigEmbedded]].
 
= ButtonConfigLeft =
This is "nn::hidconfig::ButtonConfigLeft". This is a 0x34-byte struct.
 
{| class="wikitable" border="1"
|-
|-
| 11
! Offset || Size || Description
| Select
|-
|-
| 12
| 0x0 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonLeft]]
| Left
|-
|-
| 13
| 0x4 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonUp]]
| Up
|-
|-
| 14
| 0x8 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonRight]]
| Right
|-
|-
| 15
| 0xC || 0x4 || [[#DigitalButtonAssignment|HardwareButtonDown]]
| Down
|-
|-
| 16
| 0x10 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStickL]]
| SL
|-
|-
| 17
| 0x14 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonL]]
| SR
|-
|-
| 18
| 0x18 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonZL]]
| Home
|-
|-
| 19
| 0x1C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonSelect]]
| Shot
|-
|-
| 20
| 0x20 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonLeftSL]]
| StickLLeft
|-
|-
| 21
| 0x24 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonLeftSR]]
| StickLUp
|-
|-
| 22
| 0x28 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonCapture]]
| StickLRight
|-
|-
| 23
| 0x2C || 0x8 || [[#AnalogStickAssignment|HardwareStickL]]
| StickLDown
|}
 
= ButtonConfigRight =
This is "nn::hidconfig::ButtonConfigRight". This is a 0x30-byte struct.
 
{| class="wikitable" border="1"
|-
|-
| 24
! Offset || Size || Description
| StickRLeft
|-
|-
| 25
| 0x0 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonA]]
| StickRUp
|-
|-
| 26
| 0x4 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonB]]
| StickRRight
|-
|-
| 27
| 0x8 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonX]]
| StickRDown
|-
|-
| 28
| 0xC || 0x4 || [[#DigitalButtonAssignment|HardwareButtonY]]
| Palma
|-
|-
| 29
| 0x10 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStickR]]
| HandheldLeftB
|-
|-
| 30
| 0x14 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonR]]
| Plus
|-
|-
| 31
| 0x18 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonZR]]
| Minus
|-
|-
| 32
| 0x1C || 0x4 || [[#DigitalButtonAssignment|HardwareButtonStart]]
| Z
|-
|-
| 33
| 0x20 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonRightSL]]
| LeftSL
|-
|-
| 34
| 0x24 || 0x4 || [[#DigitalButtonAssignment|HardwareButtonRightSR]]
| LeftSR
|-
|-
| 35
| 0x28 || 0x8 || [[#AnalogStickAssignment|HardwareStickR]]
| RightSL
|}
|-
 
| 36
= StorageName =
| RightSR
This is "nn::hidconfig::StorageName". This is a 0x81-byte struct.
|-
 
| 37
This is an UTF-8 NUL-terminated name string.
| LeftC
 
= InterfaceType =
This is "nn::hidtypes::InterfaceType".
 
{| class="wikitable" border="1"
!  Value
!  Description
|-
| 1 || Bluetooth
|-
|-
| 38
| 2 || Rail
| UpC
|-
|-
| 39
| 3 || Usb
| RightC
|-
|-
| 40
| 4 || Embedded
| DownC
|}
|}


= AssignmentStyle =
= DigitalButton =
This is "nn::hidtypes::AssignmentStyle". This is a 32-bit flag.
This is "nn::hidtypes::DigitalButton". This is a 64-bit flag.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 8,917: Line 8,867:
|-
|-
| 0
| 0
| IsExternalAssigned
| A
|-
|-
| 1
| 1
| IsExternalLeftAssigned
| B
|-
|-
| 2
| 2
| IsExternalRightAssigned
| X
|-
|-
| 3
| 3
| IsHandheldAssigned
| Y
|-
|-
| 4
| 4
| IsHandheldLeftAssigned
| StickL
|-
|-
| 5
| 5
| IsHandheldRightAssigned
| StickR
|}
 
= FeatureType =
This is "nn::hidtypes::FeatureType". This is a 64-bit flag.
 
{| class="wikitable" border="1"
|-
|-
! Bit
| 6
! Description
| L
|-
|-
| 0
| 7
| HasLeftAnalogStick
| R
|-
|-
| 1
| 8
| HasRightAnalogStick
| ZL
|-
|-
| 2
| 9
| HasLeftSixAxisSensor
| ZR
|-
| 3
| HasRightSixAxisSensor
|-
| 4
| HasExternalSixAxisSensor
|-
| 5
| HasLeftLraVibrationDevice
|-
| 6
| HasRightLraVibrationDevice
|-
| 7
| HasGcVibrationDevice
|-
| 8
| HasErmVibrationDevice
|-
| 9
| HasLeftJoyRailBus
|-
|-
| 10
| 10
| HasRightJoyRailBus
| Start
|-
|-
| 11
| 11
| HasInternalBus
| Select
|-
|-
| 12
| 12
| HasPalmaIc
| Left
|-
|-
| 13
| 13
| HasNfc
| Up
|-
|-
| 14
| 14
| HasIrSensor
| Right
|-
|-
| 15
| 15
| IsAnalogStickCalibrationSupported
| Down
|-
|-
| 16
| 16
| IsSixAxisSensorUserCalibrationSupported
| SL
|-
|-
| 17
| 17
| HasLeftRightBattery
| SR
|-
|-
| 18
| 18
| HasStandardBattery
| Home
|-
|-
| 19
| 19
| HasBattery
| Shot
|-
|-
| 20
| 20
| HasMainColor
| StickLLeft
|-
|-
| 21
| 21
| HasSubColor
| StickLUp
|-
|-
| 22
| 22
| HasIdentificationCode
| StickLRight
|-
|-
| 23
| 23
| HasBluetoothAddress
| StickLDown
|-
|-
| 24
| 24
| HasMcu
| StickRLeft
|-
|-
| 25
| 25
| HasNotificationLed
| StickRUp
|-
|-
| 26
| 26
| HasDirectionalButtons
| StickRRight
|-
|-
| 27
| 27
| HasIndicatorLed
| StickRDown
|-
|-
| 28
| 28
| IsEmbeddedController
| Palma
|-
|-
| 29
| 29
| IsFullController
| HandheldLeftB
|-
|-
| 30
| 30
| IsLeftController
| Plus
|-
|-
| 31
| 31
| IsRightController
| Minus
|-
|-
| 32
| 32
| IsUsbHidDevice
| Z
|-
|-
| 33
| 33
| IsKuinaDevice
| LeftSL
|-
|-
| 34
| 34
| IsDirectUsbToBtSwitchingDevice
| LeftSR
|-
|-
| 35
| 35
| NormalizeAnalogStickWithInnerCross
| RightSL
|}
 
= Color =
This is "nn::hidtypes::Color".
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 36
| RightSR
|-
|-
| 0x0 || 0x4 || BodyColor
| 37
| LeftC
|-
|-
| 0x4 || 0x4 || ButtonColor
| 38
| UpC
|-
| 39
| RightC
|-
| 40
| DownC
|}
 
= AssignmentStyle =
This is "nn::hidtypes::AssignmentStyle". This is a 32-bit flag.
 
{| class="wikitable" border="1"
|-
! Bit
! Description
|-
| 0
| IsExternalAssigned
|-
| 1
| IsExternalLeftAssigned
|-
| 2
| IsExternalRightAssigned
|-
| 3
| IsHandheldAssigned
|-
| 4
| IsHandheldLeftAssigned
|-
| 5
| IsHandheldRightAssigned
|}
 
= FeatureType =
This is "nn::hidtypes::FeatureType". This is a 64-bit flag.
 
{| class="wikitable" border="1"
|-
! Bit
! Description
|-
| 0
| HasLeftAnalogStick
|-
| 1
| HasRightAnalogStick
|-
| 2
| HasLeftSixAxisSensor
|-
| 3
| HasRightSixAxisSensor
|-
| 4
| HasExternalSixAxisSensor
|-
| 5
| HasLeftLraVibrationDevice
|-
| 6
| HasRightLraVibrationDevice
|-
| 7
| HasGcVibrationDevice
|-
| 8
| HasErmVibrationDevice
|-
| 9
| HasLeftJoyRailBus
|-
| 10
| HasRightJoyRailBus
|-
| 11
| HasInternalBus
|-
| 12
| HasPalmaIc
|-
| 13
| HasNfc
|-
| 14
| HasIrSensor
|-
| 15
| IsAnalogStickCalibrationSupported
|-
| 16
| IsSixAxisSensorUserCalibrationSupported
|-
| 17
| HasLeftRightBattery
|-
| 18
| HasStandardBattery
|-
| 19
| HasBattery
|-
| 20
| HasMainColor
|-
| 21
| HasSubColor
|-
| 22
| HasIdentificationCode
|-
| 23
| HasBluetoothAddress
|-
| 24
| HasMcu
|-
| 25
| HasNotificationLed
|-
| 26
| HasDirectionalButtons
|-
| 27
| HasIndicatorLed
|-
| 28
| IsEmbeddedController
|-
| 29
| IsFullController
|-
| 30
| IsLeftController
|-
| 31
| IsRightController
|-
| 32
| IsUsbHidDevice
|-
| 33
| IsKuinaDevice
|-
| 34
| IsDirectUsbToBtSwitchingDevice
|-
| 35
| NormalizeAnalogStickWithInnerCross
|}
 
= Color =
This is "nn::hidtypes::Color".
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || BodyColor
|-
| 0x4 || 0x4 || ButtonColor
|-
|-
| 0x8 || 0x4 || LeftGripColor
| 0x8 || 0x4 || LeftGripColor
|-
|-
| 0xC || 0x4 || RightGripColor
| 0xC || 0x4 || RightGripColor
|}
 
= DeviceDescriptorType =
This is "nn::hidtypes::DeviceDescriptorType".
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x1 || [[#DeviceTypeInternal|DeviceType]]
|-
| 0x1 || 0x7 || Reserved
|-
| 0x8 || 0x8 || [[#FeatureType|FeatureType]]
|-
| 0x10 || 0x8 || [[#DigitalButton|DigitalButton]]
|-
| 0x18 || 0x4 || [[#AssignmentStyle|AssignmentStyle]]
|-
| 0x1C || 0x10 || [[#Color|DeviceColor]]
|-
| 0x2C || 0x4 || Reserved
|}
 
= DeviceDescriptionList =
This is "nn::hidtypes::detail::DeviceDescriptionList". This is a list of [[#DeviceDescriptorType|DeviceDescriptorType]] objects maintained by the hid-sysmodule.
 
{| class="wikitable" border="1"
|-
! [[#DeviceTypeInternal|DeviceType]] || [[#FeatureType|FeatureType]] || [[#DigitalButton|DigitalButton]] || [[#AssignmentStyle|AssignmentStyle]] || [[#Color|DeviceColor]]
|-
| 1 || 0x18BDBE44A || 0x18F0406AF || 0x24 || 0xFF828282, 0xFF0F0F0F, 0x00000000, 0x00000000
|-
| 2 || 0x14CDB8225 || 0x6F8F950 || 0x12 || 0xFF828282, 0xFF0F0F0F, 0x00000000, 0x00000000
|-
| 3 || 0x72BBDA073 || 0xFFCFFFF || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| 4 || 0x108000025 || 0x6F8F950 || 0x2 || 0xFF828282, 0xFF0F0F0F, 0x00000000, 0x00000000
|-
| 5 || 0x10800004A || 0x18F0406AF || 0x4 || 0xFF828282, 0xFF0F0F0F, 0x00000000, 0x00000000
|-
| 6 || 0x108800013 || 0xFFCFFFF || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| 7 || 0x108CA0000 || 0x2008FCC3 || 0x11 || 0xFF322891, 0xFFFFFFFF, 0x00000000, 0x00000000
|-
| 8 || 0x108CA0800 || 0x4F0C3 || 0x21 || 0xFF322891, 0xFFFFFFFF, 0x00000000, 0x00000000
|-
| 9 || 0x108CA0000 || 0x2008FCC3 || 0x11 || 0xFFD9D7D7, 0xFFFFFFFF, 0x00000000, 0x00000000
|-
| 10 || 0x108CA0000 || 0x4FCC3 || 0x21 || 0xFFD9D7D7, 0xFFFFFFFF, 0x00000000, 0x00000000
|-
| 11 || 0x700CC0000 || 0xFFCF || 0x0 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| 12 || 0x841011 || 0x10000010 || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| 13 || 0x83 || 0xFF0F6CF || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| 14 || 0x1 || 0xF8F950 || 0x10 || 0xFF828282, 0xFF0F0F0F, 0x00000000, 0x00000000
|-
| 15 || 0x3 || 0xFFCFFFF || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| 16 || 0x3 || 0xFFCFFFF || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| 17 || 0x1001A013 || 0xFFCFFFF || 0x8 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| 18 || 0x2 || 0xF0406AF || 0x20 || 0xFF828282, 0xFF0F0F0F, 0x00000000, 0x00000000
|-
| 19 || 0x1088DA073 || 0xFFCF3FF || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| 20 || 0x108CA0025 || 0x6F8F150 || 0x12 || 0xFF828282, 0xFF0F0F0F, 0x00000000, 0x00000000
|-
| 21 || 0x108CA604A || 0x18F0402AF || 0x24 || 0xFF828282, 0xFF0F0F0F, 0x00000000, 0x00000000
|-
| [12.0.0+] 22 || 0xF00CC8101 || 0x1E1FCF6C3 || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| [12.0.0+] 23 || 0x100000000 || 0x0 || 0x0 || 0x00000000, 0x00000000, 0x00000000, 0x00000000
|-
| [13.0.0+] 28 || 0x700CC0000 || 0xCF6CF || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|-
| [14.0.0+] 30 || 0x108800003 || 0xFFCFFFF || 0x1 || 0xFF2D2D2D, 0xFFE6E6E6, 0xFF464646, 0xFF464646
|}
 
= UnmaskFeatureDescriptorType =
This is "nn::hid::server::UnmaskFeatureDescriptorType".
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x1 || [[#DeviceTypeInternal|DeviceType]]
|-
| 0x1 || 0x1 || [[#InterfaceType|InterfaceType]]
|-
| 0x2 || 0x6 || Reserved
|-
| 0x8 || 0x8 || [[#FeatureType|FeatureType]]
|}
|}


= DeviceDescriptorType =
= UnmaskFeatureDescriptorList =
This is "nn::hidtypes::DeviceDescriptorType".
This is "nn::hid::server::UnmaskFeatureDescriptorList". This is a list of [[#UnmaskFeatureDescriptorType|UnmaskFeatureDescriptorType]] objects maintained by the hid-sysmodule.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
! [[#DeviceTypeInternal|DeviceType]] || [[#InterfaceType|InterfaceType]] || [[#FeatureType|FeatureType]]
|-
|-
| 0x0 || 0x1 || [[#DeviceTypeInternal|DeviceType]]
| 3 || 3 || 0x2000
|-
|-
| 0x1 || 0x7 || Reserved
| 2 || 2 || 0x200
|-
|-
| 0x8 || 0x8 || [[#FeatureType|FeatureType]]
| 1 || 2 || 0x400
|-
|-
| 0x10 || 0x8 || [[#DigitalButton|DigitalButton]]
| 19 || 3 || 0x2000
|-
| 0x18 || 0x4 || [[#AssignmentStyle|AssignmentStyle]]
|-
|-
| 0x1C || 0x10 || [[#Color|DeviceColor]]
| 2 || 3 || 0x200
|-
|-
| 0x2C || 0x4 || Reserved
| 1 || 3 || 0x6400
|}
 
= UnmaskFeatureDescriptorType =
This is "nn::hid::server::UnmaskFeatureDescriptorType".
 
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x1 || [[#DeviceTypeInternal|DeviceType]]
|-
| 0x1 || 0x1 || [[#InterfaceType|InterfaceType]]
|-
| 0x2 || 0x6 || Reserved
|-
| 0x8 || 0x8 || [[#FeatureType|FeatureType]]
|}
|}