Difference between revisions of "NFC services"
Narr the reg (talk | contribs) (Add Mifare ReadBlock and WriteBlock structs) |
Narr the reg (talk | contribs) |
||
Line 951: | Line 951: | ||
= NfpData = | = NfpData = | ||
This is "nn::nfp::NfpData". This is a 0x298-byte struct. | This is "nn::nfp::NfpData". This is a 0x298-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset || Size || Description | ||
+ | |- | ||
+ | | 0x0 || 0x1 || Magic (Always 0xA5) | ||
+ | |- | ||
+ | | 0x1 || 0x1 || Reserved | ||
+ | |- | ||
+ | | 0x2 || 0x1 || Write counter | ||
+ | |- | ||
+ | | 0x3 || 0x1 || Reserved | ||
+ | |- | ||
+ | | 0x4 || 0x4 || Settings CRC32 | ||
+ | |- | ||
+ | | 0x8 || 0x38 || Reserved | ||
+ | |- | ||
+ | | 0x40 || 0x40 || [[#CommonInfo]] | ||
+ | |- | ||
+ | | 0x80 || 0x5C || Mii char info V3 (see https://www.3dbrew.org/wiki/Mii#Mii_format) | ||
+ | |- | ||
+ | | 0xDC || 0x2 || Padding | ||
+ | |- | ||
+ | | 0xDE || 0x2 || Mii char info V3 CRC16 | ||
+ | |- | ||
+ | | 0xE0 || 0x8 || Mii StoreDataExtension | ||
+ | |- | ||
+ | | 0xE8 || 0x4 || First write date (see [[#Date]]) | ||
+ | |- | ||
+ | | 0xEC || 0xB * 2 || Amiibo name (NUL-terminated UTF-16 string) | ||
+ | |- | ||
+ | | 0x102 || 0x1 || Settings flags (bit4 = amiibo was initialized in console settings, bit5 = has application area) | ||
+ | |- | ||
+ | | 0x103 || 0x1 || Unknown, normally zero | ||
+ | |- | ||
+ | | 0x104 || 0x4 || Register Info CRC32 | ||
+ | |- | ||
+ | | 0x108 || 0x4 * 5 || Unknown, normally zero | ||
+ | |- | ||
+ | | 0x11c || 0x64 || Reserved | ||
+ | |- | ||
+ | | 0x180 || 0x8 || Program ID (From the Wii U, 3DS or Switch title who created the application area) | ||
+ | |- | ||
+ | | 0x188 || 0x4 || [[#Access ID]] | ||
+ | |- | ||
+ | | 0x18c || 0x2 || Settings CRC32 change counter | ||
+ | |- | ||
+ | | 0x18e || 0x1 || Font region | ||
+ | |- | ||
+ | | 0x18f || 0x1 || Tag type, hardcoded to 0x2 | ||
+ | |- | ||
+ | | 0x190 || 0x1 || Console type, (3DS = 0, Wiiu = 1, 3DSv2 = 2, switch = 3, not set = 0xFF) | ||
+ | |- | ||
+ | | 0x191 || 0x1 || (Original Program ID >> 0x24) & 0xF byte (Program ID has this byte swapped with console type) | ||
+ | |- | ||
+ | | 0x192 || 0x2E || Reserved | ||
+ | |- | ||
+ | | 0x1c0 || 0xd8 || Application area data | ||
+ | |} | ||
= BreakType = | = BreakType = |
Latest revision as of 17:02, 16 March 2023
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 services
These are used for amiibo support (nfp = Nintendo Figurine Protocol, internal name for amiibo protocol)
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 |
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 | #GetRegisterInfoPrivate |
103 | #SetRegisterInfoPrivate |
104 | #DeleteRegisterInfo |
105 | #DeleteApplicationArea |
106 | #ExistsApplicationArea |
nfp:dbg
This is "nn::nfp::detail::IDebugManager".
Cmd | Name |
---|---|
0 | CreateDebugInterface |
IDebug
This is "nn::nfp::detail::IDebug".
GetAll
Takes an input #DeviceHandle, a type-0x1A output buffer containing #NfpData, no output.
SetAll
Takes an input #DeviceHandle, a type-0x19 input buffer containing #NfpData, no output.
FlushDebug
Takes an input #DeviceHandle, no output.
BreakTag
Takes an input #DeviceHandle, an input u32 #BreakType, no output.
ReadBackupData
Takes an input #DeviceHandle, a type-0x6 output buffer, and an output u32 (read_size).
WriteBackupData
Takes an input #DeviceHandle, a type-0x5 input buffer, no output.
The buffer size must be less or equal than 0x1FBD20.
WriteNtf
Takes an input #DeviceHandle, an input u32 #WriteType, a type-0x5 input buffer, no output.
The input buffer size must match 0x2A0. This handles Amiibo crypto, etc.
Common
Create*Interface
Returns an output interface (#IUser, #ISystem or #IDebug depending on the service).
Initialize*
Takes a PID, an AppletResourceUserId, an u64 placeholder for the PID, a type-0x5 input buffer containing an array of #RequiredMcuVersionData, no output.
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.
StopDetection
Takes an input #DeviceHandle, no output.
Mount
Takes an input #DeviceHandle, an input u32 #ModelType and an input u32 #MountTarget, no output.
Unmount
Takes an input #DeviceHandle, no output.
OpenApplicationArea
Takes an input #DeviceHandle and an input u32 #Access ID, no output.
The amiibo must be already using its application area with the input access ID (the game must have already created savedata there). Result 0x10073 will be returned if no application area exists, result 0x13073 will be returned if the application area is currently used with a different access ID.
GetApplicationArea
Takes an input #DeviceHandle and a type-0x6 output buffer, returns an output u32 size.
Reads the buffer data in the application area and returns the size read from the application area.
The application area needs to be opened first.
SetApplicationArea
Takes an input #DeviceHandle and a type-0x5 input buffer, no output.
Writes the buffer data in the application area.
The application area needs to be opened first.
Flush
Takes an input #DeviceHandle, no output.
Restore
Takes an input #DeviceHandle, no output.
CreateApplicationArea
Takes an input #DeviceHandle, an input u32 #Access ID and a type-0x5 input buffer, no output.
Creates the application area with the input access ID, and writes the buffer data there.
GetTagInfo
Takes an input #DeviceHandle and a type-0x1A output buffer containing a #TagInfo.
GetRegisterInfo
Takes an input #DeviceHandle and a type-0x1A output buffer containing a #RegisterInfo.
GetCommonInfo
Takes an input #DeviceHandle and a type-0x1A output buffer containing a #CommonInfo.
GetModelInfo
Takes an input #DeviceHandle and a type-0x1A output buffer containing a #ModelInfo.
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.
GetState
Returns an output u32 #State.
GetDeviceState
Takes an input #DeviceHandle, returns an output u32 #DeviceState.
The returned state 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.
GetApplicationAreaSize
Takes an input #DeviceHandle, returns an output u32 size.
Actually returns a hardcoded value of 0xD8.
AttachAvailabilityChangeEvent
No input, returns an output Event handle.
sdknso uses EventClearMode=1.
RecreateApplicationArea
Takes an input #DeviceHandle, an input u32 #Access ID and a type-0x5 input buffer, no output.
Recreates the application area with the input access ID, and writes the buffer data there.
Format
Takes an input #DeviceHandle, no output.
GetAdminInfo
Takes an input #DeviceHandle and a type-0x1A output buffer containing a #AdminInfo.
GetRegisterInfoPrivate
Takes an input #DeviceHandle and a type-0x1A output buffer containing a #RegisterInfoPrivate.
SetRegisterInfoPrivate
Takes an input #DeviceHandle and a type-0x19 input buffer containing a #RegisterInfoPrivate.
DeleteRegisterInfo
Takes an input #DeviceHandle, no output.
DeleteApplicationArea
Takes an input #DeviceHandle, no output.
ExistsApplicationArea
Takes an input #DeviceHandle, returns an output u8/bool.
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.
TestWaveType
This is u32 enum "nn::nfc::TestWaveType".
MifareKey
This is a 0x10-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | MifareCommand |
0x1 | 0x1 | Unknown |
0x2 | 0x6 | Padding |
0x8 | 0x6 | Key data |
0xE | 0x2 | Padding |
MifareReadBlockData
This is "nn::nfc::MifareReadBlockData". This is a 0x18-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x10 | Data |
0x10 | 0x1 | Block index |
0x11 | 0x7 | Padding |
MifareReadBlockParameter
This is "nn::nfc::MifareReadBlockParameter". This is a 0x18-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | Block index |
0x1 | 0x7 | Padding |
0x8 | 0x10 | #MifareKey |
MifareWriteBlockParameter
This is "nn::nfc::MifareWriteBlockParameter". This is a 0x28-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x10 | Data |
0x10 | 0x1 | Block index |
0x11 | 0x7 | Padding |
0x18 | 0x10 | #MifareKey |
State
Value | Description |
---|---|
0 | NonInitialized |
1 | Initialized |
DeviceState
Value | Description |
---|---|
0 | Initialized |
1 | Searching for tag |
2 | Tag found |
3 | Tag removed |
4 | Tag mounted |
5 | Unavailable |
6 | Finalized |
ModelType
Value | Description |
---|---|
0 | Amiibo |
MountTarget
Value | Description |
---|---|
1 | ROM |
2 | RAM |
3 | All |
Date
This is "nn::nfp::Date":
Offset | Size | Description |
---|---|---|
0x0 | 0x2 | Year |
0x2 | 0x1 | Month |
0x3 | 0x1 | Day |
TagInfo
This is "nn::nfp::TagInfo". This is a 0x58-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0xA | UUID |
0xA | 0x1 | UUID length |
0xB | 0x15 | Reserved |
0x20 | 0x4 | Protocol |
0x24 | 0x4 | Tag type |
0x28 | 0x30 | Reserved |
RegisterInfo
This is "nn::nfp::RegisterInfo". This is a 0x100-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x58 | Mii CharInfo (see mii services) |
0x58 | 0x4 | First write date (see #Date) |
0x5C | 0x29 | Amiibo name (NUL-terminated UTF-8 string) |
0x85 | 0x1 | Font region |
0x86 | 0x7A | Reserved |
CommonInfo
This is ""nn::nfp::CommonInfo". This is a 0x40-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Last write date (see #Date) |
0x4 | 0x2 | Write counter |
0x6 | 0x1 | Version |
0x7 | 0x1 | Padding |
0x8 | 0x4 | Application area size (hardcoded to be 0xD8, like in #GetApplicationAreaSize) |
0xC | 0x34 | Reserved |
ModelInfo
This is "nn::nfp::ModelInfo". This is a 0x40-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x2 | Game and character ID |
0x2 | 0x1 | Character variant |
0x3 | 0x1 | Figure type |
0x4 | 0x2 | Model number |
0x6 | 0x1 | Series |
0x7 | 0x39 | Reserved |
AdminInfo
This is "nn::nfp::AdminInfo". This is a 0x40-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Program ID (From the Wii U, 3DS or Switch title who created the application area) |
0x8 | 0x4 | #Access ID |
0xC | 0x2 | CRC32 change counter |
0xE | 0x1 | Flags (bit0 = amiibo was initialized in console settings, bit1 = has application area, bit2/bit3 unknown) |
0xF | 0x1 | Unknown, hardcoded to 0x2 |
0x10 | 0x1 | 0xFF if there is no application area, related to the console of the application area game otherwise (0/2 = 3DS, 1 = Wii U, 3 = Switch) |
0x11 | 0x7 | Padding |
0x18 | 0x28 | Reserved |
RegisterInfoPrivate
This is "nn::nfp::RegisterInfoPrivate". This is a 0x100-byte struct.
This is almost identical to #RegisterInfo, but containing mii data as a StoreData instead of a CharInfo and more reserved bytes.
Offset | Size | Description |
---|---|---|
0x0 | 0x44 | Mii StoreData (see mii services) |
0x44 | 0x4 | First write date (see #Date) |
0x48 | 0x29 | Amiibo name (NUL-terminated string) |
0x71 | 0x1 | Unknown |
0x72 | 0x8E | Reserved |
NfpData
This is "nn::nfp::NfpData". This is a 0x298-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | Magic (Always 0xA5) |
0x1 | 0x1 | Reserved |
0x2 | 0x1 | Write counter |
0x3 | 0x1 | Reserved |
0x4 | 0x4 | Settings CRC32 |
0x8 | 0x38 | Reserved |
0x40 | 0x40 | #CommonInfo |
0x80 | 0x5C | Mii char info V3 (see https://www.3dbrew.org/wiki/Mii#Mii_format) |
0xDC | 0x2 | Padding |
0xDE | 0x2 | Mii char info V3 CRC16 |
0xE0 | 0x8 | Mii StoreDataExtension |
0xE8 | 0x4 | First write date (see #Date) |
0xEC | 0xB * 2 | Amiibo name (NUL-terminated UTF-16 string) |
0x102 | 0x1 | Settings flags (bit4 = amiibo was initialized in console settings, bit5 = has application area) |
0x103 | 0x1 | Unknown, normally zero |
0x104 | 0x4 | Register Info CRC32 |
0x108 | 0x4 * 5 | Unknown, normally zero |
0x11c | 0x64 | Reserved |
0x180 | 0x8 | Program ID (From the Wii U, 3DS or Switch title who created the application area) |
0x188 | 0x4 | #Access ID |
0x18c | 0x2 | Settings CRC32 change counter |
0x18e | 0x1 | Font region |
0x18f | 0x1 | Tag type, hardcoded to 0x2 |
0x190 | 0x1 | Console type, (3DS = 0, Wiiu = 1, 3DSv2 = 2, switch = 3, not set = 0xFF) |
0x191 | 0x1 | (Original Program ID >> 0x24) & 0xF byte (Program ID has this byte swapped with console type) |
0x192 | 0x2E | Reserved |
0x1c0 | 0xd8 | Application area data |
BreakType
This is "nn::nfp::BreakType".
Value | Description |
---|---|
0 | ? |
1 | ? |
2 | ? |
Value 0 is internally used in some places, aside for #BreakTag commands called externally.
WriteType
This is "nn::nfp::WriteType".
Value | Description |
---|---|
0 | ? |
1 | ? |
Access ID
Access IDs are game-unique u32s used to access the amiibo application area.
For a list of Nintendo 3DS access IDs, see https://www.3dbrew.org/wiki/Amiibo#Games_using_Amiibo_AppData.
Nintendo Switch titles
Game | Access ID |
---|---|
Splatoon 2 | 0x10162B00 |
Shovel Knight: Treasure Trove | 0x1016E100 |
The Legend of Zelda: Breath of the Wild | 0x1019C800 |
Super Smash Bros. Ultimate | 0x34F80200 |
Splatoon 3 | 0x38600500 |
The Legend of Zelda: Link's Awakening | 0x3B440400 |
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.