Difference between revisions of "NFC services"
(Document some nfp stuff) |
|||
Line 257: | Line 257: | ||
Takes an input bool and a [[#TestWaveType]], no output. | Takes an input bool and a [[#TestWaveType]], no output. | ||
− | = nfp:user = | + | = 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". | This is "nn::nfp::detail::IUserManager". | ||
Line 264: | Line 268: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | 0 || CreateUserInterface | + | | 0 || [[#Create*Interface|CreateUserInterface]] |
|} | |} | ||
− | == IUser == | + | === IUser === |
This is "nn::nfp::detail::IUser". | This is "nn::nfp::detail::IUser". | ||
Line 274: | Line 278: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | 0 || [[#Initialize]] | + | | 0 || [[#Initialize*|Initialize]] |
|- | |- | ||
− | | 1 || [[#Finalize]] | + | | 1 || [[#Finalize*|Finalize]] |
|- | |- | ||
| 2 || [[#ListDevices]] | | 2 || [[#ListDevices]] | ||
|- | |- | ||
− | | 3 || [[# | + | | 3 || [[#StartDetection]] |
|- | |- | ||
| 4 || [[#StopDetection]] | | 4 || [[#StopDetection]] | ||
|- | |- | ||
− | | 5 || Mount | + | | 5 || [[#Mount]] |
|- | |- | ||
− | | 6 || Unmount | + | | 6 || [[#Unmount]] |
|- | |- | ||
− | | 7 || OpenApplicationArea | + | | 7 || [[#OpenApplicationArea]] |
|- | |- | ||
− | | 8 || GetApplicationArea | + | | 8 || [[#GetApplicationArea]] |
|- | |- | ||
− | | 9 || SetApplicationArea | + | | 9 || [[#SetApplicationArea]] |
|- | |- | ||
− | | 10 || Flush | + | | 10 || [[#Flush]] |
|- | |- | ||
− | | 11 || Restore | + | | 11 || [[#Restore]] |
|- | |- | ||
− | | 12 || CreateApplicationArea | + | | 12 || [[#CreateApplicationArea]] |
|- | |- | ||
| 13 || [[#GetTagInfo]] | | 13 || [[#GetTagInfo]] | ||
|- | |- | ||
− | | 14 || GetRegisterInfo | + | | 14 || [[#GetRegisterInfo]] |
|- | |- | ||
− | | 15 || GetCommonInfo | + | | 15 || [[#GetCommonInfo]] |
|- | |- | ||
− | | 16 || GetModelInfo | + | | 16 || [[#GetModelInfo]] |
|- | |- | ||
| 17 || [[#AttachActivateEvent]] | | 17 || [[#AttachActivateEvent]] | ||
Line 318: | Line 322: | ||
| 21 || [[#GetNpadId]] | | 21 || [[#GetNpadId]] | ||
|- | |- | ||
− | | 22 || GetApplicationAreaSize | + | | 22 || [[#GetApplicationAreaSize]] |
|- | |- | ||
| 23 || [3.0.0+] [[#AttachAvailabilityChangeEvent]] | | 23 || [3.0.0+] [[#AttachAvailabilityChangeEvent]] | ||
|- | |- | ||
− | | 24 || [3.0.0+] RecreateApplicationArea | + | | 24 || [3.0.0+] [[#RecreateApplicationArea]] |
|} | |} | ||
− | == | + | == nfp:sys == |
− | + | This is "nn::nfp::detail::ISystemManager". | |
− | + | {| class="wikitable" border="1" | |
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#Create*Interface|CreateSystemInterface]] | ||
+ | |} | ||
− | + | === ISystem === | |
+ | This is "nn::nfp::detail::ISystem". | ||
− | == | + | {| class="wikitable" border="1" |
− | + | |- | |
− | + | ! Cmd || Name | |
− | + | |- | |
− | + | | 0 || [[#Initialize*|InitializeSystem]] | |
− | + | |- | |
− | + | | 1 || [[#Finalize*|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 == |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | = nfp:dbg = | ||
This is "nn::nfp::detail::IDebugManager". | This is "nn::nfp::detail::IDebugManager". | ||
Line 380: | Line 406: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | 0 || CreateDebugInterface | + | | 0 || [[#Create*Interface|CreateDebugInterface]] |
|} | |} | ||
− | == IDebug == | + | === IDebug === |
This is "nn::nfp::detail::IDebug". | This is "nn::nfp::detail::IDebug". | ||
Line 390: | Line 416: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | 0 || [[#Initialize|InitializeDebug]] | + | | 0 || [[#Initialize*|InitializeDebug]] |
|- | |- | ||
− | | 1 || [[#Finalize|FinalizeDebug]] | + | | 1 || [[#Finalize*|FinalizeDebug]] |
|- | |- | ||
| 2 || [[#ListDevices]] | | 2 || [[#ListDevices]] | ||
|- | |- | ||
− | | 3 || [[# | + | | 3 || [[#StartDetection]] |
|- | |- | ||
| 4 || [[#StopDetection]] | | 4 || [[#StopDetection]] | ||
|- | |- | ||
− | | 5 || Mount | + | | 5 || [[#Mount]] |
|- | |- | ||
− | | 6 || Unmount | + | | 6 || [[#Unmount]] |
|- | |- | ||
− | | 7 || OpenApplicationArea | + | | 7 || [[#OpenApplicationArea]] |
|- | |- | ||
− | | 8 || GetApplicationArea | + | | 8 || [[#GetApplicationArea]] |
|- | |- | ||
− | | 9 || SetApplicationArea | + | | 9 || [[#SetApplicationArea]] |
|- | |- | ||
− | | 10 || Flush | + | | 10 || [[#Flush]] |
|- | |- | ||
− | | 11 || Restore | + | | 11 || [[#Restore]] |
|- | |- | ||
− | | 12 || CreateApplicationArea | + | | 12 || [[#CreateApplicationArea]] |
|- | |- | ||
| 13 || [[#GetTagInfo]] | | 13 || [[#GetTagInfo]] | ||
|- | |- | ||
− | | 14 || GetRegisterInfo | + | | 14 || [[#GetRegisterInfo]] |
|- | |- | ||
− | | 15 || GetCommonInfo | + | | 15 || [[#GetCommonInfo]] |
|- | |- | ||
− | | 16 || GetModelInfo | + | | 16 || [[#GetModelInfo]] |
|- | |- | ||
| 17 || [[#AttachActivateEvent]] | | 17 || [[#AttachActivateEvent]] | ||
Line 434: | Line 460: | ||
| 21 || [[#GetNpadId]] | | 21 || [[#GetNpadId]] | ||
|- | |- | ||
− | | 22 || | + | | 22 || [[#GetApplicationAreaSize]] |
|- | |- | ||
| 23 || [3.0.0+] [[#AttachAvailabilityChangeEvent]] | | 23 || [3.0.0+] [[#AttachAvailabilityChangeEvent]] | ||
|- | |- | ||
− | | 24 || [3.0.0+] RecreateApplicationArea | + | | 24 || [3.0.0+] [[#RecreateApplicationArea]] |
|- | |- | ||
− | | 100 || Format | + | | 100 || [[#Format]] |
|- | |- | ||
− | | 101 || GetAdminInfo | + | | 101 || [[#GetAdminInfo]] |
|- | |- | ||
− | | 102 || | + | | 102 || [[#GetRegisterInfoPrivate]] |
|- | |- | ||
− | | 103 || | + | | 103 || [[#SetRegisterInfoPrivate]] |
|- | |- | ||
− | | 104 || DeleteRegisterInfo | + | | 104 || [[#DeleteRegisterInfo]] |
|- | |- | ||
− | | 105 || DeleteApplicationArea | + | | 105 || [[#DeleteApplicationArea]] |
|- | |- | ||
− | | 106 || ExistsApplicationArea | + | | 106 || [[#ExistsApplicationArea]] |
|- | |- | ||
| 200 || GetAll | | 200 || GetAll | ||
Line 499: | Line 525: | ||
|} | |} | ||
− | === WriteNtf === | + | ==== WriteNtf ==== |
Takes an input [[#DeviceHandle]], an u32, a type-0x5 input buffer, no output. | Takes an input [[#DeviceHandle]], an u32, a type-0x5 input buffer, no output. | ||
Line 506: | Line 532: | ||
This handles Amiibo crypto etc. | This handles Amiibo crypto etc. | ||
− | = nfp: | + | == Common == |
− | This is "nn:: | + | |
+ | === Create*Interface === | ||
+ | Returns an output interface ([[#IUser]], [[#ISystem]] or [[#IDebug]] depending on the service). | ||
+ | |||
+ | === 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. | ||
+ | |||
+ | === StopDetection === | ||
+ | Takes an input [[#DeviceHandle]], no output. | ||
+ | |||
+ | === Mount === | ||
+ | Takes an input [[#DeviceHandle]], an input [[#ModelType]] and an input [[#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". | ||
+ | |||
+ | = 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. | ||
+ | |||
+ | = State = | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Value || Description |
+ | |- | ||
+ | | 0 || NonInitialized | ||
|- | |- | ||
− | | | + | | 1 || Initialized |
|} | |} | ||
− | == | + | = DeviceState = |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Value || Description |
+ | |- | ||
+ | | 0 || Initialized | ||
+ | |- | ||
+ | | 1 || Searching for tag | ||
+ | |- | ||
+ | | 2 || Tag found | ||
+ | |- | ||
+ | | 3 || Tag removed | ||
|- | |- | ||
− | | | + | | 4 || Tag mounted |
|- | |- | ||
− | | | + | | 5 || Unavailable |
|- | |- | ||
− | | | + | | 6 || Finalized |
+ | |} | ||
+ | |||
+ | = ModelType = | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | | | + | ! Value || Description |
|- | |- | ||
− | | | + | | 0 || Amiibo |
+ | |} | ||
+ | |||
+ | = MountTarget = | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | | | + | ! Value || Description |
|- | |- | ||
− | | | + | | 1 || ROM |
|- | |- | ||
− | | | + | | 2 || RAM |
|- | |- | ||
− | | | + | | 3 || All |
+ | |} | ||
+ | |||
+ | = Date = | ||
+ | |||
+ | This is "nn::nfp::Date": | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | | | + | ! Offset || Size || Description |
|- | |- | ||
− | | | + | | 0x0 || 0x2 || Year |
|- | |- | ||
− | | | + | | 0x2 || 0x1 || Month |
|- | |- | ||
− | | | + | | 0x3 || 0x1 || Day |
+ | |} | ||
+ | |||
+ | = TagInfo = | ||
+ | This is "nn::nfp::TagInfo". This is a 0x58-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | | | + | ! 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. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | | | + | ! Offset || Size || Description |
|- | |- | ||
− | | | + | | 0x0 || 0x58 || Mii CharInfo (see mii services) |
|- | |- | ||
− | | | + | | 0x58 || 0x4 || First write date (see [[#Date]]) |
|- | |- | ||
− | | | + | | 0x5C || 0x29 || Amiibo name (NUL-terminated string) |
|- | |- | ||
− | | | + | | 0x85 || 0x1 || Unknown |
|- | |- | ||
− | | | + | | 0x86 || 0x7A || Reserved |
|} | |} | ||
− | = | + | = CommonInfo = |
− | + | This is ""nn::nfp::CommonInfo". This is a 0x40-byte struct. | |
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! 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:: | + | This is "nn::nfp::ModelInfo". This is a 0x40-byte struct. |
− | = | + | {| class="wikitable" border="1" |
− | + | |- | |
+ | ! 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 | + | This is "nn::nfp::AdminInfo". This is a 0x40-byte struct. |
− | = | + | {| class="wikitable" border="1" |
− | + | |- | |
+ | ! 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:: | + | 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. | |
− | |||
− | = | + | {| class="wikitable" border="1" |
− | + | |- | |
+ | ! 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 | ||
+ | |} | ||
− | = | + | = 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 == |
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! Game || | + | ! Game || Access ID |
+ | |- | ||
+ | | Super Smash Bros. Ultimate || 0x34F80200 | ||
|- | |- | ||
− | | | + | | Splatoon 2 || 0x10162B00 |
+ | |- | ||
+ | | The Legend of Zelda: Breath of the Wild || 0x1019C800 | ||
+ | |- | ||
+ | | The Legend of Zelda: Link's Awakening || 0x3B440400 | ||
|} | |} | ||
[[Category:Services]] | [[Category:Services]] | ||
+ | |||
+ | = 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. |
Revision as of 01:07, 31 January 2022
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".
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.
Common
Create*Interface
Returns an output interface (#IUser, #ISystem or #IDebug depending on the service).
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.
StopDetection
Takes an input #DeviceHandle, no output.
Mount
Takes an input #DeviceHandle, an input #ModelType and an input #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".
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.
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 string) |
0x85 | 0x1 | Unknown |
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 |
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 |
---|---|
Super Smash Bros. Ultimate | 0x34F80200 |
Splatoon 2 | 0x10162B00 |
The Legend of Zelda: Breath of the Wild | 0x1019C800 |
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.