HID services: Difference between revisions

(27 intermediate revisions by 3 users not shown)
Line 265: Line 265:


== SetSupportedNpadStyleSet ==
== SetSupportedNpadStyleSet ==
Takes an u32 [[#NpadStyleTag]].
Takes a PID-descriptor, an u32 [[#NpadStyleTag]], and an u64 [[AM_services|AppletResourceUserId]], no output.


== GetSupportedNpadStyleSet ==
== GetSupportedNpadStyleSet ==
Returns an u32 [[#NpadStyleTag]].
Takes a PID-descriptor and an u64 [[AM_services|AppletResourceUserId]], returns an u32 [[#NpadStyleTag]].


== SetSupportedNpadIdType ==
== SetSupportedNpadIdType ==
Line 421: Line 421:
| 7
| 7
| NpadLark
| NpadLark
| NES controller.
| NES/Famicom controller.
|-
|-
| 8
| 8
| NpadHandheldLark
| NpadHandheldLark
| NES controller in handheld mode.
| NES/Famicom controller in handheld mode.
|-
|-
| 9-28
| 9
| NpadLucia
| Unknown.
|-
| 10-28
| Reserved
| Reserved
|
|
Line 433: Line 437:
| 29
| 29
| NpadSystemExt
| NpadSystemExt
|
| Generic external controller.
|-
|-
| 30
| 30
| NpadSystem
| NpadSystem
|
| Generic controller.
|-
|-
| 31
| 31
Line 582: Line 586:
| 228 || [6.0.0+] AcquireOperationEventHandle
| 228 || [6.0.0+] AcquireOperationEventHandle
|-
|-
| 229 || [6.0.0+] ReadSerialFlash
| 229 || [6.0.0+] [[#ReadSerialFlash]]
|-
|-
| 230 || [6.0.0+] WriteSerialFlash
| 230 || [6.0.0+] WriteSerialFlash
Line 596: Line 600:
| 235 || [7.0.0+] EnableAnalogStickPower
| 235 || [7.0.0+] EnableAnalogStickPower
|-
|-
| 301 || [5.0.0+] GetAbstractedPadHandles
| 301 || [5.0.0+] [[#GetAbstractedPadHandles]]
|-
|-
| 302 || [5.0.0+] GetAbstractedPadState
| 302 || [5.0.0+] [[#GetAbstractedPadState]]
|-
|-
| 303 || [5.0.0+] GetAbstractedPadsState
| 303 || [5.0.0+] [[#GetAbstractedPadsState]]
|-
|-
| 321 || [5.0.0+] SetAutoPilotVirtualPadState
| 321 || [5.0.0+] [[#SetAutoPilotVirtualPadState]]
|-
|-
| 322 || [5.0.0+] UnsetAutoPilotVirtualPadState
| 322 || [5.0.0+] [[#UnsetAutoPilotVirtualPadState]]
|-
|-
| 323 || [5.0.0+] UnsetAllAutoPilotVirtualPadState
| 323 || [5.0.0+] [[#UnsetAllAutoPilotVirtualPadState]]
|-
|-
| 324 || [7.0.0+] [[#AttachHdlsWorkBuffer]]
| 324 || [7.0.0+] [[#AttachHdlsWorkBuffer]]
Line 670: Line 674:


Sends the spi-write subcommand to the specified controller, for writing to offset 0x6050 size 0xD. The first 3-bytes from each u32 is used for the spi-write-data, with the u8 being copied immediately afterwards the color data.
Sends the spi-write subcommand to the specified controller, for writing to offset 0x6050 size 0xD. The first 3-bytes from each u32 is used for the spi-write-data, with the u8 being copied immediately afterwards the color data.
== ReadSerialFlash ==
Takes an input TransferMemory handle, an input u32 offset, an input u64 size, and an u64 '''UniquePadId''', no output.
Reads from the specified controller's spi-flash. The input size is the original size without page-alignment. The TransferMemory permissions is RW-.
This doesn't seem to be usable?
== GetAbstractedPadHandles ==
Takes a type-0xA output buffer containing an array of u64 '''AbstractedPadHandle''' and returns an output s32 for total entries.
Returns a handle for each controller detected by the system.
== GetAbstractedPadState ==
Takes an input u64 '''AbstractedPadHandle''', returns an output [[#AbstractedPadState]].
== GetAbstractedPadsState ==
Takes a type-0xA output buffer containing an array of u64 '''AbstractedPadHandle''', a type-0x22 output buffer containing an array of [[#AbstractedPadState]], and returns an output s32 for total entries.
== SetAutoPilotVirtualPadState ==
Takes an input s8 '''AbstractedVirtualPadId''' and an input [[#AbstractedPadState]], no output.
== UnsetAutoPilotVirtualPadState ==
Takes an input s8 '''AbstractedVirtualPadId''', no output.
Clears AutoPilot state for the specified pad.
== UnsetAllAutoPilotVirtualPadState ==
No input/output.
Same as [[#UnsetAutoPilotVirtualPadState]] except this clears state for every pad.


== AttachHdlsWorkBuffer ==
== AttachHdlsWorkBuffer ==
Line 713: Line 748:
== SetHdlsState ==
== SetHdlsState ==
Takes an input [[#HdlsState]] and an input 8-byte '''HdlsHandle''', no output.
Takes an input [[#HdlsState]] and an input 8-byte '''HdlsHandle''', no output.
== 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 || Type2. See [[#HiddbgHdlsDeviceInfo]]::type2.
|-
| 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.


== HdlsNpadAssignment ==
== HdlsNpadAssignment ==
This is a 0x208-byte struct. This seems to be an array, structure unknown.
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x4 || s32 Total entries
|-
| 0x4 || 0x4 || Padding
|-
| 0x8 || 0x200(0x20*0x10) || Array of [[#HdlsNpadAssignmentEntry]].
|}
 
This is a 0x208-byte struct.
 
=== HdlsNpadAssignmentEntry ===
{| class="wikitable" border="1"
|-
! Offset || Size || Description
|-
| 0x0 || 0x8 || HdlsHandle
|-
| 0x8 || 0x4 || ?
|-
| 0xC || 0x4 || ?
|-
| 0x10 || 0x8 || ?
|-
| 0x18 || 0x1 || ?
|-
| 0x19 || 0x7 || Padding
|}
 
This is a 0x20-byte struct.


== HdlsStateList ==
== HdlsStateList ==
Line 722: Line 859:
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x4 || Total entries
| 0x0 || 0x4 || s32 Total entries
|-
|-
| 0x4 || 0x4 || Padding
| 0x4 || 0x4 || Padding
Line 754: Line 891:
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x4 || [[#NpadStyleTag]], only one bit can be set.
| 0x0 || 0x4 || Only one bit can be set, see below.
|-
|-
| 0x4 || 0x4 || RGBA Single Body Color
| 0x4 || 0x4 || RGBA Single Body Color
Line 760: Line 897:
| 0x8 || 0x4 || RGBA Single Buttons Color
| 0x8 || 0x4 || RGBA Single Buttons Color
|-
|-
| 0xC || 0x1 || Unknown
| 0xC || 0x1 || 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
| 0xD || 0x3 || Padding
Line 766: Line 903:


This is a 0x10-byte struct.
This is a 0x10-byte struct.
Bits for the above type field:
{| class="wikitable" border="1"
!  Bits
!  Description
!  Notes
|-
| 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.
|-
| 8-10
|
| Pro Controller
|-
| 11
|
| Famicom left controller
|-
| 12
|
| Famicom right controller (with microphone)
|-
| 13
|
| NES left controller
|-
| 14
|
| NES right controller
|-
| 15-16
|
| Invalid
|-
| 17
|
| Generic external controller
|-
| 18-20
|
| Invalid
|-
| 21-23
|
| Generic controller
|}


== HdlsState ==
== HdlsState ==
Line 772: Line 957:
! Offset || Size || Description
! Offset || Size || Description
|-
|-
| 0x0 || 0x8 || Unknown
| 0x0 || 0x1 || powerConnected for the main [[HID_Shared_Memory#Controllers|PowerInfo]].
|-
| 0x1 || 0x1 || ORRed with powerConnected to set the value of the first byte for the controller [[HID_Shared_Memory#Flags|flags]].
|-
| 0x2 || 0x6 || Unknown
|-
|-
| 0x8 || 0x4 || batteryCharge for the main [[HID_Shared_Memory#Controllers|PowerInfo]].
| 0x8 || 0x4 || batteryCharge for the main [[HID_Shared_Memory#Controllers|PowerInfo]].
|-
|-
| 0xC || 0x4 || Buttons
| 0xC || 0x4 || [[HID_Shared_Memory#Button_State|Buttons]]. Bit18 = HOME and bit19 = Capture.
|-
|-
| 0x10 || 0x10(4*2*2) || Joystick data, see [[HID_Shared_Memory#Controller_State]].
| 0x10 || 0x10(4*2*2) || Joystick data, see [[HID_Shared_Memory#Controller_State]].
|-
|-
| 0x20 || 0x4 || Unused
| 0x20 || 0x1 || Unused for input. Set with output from [[#DumpHdlsStates]] (zero in some cases).
|-
| 0x21 || 0x3 || Padding
|}
|}


Line 840: Line 1,031:
| 309 || [5.0.0+] GetNpadFullKeyGripColor
| 309 || [5.0.0+] GetNpadFullKeyGripColor
|-
|-
| 310 || [6.0.0+] GetMaskedSupportedNpadStyleSet
| 310 || [6.0.0+] [[#GetMaskedSupportedNpadStyleSet]]
|-
|-
| 311 || SetNpadPlayerLedBlinkingDevice
| 311 || SetNpadPlayerLedBlinkingDevice
Line 1,010: Line 1,201:
| 1150 || [8.0.0+] SetTouchScreenMagnification
| 1150 || [8.0.0+] SetTouchScreenMagnification
|}
|}
== GetMaskedSupportedNpadStyleSet ==
Takes an input u64 AppletResourceUserId, returns an output u32 [[#NpadStyleTag]].
Official sw uses the output from [[Applet_Manager_services|GetAppletResourceUserIdOfCallerApplet]] with this.


== GetUniquePadsFromNpad ==
== GetUniquePadsFromNpad ==
Line 1,214: Line 1,410:
|-
|-
| 0x35 || 0x1 || Set to value 1.
| 0x35 || 0x1 || Set to value 1.
|}
== DeviceType ==
This is a bitmask describing the controller device type.
{| class="wikitable" border="1"
!  Bits
!  Description
!  Notes
|-
| 0
| FullKey
| Pro Controller and Gc controller.
|-
| 1
|
| Unknown
|-
| 2
| HandheldLeft
| Joy-Con/Famicom/NES left controller in handheld mode.
|-
| 3
| HandheldRight
| Joy-Con/Famicom/NES right controller in handheld mode.
|-
| 4
| JoyLeft
| Joy-Con left controller.
|-
| 5
| JoyRight
| Joy-Con right controller.
|-
| 6
| Palma
| Poké Ball Plus controller.
|-
| 7
| LarkLeft (HVC)
| Famicom left controller.
|-
| 8
| LarkRight (HVC)
| Famicom right controller (with microphone).
|-
| 9
| LarkLeft (NES)
| NES left controller.
|-
| 10
| LarkRight (NES)
| NES right controller.
|-
| 11-14
|
| Reserved
|-
| 15
| SystemExt
| Generic external controller.
|-
| 16-30
|
| Reserved
|-
| 31
| System
| Generic controller.
|}
|}


Line 1,320: Line 1,585:


== GetNpadIrCameraHandle ==
== GetNpadIrCameraHandle ==
Takes an input u32. Returns an output [[#IrCameraHandle]].
Takes an input u32 NpadTypeId. Returns an output [[#IrCameraHandle]].


== RunPointingProcessor ==
== RunPointingProcessor ==
Line 1,596: Line 1,861:
     ├── NTD_4CD_2602.fts256
     ├── NTD_4CD_2602.fts256
     ├── NTD_4CD_3801.fts256
     ├── NTD_4CD_3801.fts256
     └── NTD_4CD_xxxx.fts256
     └── NTD_4CD_xxxx.fts256 [7.0.0+]


These are firmware files for the touchscreen controller.
These are firmware files for the touchscreen controller.


= Firmware update =
= Firmware update =
Starting with [[3.0.0]] HID-sysmodule now contains strings for data stored in title [[Title_list|0100000000000822]].
HID-sysmodule mounts the contents of title [[Title_list|0100000000000822]] as "systemData" or the contents of title [[Title_list|010000000000B22B]] as "systemDataD". Both titles contain the same files, but [[Title_list|0100000000000822]] is used on retail units while [[Title_list|010000000000B22B]] is used for development.
 
These titles contain the following files:
* '''ExpectVersionInfo.csv''' - List in the format "[device],[type],[version]" where "device" can be "JoyLeft", "JoyRight", "FullKey" or "Palma", "type" can be "BT", "MCU" or "USB" and "version" is the hexadecimal representation of the firmware file's version.
* '''FirmwareInfo.csv''' - List in the format "[device],[type],[version],[file]" where "device", "type" and "version" should match the values from "ExpectVersionInfo" and "file" is the name of the firmware file.
* '''ukyosakyo_ep2_ota.bin''' - Left/Right Joy-Con BT firmware.
* '''raizo_ep2_ota.bin''' - Pro Controller BT firmware.
* '''tera_ota.bin''' - Right Joy-Con MCU firmware.
* '''tera_ota_iap.bin''' - Right Joy-Con MCU (IAP profile) firmware.
* '''tera_fullkey_ota.bin''' - Pro Controller MCU firmware.
* '''tera_fullkey_ota_iap.bin''' - Pro Controller MCU (IAP profile) firmware.
* [6.0.0+] '''ProController.dfu''' - Pro Controller USB firmware.
* [6.1.0+] '''PalmaFw.bin''' - Poké Ball Plus BT firmware.


[[Category:Services]]
[[Category:Services]]