Difference between revisions of "Controller Applet"

From Nintendo Switch Brew
Jump to: navigation, search
Line 39: Line 39:
 
| 0xB || 0x1 || <code>nn::hid::system::ControllerSupportCaller</code>. Always zero except with ShowControllerFirmwareUpdateForSystem, which sets this to the input param.
 
| 0xB || 0x1 || <code>nn::hid::system::ControllerSupportCaller</code>. Always zero except with ShowControllerFirmwareUpdateForSystem, which sets this to the input param.
 
|-
 
|-
| 0xC || 0x4 || Output from [[HID_services#GetSupportedNpadStyleSet|GetSupportedNpadStyleSet]].
+
| 0xC || 0x4 || Output from [[HID_services#GetSupportedNpadStyleSet|GetSupportedNpadStyleSet]]. With ShowControllerSupportForSystem on pre-3.0.0 this is value 0.
 
|-
 
|-
| 0x10 || 0x4 || Output from [[HID_services|GetNpadJoyHoldType]].
+
| 0x10 || 0x4 || Output from [[HID_services|GetNpadJoyHoldType]]. With ShowControllerSupportForSystem on pre-3.0.0 this is value 1.
 
|}
 
|}
  
Line 87: Line 87:
 
| [3.0.0+] ShowControllerFirmwareUpdate || 2 ||  
 
| [3.0.0+] ShowControllerFirmwareUpdate || 2 ||  
 
|}
 
|}
 +
 +
In sdknso there's two funcs which expose ShowControllerSupport: one which has a param for the output [[#ControllerSupportResultInfo]], and one that saves that to stack and ignores it.
 +
 +
ShowControllerSupportForSystem has equivalent funcs for the above two funcs, which are the same except [[#ControllerSupportArgPrivate|Flag1]] is set to 1 and [[#ControllerSupportArgPrivate|Flag0]] is set to the input bool.
 +
 +
ShowControllerFirmwareUpdateForSystem is the same as ShowControllerFirmwareUpdate, except [[#ControllerSupportArgPrivate|Flag1]] is set to 1 and [[#ControllerSupportArgPrivate|ControllerSupportCaller]] is set to the input param.
  
 
== ControllerSupportResultInfo ==
 
== ControllerSupportResultInfo ==

Revision as of 01:39, 27 November 2019

This is the controller applet which can be launched by Home Menu. Official sw uses this under nn::hid, and nn::hid::system with the "ForSystem" funcs. See AM_services#Library_Applets.

Library Applet Versions

System Version Value
[1.0.0+] 0x3
[3.0.0+] 0x4
[6.0.0+] 0x5
[8.0.0+] 0x7

ControllerSupportArgPrivate

This is "nn::hid::system::ControllerSupportArgPrivate". This is a 0x14-byte struct pushed for input storage. The data here is setup by sdknso internally without exposing it to the user.

PlayStartupSound is set to (Flag1 != 0) & (Flag0 != 0). Flag0/Flag1 are always 0 except with *ForSystem funcs in sdknso.

Offset Size Description
0x0 0x4 Size of this ControllerSupportArgPrivate struct.
0x4 0x4 Size of the storage following this one (#ControllerSupportArg or #ControllerFirmwareUpdateArg).
0x8 0x1 Flag0
0x9 0x1 Flag1
0xA 0x1 #Type
0xB 0x1 nn::hid::system::ControllerSupportCaller. Always zero except with ShowControllerFirmwareUpdateForSystem, which sets this to the input param.
0xC 0x4 Output from GetSupportedNpadStyleSet. With ShowControllerSupportForSystem on pre-3.0.0 this is value 0.
0x10 0x4 Output from GetNpadJoyHoldType. With ShowControllerSupportForSystem on pre-3.0.0 this is value 1.

ControllerSupportArg

This is "nn::hid::ControllerSupportArg". This is a 0x21C-byte (0x430-byte with version 0x7) struct pushed for input storage.

Layout with the original version:

Offset Size Description
0x0 0x18 ?

Layout starting with version 0x7:

Offset Size Description
0x0 0x28 ?

With both versions, the rest of the struct is an array containing 0x81-byte entries. With the original version there's 4 entries allocated, starting with version 0x7 there's 8 entries allocated. This contains the ExplainText string which includes the NUL-terminator. Each entry corresponds to a controller NpadId, starting with NpadId/controller 0.

Regardless of version, the default data for this struct is setup by setting u32 +0 to 0x01010400, u8 +4 to 0x1, with the rest being cleared as needed. sdknso itself only calls the func for this from ShowControllerStrapGuide, since that's the only time sdknso itself writes to ControllerSupportArg besides ExplainText (and is also the only case where the ControllerSupportArg is not user-specified).

ControllerFirmwareUpdateArg

This is "nn::hid::ControllerFirmwareUpdateArg". This is a 4-byte struct pushed for the input storage. The default value is 0.

Type

Name Type value Description
ShowControllerSupport 0
[3.0.0+] ShowControllerStrapGuide 1
[3.0.0+] ShowControllerFirmwareUpdate 2

In sdknso there's two funcs which expose ShowControllerSupport: one which has a param for the output #ControllerSupportResultInfo, and one that saves that to stack and ignores it.

ShowControllerSupportForSystem has equivalent funcs for the above two funcs, which are the same except Flag1 is set to 1 and Flag0 is set to the input bool.

ShowControllerFirmwareUpdateForSystem is the same as ShowControllerFirmwareUpdate, except Flag1 is set to 1 and ControllerSupportCaller is set to the input param.

ControllerSupportResultInfo

This is "nn::hid::ControllerSupportResultInfo". This is a 8-byte struct.

Usage

User-processes should push a common arguments struct, an #ControllerSupportArgPrivate, then #ControllerSupportArg or #ControllerFirmwareUpdateArg.

On success, an output storage should be popped, with size 0xC being used to read from there (sdknso ignores the actual storage size). When #ControllerSupportArg was previously used, the first 8-bytes are copied to the output #ControllerSupportResultInfo (which the user can ignore), otherwise it's ignored. The remaining u32 determines the Result: