Difference between revisions of "NFC services"

From Nintendo Switch Brew
Jump to navigation Jump to search
(14 intermediate revisions by 2 users not shown)
Line 40: Line 40:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || Initialize
+
| 0 || [[#Initialize]]
 
|-
 
|-
| 1 || Finalize
+
| 1 || [[#Finalize]]
 
|-
 
|-
| 2 || ListDevices
+
| 2 || [[#ListDevices]]
 
|-
 
|-
| 3 || StartDetection
+
| 3 || [[#StartDetection_2|StartDetection]]
 
|-
 
|-
| 4 || StopDetection
+
| 4 || [[#StopDetection]]
 
|-
 
|-
| 5 || Read
+
| 5 || [[#ReadMifare|Read]]
 
|-
 
|-
| 6 || Write
+
| 6 || [[#WriteMifare|Write]]
 
|-
 
|-
| 7 || GetTagInfo
+
| 7 || [[#GetTagInfo]]
 
|-
 
|-
| 8 || GetActivateEventHandle
+
| 8 || [[#AttachActivateEvent|GetActivateEventHandle]]
 
|-
 
|-
| 9 || GetDeactivateEventHandle
+
| 9 || [[#AttachDeactivateEvent|GetDeactivateEventHandle]]
 
|-
 
|-
| 10 || GetState
+
| 10 || [[#GetState]]
 
|-
 
|-
| 11 || GetDeviceState
+
| 11 || [[#GetDeviceState]]
 
|-
 
|-
| 12 || GetNpadId
+
| 12 || [[#GetNpadId]]
 
|-
 
|-
| 13 || [3.0.0+] GetAvailabilityChangeEventHandle
+
| 13 || [3.0.0+] [[#AttachAvailabilityChangeEvent|GetAvailabilityChangeEventHandle]]
 
|}
 
|}
  
Line 86: Line 86:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || InitializeOld
+
| 0 || [[#Initialize|InitializeOld]]
 
|-
 
|-
| 1 || FinalizeOld
+
| 1 || [[#Finalize|FinalizeOld]]
 
|-
 
|-
| 2 || GetStateOld
+
| 2 || [[#GetStateOld]]
 
|-
 
|-
| 3 || IsNfcEnabledOld
+
| 3 || [[#IsNfcEnabledOld]]
 
|-
 
|-
| 400 || [4.0.0+] Initialize
+
| 400 || [4.0.0+] [[#Initialize]]
 
|-
 
|-
| 401 || [4.0.0+] Finalize
+
| 401 || [4.0.0+] [[#Finalize]]
 
|-
 
|-
| 402 || [4.0.0+] GetState
+
| 402 || [4.0.0+] [[#GetState]]
 
|-
 
|-
| 403 || [4.0.0+] IsNfcEnabled
+
| 403 || [4.0.0+] [[#IsNfcEnabled]]
 
|-
 
|-
| 404 || [4.0.0+] ListDevices
+
| 404 || [4.0.0+] [[#ListDevices]]
 
|-
 
|-
| 405 || [4.0.0+] GetDeviceState
+
| 405 || [4.0.0+] [[#GetDeviceState]]
 
|-
 
|-
| 406 || [4.0.0+] GetNpadId
+
| 406 || [4.0.0+] [[#GetNpadId]]
 
|-
 
|-
| 407 || [4.0.0+] AttachAvailabilityChangeEvent
+
| 407 || [4.0.0+] [[#AttachAvailabilityChangeEvent]]
 
|-
 
|-
| 408 || [4.0.0+] StartDetection
+
| 408 || [4.0.0+] [[#StartDetection]]
 
|-
 
|-
| 409 || [4.0.0+] StopDetection
+
| 409 || [4.0.0+] [[#StopDetection]]
 
|-
 
|-
| 410 || [4.0.0+] GetTagInfo
+
| 410 || [4.0.0+] [[#GetTagInfo]]
 
|-
 
|-
| 411 || [4.0.0+] AttachActivateEvent
+
| 411 || [4.0.0+] [[#AttachActivateEvent]]
 
|-
 
|-
| 412 || [4.0.0+] AttachDeactivateEvent
+
| 412 || [4.0.0+] [[#AttachDeactivateEvent]]
 
|-
 
|-
| 1000 || [4.0.0+] ReadMifare
+
| 1000 || [4.0.0+] [[#ReadMifare]]
 
|-
 
|-
| 1001 || [4.0.0+] WriteMifare
+
| 1001 || [4.0.0+] [[#WriteMifare]]
 
|-
 
|-
| 1300 || [4.0.0+] SendCommandByPassThrough
+
| 1300 || [4.0.0+] [[#SendCommandByPassThrough]]
 
|-
 
|-
| 1301 || [4.0.0+] KeepPassThroughSession
+
| 1301 || [4.0.0+] [[#KeepPassThroughSession]]
 
|-
 
|-
| 1302 || [4.0.0+] ReleasePassThroughSession
+
| 1302 || [4.0.0+] [[#ReleasePassThroughSession]]
 
|}
 
|}
 +
 +
=== GetStateOld ===
 +
No input, returns an output u32.
 +
 +
=== IsNfcEnabledOld ===
 +
No input, returns an output bool.
 +
 +
This runs the same code as [[#IsNfcEnabled]].
 +
 +
=== GetState ===
 +
No input, returns an output u32.
 +
 +
This replaces [[#GetStateOld]].
 +
 +
=== IsNfcEnabled ===
 +
No input, returns an output bool.
 +
 +
This replaces [[#IsNfcEnabledOld]].
 +
 +
=== StartDetection ===
 +
Takes an input [[#DeviceHandle]] and a [[#NfcProtocol]], no output.
 +
 +
=== StopDetection ===
 +
Takes an input [[#DeviceHandle]], no output.
 +
 +
=== ReadMifare ===
 +
Takes an input [[#DeviceHandle]], a type-0x6 output buffer containing an array of [[#MifareReadBlockData]], a type-0x5 input buffer containing an array of [[#MifareReadBlockParameter]], no output.
 +
 +
sdknso passes the same user-specified array-count for both buffers.
 +
 +
=== WriteMifare ===
 +
Takes an input [[#DeviceHandle]], a type-0x5 input buffer containing an array of [[#MifareWriteBlockParameter]], no output.
 +
 +
=== SendCommandByPassThrough ===
 +
Takes an input [[#DeviceHandle]], a nn::TimeSpan timeout, a type-0x6 output buffer, a type-0x5 input buffer, returns an output u32 out_size.
 +
 +
sdknso copies the output u32 into an u64. This is the actual size which was copied into the output buffer.
 +
 +
This allows using a raw NFC command. The input buffer contains the command data (id + params), and the output buffer contains the response.
 +
 +
=== KeepPassThroughSession ===
 +
Takes an input [[#DeviceHandle]], no output.
 +
 +
=== ReleasePassThroughSession ===
 +
Takes an input [[#DeviceHandle]], no output.
  
 
= nfc:sys =
 
= nfc:sys =
Line 148: Line 193:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || Initialize
+
| 0 || [[#Initialize]]
 
|-
 
|-
| 1 || Finalize
+
| 1 || [[#Finalize]]
 
|-
 
|-
| 2 || GetStateOld
+
| 2 || [[#GetStateOld]]
 
|-
 
|-
| 3 || IsNfcEnabledOld
+
| 3 || [[#IsNfcEnabledOld]]
 
|-
 
|-
| 100 || SetNfcEnabledOld
+
| 100 || [[#SetNfcEnabledOld]]
 
|-
 
|-
| 400 || [4.0.0+] InitializeSystem
+
| 400 || [4.0.0+] [[#Initialize|InitializeSystem]]
 
|-
 
|-
| 401 || [4.0.0+] FinalizeSystem
+
| 401 || [4.0.0+] [[#Finalize|FinalizeSystem]]
 
|-
 
|-
| 402 || [4.0.0+] GetState
+
| 402 || [4.0.0+] [[#GetState]]
 
|-
 
|-
| 403 || [4.0.0+] IsNfcEnabled
+
| 403 || [4.0.0+] [[#IsNfcEnabled]]
 
|-
 
|-
| 404 || [4.0.0+] ListDevices
+
| 404 || [4.0.0+] [[#ListDevices]]
 
|-
 
|-
| 405 || [4.0.0+] GetDeviceState
+
| 405 || [4.0.0+] [[#GetDeviceState]]
 
|-
 
|-
| 406 || [4.0.0+] GetNpadId
+
| 406 || [4.0.0+] [[#GetNpadId]]
 
|-
 
|-
| 407 || [4.0.0+] AttachAvailabilityChangeEvent
+
| 407 || [4.0.0+] [[#AttachAvailabilityChangeEvent]]
 
|-
 
|-
| 408 || [4.0.0+] StartDetection
+
| 408 || [4.0.0+] [[#StartDetection]]
 
|-
 
|-
| 409 || [4.0.0+] StopDetection
+
| 409 || [4.0.0+] [[#StopDetection]]
 
|-
 
|-
| 410 || [4.0.0+] GetTagInfo
+
| 410 || [4.0.0+] [[#GetTagInfo]]
 
|-
 
|-
| 411 || [4.0.0+] AttachActivateEvent
+
| 411 || [4.0.0+] [[#AttachActivateEvent]]
 
|-
 
|-
| 412 || [4.0.0+] AttachDeactivateEvent
+
| 412 || [4.0.0+] [[#AttachDeactivateEvent]]
 
|-
 
|-
| 500 || [4.0.0+] SetNfcEnabled
+
| 500 || [4.0.0+] [[#SetNfcEnabled]]
 
|-
 
|-
| 510 || [7.0.0+] OutputTestWave
+
| 510 || [7.0.0+] [[#OutputTestWave]]
 
|-
 
|-
| 1000 || [4.0.0+] ReadMifare
+
| 1000 || [4.0.0+] [[#ReadMifare]]
 
|-
 
|-
| 1001 || [4.0.0+] WriteMifare
+
| 1001 || [4.0.0+] [[#WriteMifare]]
 
|-
 
|-
| 1300 || [4.0.0+] SendCommandByPassThrough
+
| 1300 || [4.0.0+] [[#SendCommandByPassThrough]]
 
|-
 
|-
| 1301 || [4.0.0+] KeepPassThroughSession
+
| 1301 || [4.0.0+] [[#KeepPassThroughSession]]
 
|-
 
|-
| 1302 || [4.0.0+] ReleasePassThroughSession
+
| 1302 || [4.0.0+] [[#ReleasePassThroughSession]]
 
|}
 
|}
 +
 +
=== SetNfcEnabledOld ===
 +
Takes an input bool, no output.
 +
 +
This runs the same code as [[#SetNfcEnabled]].
 +
 +
=== SetNfcEnabled ===
 +
Takes an input bool, no output.
 +
 +
This replaces [[#SetNfcEnabledOld]].
 +
 +
=== OutputTestWave ===
 +
Takes an input bool and a [[#TestWaveType]], no output.
  
 
= nfp:user =
 
= nfp:user =
Line 216: Line 274:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || Initialize
+
| 0 || [[#Initialize]]
 
|-
 
|-
| 1 || Finalize
+
| 1 || [[#Finalize]]
 
|-
 
|-
| 2 || ListDevices
+
| 2 || [[#ListDevices]]
 
|-
 
|-
| 3 || StartDetection
+
| 3 || [[#StartDetection_2|StartDetection]]
 
|-
 
|-
| 4 || StopDetection
+
| 4 || [[#StopDetection]]
 
|-
 
|-
 
| 5 || Mount
 
| 5 || Mount
Line 242: Line 300:
 
| 12 || CreateApplicationArea
 
| 12 || CreateApplicationArea
 
|-
 
|-
| 13 || GetTagInfo
+
| 13 || [[#GetTagInfo]]
 
|-
 
|-
 
| 14 || GetRegisterInfo
 
| 14 || GetRegisterInfo
Line 250: Line 308:
 
| 16 || GetModelInfo
 
| 16 || GetModelInfo
 
|-
 
|-
| 17 || AttachActivateEvent
+
| 17 || [[#AttachActivateEvent]]
 
|-
 
|-
| 18 || AttachDeactivateEvent
+
| 18 || [[#AttachDeactivateEvent]]
 
|-
 
|-
| 19 || GetState
+
| 19 || [[#GetState]]
 
|-
 
|-
| 20 || GetDeviceState
+
| 20 || [[#GetDeviceState]]
 
|-
 
|-
| 21 || GetNpadId
+
| 21 || [[#GetNpadId]]
 
|-
 
|-
| 22 || GetApplicationArea2
+
| 22 || GetApplicationAreaSize
 
|-
 
|-
| 23 || [3.0.0+] AttachAvailabilityChangeEvent
+
| 23 || [3.0.0+] [[#AttachAvailabilityChangeEvent]]
 
|-
 
|-
 
| 24 || [3.0.0+] RecreateApplicationArea
 
| 24 || [3.0.0+] RecreateApplicationArea
 
|}
 
|}
 +
 +
=== Initialize ===
 +
Takes a PID, an [[AM_services|AppletResourceUserId]], an u64, a type-0x5 input buffer containing an array of [[#RequiredMcuVersionData]], no output.
 +
 +
sdknso passes value 0 for the u64.
 +
 +
Internally this is mostly the same for each service, this differs depending on the service/cmd however.
 +
 +
=== Finalize ===
 +
No input/output.
 +
 +
Internally this is mostly the same for each service, this differs depending on the service/cmd however.
 +
 +
=== ListDevices ===
 +
Takes a type-0xA output buffer containing an array of [[#DeviceHandle]], returns an output s32 total_out.
 +
 +
This can return a maximum of 0xA entries.
 +
 +
=== StartDetection ===
 +
Takes an input [[#DeviceHandle]], no output.
 +
 +
This runs the same code as nfc [[#StartDetection]] with [[#NfcProtocol]] = -1.
 +
 +
=== GetTagInfo ===
 +
Takes an input [[#DeviceHandle]] and a type-0x1A output buffer containing a [[#TagInfo]].
 +
 +
=== AttachActivateEvent ===
 +
Takes an input [[#DeviceHandle]], returns an output Event handle.
 +
 +
sdknso uses EventClearMode=1.
 +
 +
=== AttachDeactivateEvent ===
 +
Takes an input [[#DeviceHandle]], returns an output Event handle.
 +
 +
sdknso uses EventClearMode=1.
 +
 +
=== GetDeviceState ===
 +
Takes an input [[#DeviceHandle]], returns an output u32.
 +
 +
The returned u32 is loaded from a lookup table. nfp services uses the same table, mifare uses a separate one, and the nfc services use another separate table.
 +
 +
=== GetNpadId ===
 +
Takes an input [[#DeviceHandle]], returns an output u32 NpadId.
 +
 +
=== AttachAvailabilityChangeEvent ===
 +
No input, returns an output Event handle.
 +
 +
sdknso uses EventClearMode=1.
  
 
= nfp:dbg =
 
= nfp:dbg =
Line 284: Line 390:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || InitializeDebug
+
| 0 || [[#Initialize|InitializeDebug]]
 
|-
 
|-
| 1 || FinalizeDebug
+
| 1 || [[#Finalize|FinalizeDebug]]
 
|-
 
|-
| 2 || ListDevices
+
| 2 || [[#ListDevices]]
 
|-
 
|-
| 3 || StartDetection
+
| 3 || [[#StartDetection_2|StartDetection]]
 
|-
 
|-
| 4 || StopDetection
+
| 4 || [[#StopDetection]]
 
|-
 
|-
 
| 5 || Mount
 
| 5 || Mount
Line 310: Line 416:
 
| 12 || CreateApplicationArea
 
| 12 || CreateApplicationArea
 
|-
 
|-
| 13 || GetTagInfo
+
| 13 || [[#GetTagInfo]]
 
|-
 
|-
 
| 14 || GetRegisterInfo
 
| 14 || GetRegisterInfo
Line 318: Line 424:
 
| 16 || GetModelInfo
 
| 16 || GetModelInfo
 
|-
 
|-
| 17 || AttachActivateEvent
+
| 17 || [[#AttachActivateEvent]]
 
|-
 
|-
| 18 || AttachDeactivateEvent
+
| 18 || [[#AttachDeactivateEvent]]
 
|-
 
|-
| 19 || GetState
+
| 19 || [[#GetState]]
 
|-
 
|-
| 20 || GetDeviceState
+
| 20 || [[#GetDeviceState]]
 
|-
 
|-
| 21 || GetNpadId
+
| 21 || [[#GetNpadId]]
 
|-
 
|-
 
| 22 || GetApplicationArea2
 
| 22 || GetApplicationArea2
 
|-
 
|-
| 23 || [3.0.0+] AttachAvailabilityChangeEvent
+
| 23 || [3.0.0+] [[#AttachAvailabilityChangeEvent]]
 
|-
 
|-
 
| 24 || [3.0.0+] RecreateApplicationArea
 
| 24 || [3.0.0+] RecreateApplicationArea
Line 360: Line 466:
 
| 205 || WriteBackupData
 
| 205 || WriteBackupData
 
|-
 
|-
| 206 || WriteNtf
+
| 206 || [[#WriteNtf]]
 
|-
 
|-
 
| 300 || [3.0.0-3.0.2]
 
| 300 || [3.0.0-3.0.2]
Line 392: Line 498:
 
| 314 || [3.0.0-3.0.2]
 
| 314 || [3.0.0-3.0.2]
 
|}
 
|}
 +
 +
=== WriteNtf ===
 +
Takes an input [[#DeviceHandle]], an u32, a type-0x5 input buffer, no output.
 +
 +
The input buffer size must match 0x2A0.
 +
 +
This handles Amiibo crypto etc.
  
 
= nfp:sys =
 
= nfp:sys =
Line 410: Line 523:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || InitializeSystem
+
| 0 || [[#Initialize|InitializeSystem]]
 
|-
 
|-
| 1 || FinalizeSystem
+
| 1 || [[#Finalize|FinalizeSystem]]
 
|-
 
|-
| 2 || ListDevices
+
| 2 || [[#ListDevices]]
 
|-
 
|-
| 3 || StartDetection
+
| 3 || [[#StartDetection_2|StartDetection]]
 
|-
 
|-
| 4 || StopDetection
+
| 4 || [[#StopDetection]]
 
|-
 
|-
 
| 5 || Mount
 
| 5 || Mount
Line 428: Line 541:
 
| 11 || Restore
 
| 11 || Restore
 
|-
 
|-
| 13 || GetTagInfo
+
| 13 || [[#GetTagInfo]]
 
|-
 
|-
 
| 14 || GetRegisterInfo
 
| 14 || GetRegisterInfo
Line 436: Line 549:
 
| 16 || GetModelInfo
 
| 16 || GetModelInfo
 
|-
 
|-
| 17 || AttachActivateEvent
+
| 17 || [[#AttachActivateEvent]]
 
|-
 
|-
| 18 || AttachDeactivateEvent
+
| 18 || [[#AttachDeactivateEvent]]
 
|-
 
|-
| 19 || GetState
+
| 19 || [[#GetState]]
 
|-
 
|-
| 20 || GetDeviceState
+
| 20 || [[#GetDeviceState]]
 
|-
 
|-
| 21 || GetNpadId
+
| 21 || [[#GetNpadId]]
 
|-
 
|-
| 23 || [3.0.0+] AttachAvailabilityChangeEvent
+
| 23 || [3.0.0+] [[#AttachAvailabilityChangeEvent]]
 
|-
 
|-
 
| 100 || Format
 
| 100 || Format
Line 462: Line 575:
 
| 106 || ExistsApplicationArea
 
| 106 || ExistsApplicationArea
 
|}
 
|}
 +
 +
= RequiredMcuVersionData =
 +
In sdknso, the global data containing the array data for this is "nn::nfc::client::RequiredMcuVersionData". The array entry is 0x20-bytes.
 +
 +
= DeviceHandle =
 +
This is "nn::nfc::DeviceHandle". This is a 8-byte struct with 4-byte alignment.
 +
 +
= NfcProtocol =
 +
This is s32 enum "nn::nfc::NfcProtocol". Value -1 can be used as a default.
 +
 +
= TagInfo =
 +
This is "nn::nfc::TagInfo" / "nn::nfp::TagInfo". This is a 0x58-byte struct.
 +
 +
= TestWaveType =
 +
This is u32 enum "nn::nfc::TestWaveType".
 +
 +
= MifareReadBlockData =
 +
This is "nn::nfc::MifareReadBlockData". This is a 0x18-byte struct.
 +
 +
= MifareReadBlockParameter =
 +
This is "nn::nfc::MifareReadBlockParameter". This is a 0x18-byte struct.
 +
 +
= MifareWriteBlockParameter =
 +
This is "nn::nfc::MifareWriteBlockParameter". This is a 0x28-byte struct.
  
 
= RomFS =
 
= RomFS =

Revision as of 03:10, 1 December 2021

nfc:am

This is "nn::nfc::am::detail::IAmManager".

Cmd Name
0 CreateAmInterface

IAm

This is "nn::nfc::am::detail::IAm".

Cmd Name
0 Initialize
1 Finalize
2 NotifyForegroundApplet

nfc:mf:u

This is "nn::nfc::mifare::detail::IUserManager".

Cmd Name
0 CreateUserInterface

IUser

This is "nn::nfc::mifare::detail::IUser".

Cmd Name
0 #Initialize
1 #Finalize
2 #ListDevices
3 StartDetection
4 #StopDetection
5 Read
6 Write
7 #GetTagInfo
8 GetActivateEventHandle
9 GetDeactivateEventHandle
10 #GetState
11 #GetDeviceState
12 #GetNpadId
13 [3.0.0+] GetAvailabilityChangeEventHandle

nfc:user

This is "nn::nfc::detail::IUserManager".

Cmd Name
0 CreateUserInterface

IUser

This is "nn::nfc::detail::IUser".

Cmd Name
0 InitializeOld
1 FinalizeOld
2 #GetStateOld
3 #IsNfcEnabledOld
400 [4.0.0+] #Initialize
401 [4.0.0+] #Finalize
402 [4.0.0+] #GetState
403 [4.0.0+] #IsNfcEnabled
404 [4.0.0+] #ListDevices
405 [4.0.0+] #GetDeviceState
406 [4.0.0+] #GetNpadId
407 [4.0.0+] #AttachAvailabilityChangeEvent
408 [4.0.0+] #StartDetection
409 [4.0.0+] #StopDetection
410 [4.0.0+] #GetTagInfo
411 [4.0.0+] #AttachActivateEvent
412 [4.0.0+] #AttachDeactivateEvent
1000 [4.0.0+] #ReadMifare
1001 [4.0.0+] #WriteMifare
1300 [4.0.0+] #SendCommandByPassThrough
1301 [4.0.0+] #KeepPassThroughSession
1302 [4.0.0+] #ReleasePassThroughSession

GetStateOld

No input, returns an output u32.

IsNfcEnabledOld

No input, returns an output bool.

This runs the same code as #IsNfcEnabled.

GetState

No input, returns an output u32.

This replaces #GetStateOld.

IsNfcEnabled

No input, returns an output bool.

This replaces #IsNfcEnabledOld.

StartDetection

Takes an input #DeviceHandle and a #NfcProtocol, no output.

StopDetection

Takes an input #DeviceHandle, no output.

ReadMifare

Takes an input #DeviceHandle, a type-0x6 output buffer containing an array of #MifareReadBlockData, a type-0x5 input buffer containing an array of #MifareReadBlockParameter, no output.

sdknso passes the same user-specified array-count for both buffers.

WriteMifare

Takes an input #DeviceHandle, a type-0x5 input buffer containing an array of #MifareWriteBlockParameter, no output.

SendCommandByPassThrough

Takes an input #DeviceHandle, a nn::TimeSpan timeout, a type-0x6 output buffer, a type-0x5 input buffer, returns an output u32 out_size.

sdknso copies the output u32 into an u64. This is the actual size which was copied into the output buffer.

This allows using a raw NFC command. The input buffer contains the command data (id + params), and the output buffer contains the response.

KeepPassThroughSession

Takes an input #DeviceHandle, no output.

ReleasePassThroughSession

Takes an input #DeviceHandle, no output.

nfc:sys

This is "nn::nfc::detail::ISystemManager".

Cmd Name
0 CreateSystemInterface

ISystem

This is "nn::nfc::detail::ISystem".

Cmd Name
0 #Initialize
1 #Finalize
2 #GetStateOld
3 #IsNfcEnabledOld
100 #SetNfcEnabledOld
400 [4.0.0+] InitializeSystem
401 [4.0.0+] FinalizeSystem
402 [4.0.0+] #GetState
403 [4.0.0+] #IsNfcEnabled
404 [4.0.0+] #ListDevices
405 [4.0.0+] #GetDeviceState
406 [4.0.0+] #GetNpadId
407 [4.0.0+] #AttachAvailabilityChangeEvent
408 [4.0.0+] #StartDetection
409 [4.0.0+] #StopDetection
410 [4.0.0+] #GetTagInfo
411 [4.0.0+] #AttachActivateEvent
412 [4.0.0+] #AttachDeactivateEvent
500 [4.0.0+] #SetNfcEnabled
510 [7.0.0+] #OutputTestWave
1000 [4.0.0+] #ReadMifare
1001 [4.0.0+] #WriteMifare
1300 [4.0.0+] #SendCommandByPassThrough
1301 [4.0.0+] #KeepPassThroughSession
1302 [4.0.0+] #ReleasePassThroughSession

SetNfcEnabledOld

Takes an input bool, no output.

This runs the same code as #SetNfcEnabled.

SetNfcEnabled

Takes an input bool, no output.

This replaces #SetNfcEnabledOld.

OutputTestWave

Takes an input bool and a #TestWaveType, no output.

nfp:user

This is "nn::nfp::detail::IUserManager".

Cmd Name
0 CreateUserInterface

IUser

This is "nn::nfp::detail::IUser".

Cmd Name
0 #Initialize
1 #Finalize
2 #ListDevices
3 StartDetection
4 #StopDetection
5 Mount
6 Unmount
7 OpenApplicationArea
8 GetApplicationArea
9 SetApplicationArea
10 Flush
11 Restore
12 CreateApplicationArea
13 #GetTagInfo
14 GetRegisterInfo
15 GetCommonInfo
16 GetModelInfo
17 #AttachActivateEvent
18 #AttachDeactivateEvent
19 #GetState
20 #GetDeviceState
21 #GetNpadId
22 GetApplicationAreaSize
23 [3.0.0+] #AttachAvailabilityChangeEvent
24 [3.0.0+] RecreateApplicationArea

Initialize

Takes a PID, an AppletResourceUserId, an u64, a type-0x5 input buffer containing an array of #RequiredMcuVersionData, no output.

sdknso passes value 0 for the u64.

Internally this is mostly the same for each service, this differs depending on the service/cmd however.

Finalize

No input/output.

Internally this is mostly the same for each service, this differs depending on the service/cmd however.

ListDevices

Takes a type-0xA output buffer containing an array of #DeviceHandle, returns an output s32 total_out.

This can return a maximum of 0xA entries.

StartDetection

Takes an input #DeviceHandle, no output.

This runs the same code as nfc #StartDetection with #NfcProtocol = -1.

GetTagInfo

Takes an input #DeviceHandle and a type-0x1A output buffer containing a #TagInfo.

AttachActivateEvent

Takes an input #DeviceHandle, returns an output Event handle.

sdknso uses EventClearMode=1.

AttachDeactivateEvent

Takes an input #DeviceHandle, returns an output Event handle.

sdknso uses EventClearMode=1.

GetDeviceState

Takes an input #DeviceHandle, returns an output u32.

The returned u32 is loaded from a lookup table. nfp services uses the same table, mifare uses a separate one, and the nfc services use another separate table.

GetNpadId

Takes an input #DeviceHandle, returns an output u32 NpadId.

AttachAvailabilityChangeEvent

No input, returns an output Event handle.

sdknso uses EventClearMode=1.

nfp:dbg

This is "nn::nfp::detail::IDebugManager".

Cmd Name
0 CreateDebugInterface

IDebug

This is "nn::nfp::detail::IDebug".

Cmd Name
0 InitializeDebug
1 FinalizeDebug
2 #ListDevices
3 StartDetection
4 #StopDetection
5 Mount
6 Unmount
7 OpenApplicationArea
8 GetApplicationArea
9 SetApplicationArea
10 Flush
11 Restore
12 CreateApplicationArea
13 #GetTagInfo
14 GetRegisterInfo
15 GetCommonInfo
16 GetModelInfo
17 #AttachActivateEvent
18 #AttachDeactivateEvent
19 #GetState
20 #GetDeviceState
21 #GetNpadId
22 GetApplicationArea2
23 [3.0.0+] #AttachAvailabilityChangeEvent
24 [3.0.0+] RecreateApplicationArea
100 Format
101 GetAdminInfo
102 GetRegisterInfo
103 SetRegisterInfo
104 DeleteRegisterInfo
105 DeleteApplicationArea
106 ExistsApplicationArea
200 GetAll
201 SetAll
202 FlushDebug
203 BreakTag
204 ReadBackupData
205 WriteBackupData
206 #WriteNtf
300 [3.0.0-3.0.2]
301 [3.0.0-3.0.2]
302 [3.0.0-3.0.2]
303 [3.0.0-3.0.2]
304 [3.0.0-3.0.2]
305 [3.0.0-3.0.2]
306 [3.0.0-3.0.2]
307 [3.0.0-3.0.2]
308 [3.0.0-3.0.2]
309 [3.0.0-3.0.2]
310 [3.0.0-3.0.2]
311 [3.0.0-3.0.2]
312 [3.0.0-3.0.2]
313 [3.0.0-3.0.2]
314 [3.0.0-3.0.2]

WriteNtf

Takes an input #DeviceHandle, an u32, a type-0x5 input buffer, no output.

The input buffer size must match 0x2A0.

This handles Amiibo crypto etc.

nfp:sys

This is "nn::nfp::detail::ISystemManager".

Cmd Name
0 CreateSystemInterface

ISystem

This is "nn::nfp::detail::ISystem".

Cmd Name
0 InitializeSystem
1 FinalizeSystem
2 #ListDevices
3 StartDetection
4 #StopDetection
5 Mount
6 Unmount
10 Flush
11 Restore
13 #GetTagInfo
14 GetRegisterInfo
15 GetCommonInfo
16 GetModelInfo
17 #AttachActivateEvent
18 #AttachDeactivateEvent
19 #GetState
20 #GetDeviceState
21 #GetNpadId
23 [3.0.0+] #AttachAvailabilityChangeEvent
100 Format
101 GetAdminInfo
102 GetRegisterInfo
103 SetRegisterInfo
104 DeleteRegisterInfo
105 DeleteApplicationArea
106 ExistsApplicationArea

RequiredMcuVersionData

In sdknso, the global data containing the array data for this is "nn::nfc::client::RequiredMcuVersionData". The array entry is 0x20-bytes.

DeviceHandle

This is "nn::nfc::DeviceHandle". This is a 8-byte struct with 4-byte alignment.

NfcProtocol

This is s32 enum "nn::nfc::NfcProtocol". Value -1 can be used as a default.

TagInfo

This is "nn::nfc::TagInfo" / "nn::nfp::TagInfo". This is a 0x58-byte struct.

TestWaveType

This is u32 enum "nn::nfc::TestWaveType".

MifareReadBlockData

This is "nn::nfc::MifareReadBlockData". This is a 0x18-byte struct.

MifareReadBlockParameter

This is "nn::nfc::MifareReadBlockParameter". This is a 0x18-byte struct.

MifareWriteBlockParameter

This is "nn::nfc::MifareWriteBlockParameter". This is a 0x28-byte struct.

RomFS

[9.0.0+] The nfc-sysmodule RomFS contains:

 ST21NFCD_01_05_6811.bin

These are firmware files for the NFC IC inside Switch Lite units.

Application IDs

Application IDs (also referenced as "access_id" in official software) are game-unique u32s used to access the amiibo 0xd8-big application area.

Game AppID
Super Smash Bros. Ultimate 0x34f80200