Line 3: |
Line 3: |
| On New3DS NFC module uses the [[I2C_Registers|NFC]] hardware via the [[I2C_Services|i2c::NFC]] and [[GPIO_Services|gpio:NFC]] services. On Old3DS NFC module communicates with a NFC peripheral via IR with the IRUSER service. | | On New3DS NFC module uses the [[I2C_Registers|NFC]] hardware via the [[I2C_Services|i2c::NFC]] and [[GPIO_Services|gpio:NFC]] services. On Old3DS NFC module communicates with a NFC peripheral via IR with the IRUSER service. |
| | | |
− | A total of 6 sessions can be open simultaneously for all of these services combined.
| + | Only 1 session can be open for all of these services combined. Commands for each service are handled by the main-thread. |
| | | |
| =NFC services= | | =NFC services= |
Line 26: |
Line 26: |
| | u32 unknownA, u32 unknownB, u32 unknownC, u32 (sizeof(*buffer) << 14 <nowiki>|</nowiki> 0x402), void * buffer | | | u32 unknownA, u32 unknownB, u32 unknownC, u32 (sizeof(*buffer) << 14 <nowiki>|</nowiki> 0x402), void * buffer |
| | s32 result | | | s32 result |
− | | | + | | Used when resetting an amiibo from amiibo Settings. |
| |- | | |- |
| | 0x04020000 | | | 0x04020000 |
| | [[9.3.0-21|9.3.0-X]] | | | [[9.3.0-21|9.3.0-X]] |
− | | ??? | + | | [[NFCM:GetAdminInfo|GetAdminInfo]] |
− | | void | + | | |
− | | s32 result, u32 unknownA[16] | + | | |
− | | Output seems to be a struct | + | | |
| |- | | |- |
| | 0x04030000 | | | 0x04030000 |
| | [[9.3.0-21|9.3.0-X]] | | | [[9.3.0-21|9.3.0-X]] |
− | | ??? | + | | [[NFCM:GetEmptyRegisterInfo|GetEmptyRegisterInfo]] |
− | | void | + | | |
− | | s32 result, u32 unknownA[41] | + | | |
| | | | | |
| |- | | |- |
| | 0x04040A40 | | | 0x04040A40 |
| | [[9.3.0-21|9.3.0-X]] | | | [[9.3.0-21|9.3.0-X]] |
− | | [[NFCM:SetAmiiboSettings|SetAmiiboSettings]] | + | | [[NFCM:SetRegisterInfo|SetRegisterInfo]] |
− | | | + | | |
− | | | + | | |
| + | | |
| + | |- |
| + | | 0x04050000 |
| + | | [[9.3.0-21|9.3.0-X]] |
| + | | [[NFCM:DeleteRegisterInfo|DeleteRegisterInfo]] |
| + | | |
| + | | |
| | | | | |
| |- | | |- |
| | 0x04060000 | | | 0x04060000 |
| | [[9.3.0-21|9.3.0-X]] | | | [[9.3.0-21|9.3.0-X]] |
− | | ??? | + | | [[NFCM:DeleteApplicationArea|DeleteApplicationArea]] |
− | | void | + | | |
− | | s32 result | + | | |
| | | | | |
| |- | | |- |
| | 0x04070000 | | | 0x04070000 |
| | [[9.3.0-21|9.3.0-X]] | | | [[9.3.0-21|9.3.0-X]] |
− | | ??? | + | | [[NFCM:ExistsApplicationArea|ExistsApplicationArea]] |
− | | void | + | | |
− | | s32 result, u32 unknownA | + | | |
| | | | | |
| |- | | |- |
Line 102: |
Line 109: |
| | | |
| ==NFC development service "nfc:dev"== | | ==NFC development service "nfc:dev"== |
− | This service seems to be intended for use only on dev-units(or at least some of the command(s)).
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Command header |
| + | ! Available since system-version |
| + | ! Description |
| + | |- |
| + | | 0x00110100 |
| + | | |
| + | | [[NFCDEV:ReadRawPages|ReadRawPages]] |
| + | |- |
| + | | 0x001200C0 |
| + | | |
| + | | [[NFCDEV:WriteRawPage|WriteRawPage]] |
| + | |} |
| + | |
| + | Some of these commands seems to be intended for use only on dev-units. |
| | | |
| Unlike the New3DS NFC-module, at least some of these commands are stubbed in the Old3DS NFC-module(only returns an error). | | Unlike the New3DS NFC-module, at least some of these commands are stubbed in the Old3DS NFC-module(only returns an error). |
| | | |
| ==NFC service "nfc:p"== | | ==NFC service "nfc:p"== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Command header |
| + | ! Available since system-version |
| + | ! Description |
| + | |- |
| + | | 0x00010000 |
| + | | |
| + | | Initialize |
| + | |- |
| + | | 0x00020000 |
| + | | |
| + | | Shutdown |
| + | |- |
| + | | 0x00030080 |
| + | | |
| + | | (unk0, unk1) ? |
| + | |- |
| + | | 0x00040000 |
| + | | |
| + | | ? |
| + | |- |
| + | | 0x000500C2 |
| + | | |
| + | | [[NFCP:SendTagCommand|SendTagCommand]] |
| + | |- |
| + | | 0x00060000 |
| + | | |
| + | | GetTagInfo |
| + | |- |
| + | | 0x00070000 |
| + | | |
| + | | GetTagState maybe? Writes an output value to cmdreply[2]. |
| + | |- |
| + | | 0x00080000 |
| + | | |
| + | | Writes a handle to cmdreply[3]. |
| + | |- |
| + | | 0x00090000 |
| + | | |
| + | | Writes a handle to cmdreply[3]. |
| + | |- |
| + | | 0x000A0000 |
| + | | |
| + | | Unknown. Writes an output value to cmdreply[2]. |
| + | |- |
| + | | 0x000B0000 |
| + | | |
| + | | Unknown. Writes 0x60-bytes of output starting at cmdreply[2]. u16 +0 is the size of the data at +4, +2 is not initialized, u8 +3 is loaded from state, u32 +0x2C is loaded from state, and the data at +4 with the previously mentioned size is copied from state. |
| + | |- |
| + | | 0x000C0040 |
| + | | |
| + | | (u32 outputsize) Writes output to static_buf_id=0, outputsize 1 is used when it's >=1. |
| + | |- |
| + | | 0x000D0040 |
| + | | |
| + | | (u32 outputsize) Writes output to static_buf_id=0, outputsize 1 is used when it's >=1. |
| + | |- |
| + | | 0x000E0080 |
| + | | |
| + | | (u8 unk, u32 outputsize) Writes output to static_buf_id=0, outputsize 2 is used when it's >=2. |
| + | |- |
| + | | 0x000F0040 |
| + | | |
| + | | (u32 outputsize) Writes output to static_buf_id=0, outputsize 2 is used when it's >=2. |
| + | |- |
| + | | 0x00100000 |
| + | | |
| + | | Unknown. |
| + | |- |
| + | | 0x00110000 |
| + | | |
| + | | Unknown. |
| + | |- |
| + | | 0x00120000 |
| + | | |
| + | | Unknown. Writes an output u32 to cmdreply[2]. |
| + | |- |
| + | | 0x00130000 |
| + | | |
| + | | Unknown. Writes an output u32 to cmdreply[2]. |
| + | |} |
| + | |
| This service is used by the mint library-applet, starting with [[9.3.0-21]]. This service was added to the mint service-access-control list with [[9.0.0-20]]. | | This service is used by the mint library-applet, starting with [[9.3.0-21]]. This service was added to the mint service-access-control list with [[9.0.0-20]]. |
| + | The mint process is the only known eShop-related process using this service([[eShop]]-application and NIM-module don't use it). Used for NFC card payments in JPN [[eShop]](the v16384 mint title is ''identical'' for USA/JPN besides programIDs in the NCCH header/exheader). |
| + | |
| + | JPN eShop game "Megami Meguri" uses these same JPN NFC cards. The only accessible NFC service is nfcu. |
| | | |
| ==NFC service "nfc:r"== | | ==NFC service "nfc:r"== |
Line 118: |
Line 226: |
| ! Available since system-version | | ! Available since system-version |
| ! Description | | ! Description |
| + | |- |
| + | | 0x00130102 |
| + | | |
| + | | [[NFCS:SendTagCommand|SendTagCommand]] |
| |- | | |- |
| | 0x00230000 | | | 0x00230000 |
Line 163: |
Line 275: |
| | 0x00030000 | | | 0x00030000 |
| | | | | |
− | | ??? | + | | [[NFC:StartCommunication|StartCommunication]] |
| | void | | | void |
| | s32 result | | | s32 result |
− | | | + | | |
| |- | | |- |
| | 0x00040000 | | | 0x00040000 |
| | | | | |
− | | ??? | + | | [[NFC:StopCommunication|StopCommunication]] |
| | void | | | void |
| | s32 result | | | s32 result |
− | | | + | | |
| |- | | |- |
| | 0x00050040 | | | 0x00050040 |
Line 198: |
Line 310: |
| | 0x00080000 | | | 0x00080000 |
| | | | | |
− | | ??? | + | | [[NFC:ResetTagScanState|ResetTagScanState]] |
− | | void | + | | |
− | | s32 result | + | | |
| | | | | |
| |- | | |- |
Line 219: |
Line 331: |
| | 0x000B0000 | | | 0x000B0000 |
| | | | | |
− | | ??? | + | | GetTagInRangeEvent(?) |
| | void | | | void |
− | | s32 result, u32 unknownA, u32 unknownB | + | | s32 result, u32 copy handle descriptor, Handle event |
− | | amiibo applet ignores value unknownA. It doesn't even read it from the command buffer. | + | | amiibo applet ignores value 'descriptor'. It doesn't even read it from the command buffer. |
| |- | | |- |
| | 0x000C0000 | | | 0x000C0000 |
| | | | | |
− | | ??? | + | | GetTagOutOfRangeEvent(?) |
| | void | | | void |
− | | s32 result, u32 unknownA, u32 unknownB | + | | s32 result, u32 copy handle descriptor, Handle event |
− | | amiibo applet also ignores value unknownA for this command. | + | | amiibo applet also ignores value 'descriptor' for this command. |
| |- | | |- |
| | 0x000D0000 | | | 0x000D0000 |
Line 240: |
Line 352: |
| | 0x000F0000 | | | 0x000F0000 |
| | | | | |
− | | ??? | + | | [[NFC:CommunicationGetStatus|CommunicationGetStatus]] |
− | | void | + | | |
− | | u32 result, u32 unknownA | + | | |
| | | | | |
| |- | | |- |
| | 0x00100000 | | | 0x00100000 |
| | | | | |
− | | ??? | + | | [[NFC:GetTagInfo2|GetTagInfo2]] |
− | | void | + | | |
− | | s32 result, u32 unknownA[24] | + | | |
| | | | | |
| |- | | |- |
| | 0x00110000 | | | 0x00110000 |
| | | | | |
− | | ??? | + | | [[NFC:GetTagInfo|GetTagInfo]] |
− | | void | + | | |
− | | s32 result, u32 unknownA[8], u32 unknownB[2], u32 unknownC | + | | |
| | | | | |
| |- | | |- |
| | 0x00120000 | | | 0x00120000 |
| | | | | |
| + | | [[NFC:CommunicationGetResult|CommunicationGetResult]] |
| | | | | |
| | | | | |
| | | | | |
− | | New3DS NFC module: This basically just writes u32 value 0x0 to cmdreply[2]. Old3DS: copies an u32 from <somestatestruct>+0x30 to cmdreply[2].
| |
| |- | | |- |
| | 0x00130040 | | | 0x00130040 |
Line 296: |
Line 408: |
| | 0x00170000 | | | 0x00170000 |
| | | | | |
− | | [[NFC:GetAmiiboSettings|GetAmiiboSettings]] | + | | [[NFC:GetRegisterInfo|GetRegisterInfo]] |
| | | | | |
| | | | | |
Line 303: |
Line 415: |
| | 0x00180000 | | | 0x00180000 |
| | | | | |
− | | [[NFC:GetAmiiboConfig|GetAmiiboConfig]] | + | | [[NFC:GetCommonInfo|GetCommonInfo]] |
| | | | | |
| | | | | |
Line 310: |
Line 422: |
| | 0x00190000 | | | 0x00190000 |
| | | | | |
− | | ??? | + | | [[NFC:GetAppDataInitStruct|GetAppDataInitStruct]] |
− | | void | + | | |
− | | s32 result, u32 unknownA[8], u32 unknownB[4], u64 unknownC, u32 unknownD | + | | |
− | | Apparently output is a struct | + | | |
| |- | | |- |
| | 0x001A0000 | | | 0x001A0000 |
Line 324: |
Line 436: |
| | 0x001B0000 | | | 0x001B0000 |
| | | | | |
− | | | + | | [[NFC:GetModelInfo|GetModelInfo]] |
− | | None | + | | |
− | | 0x36-byte output structure starting at cmdreply[2]. | + | | |
| | | | | |
| |- | | |- |
Line 349: |
Line 461: |
| | u8 outval at cmdreply[2]. | | | u8 outval at cmdreply[2]. |
| | ? | | | ? |
| + | |- |
| + | | 0x001F0080 |
| + | | [[10.0.0-27|10.0.0-X]] |
| + | | [[NFC:StartOtherTagScanning|StartOtherTagScanning]] |
| + | | |
| + | | |
| + | | Used by JPN eShop app "Megami Meguri". |
| + | |- |
| + | | 0x00200102 |
| + | | [[10.0.0-27|10.0.0-X]] |
| + | | [[NFC:SendTagCommand|SendTagCommand]] |
| + | | |
| + | | |
| + | | |
| + | |- |
| + | | 0x00210000 |
| + | | [[10.0.0-27|10.0.0-X]] |
| + | | ? |
| + | | |
| + | | |
| + | | Used by JPN eShop app "Megami Meguri". This can only be used when [[NFC:Initialize|initialized]] with type3, and when the [[NFC:GetTagState|TagState]] is 3. |
| + | |- |
| + | | 0x00220000 |
| + | | [[10.0.0-27|10.0.0-X]] |
| + | | ? |
| + | | |
| + | | |
| + | | This can only be used when [[NFC:Initialize|initialized]] with type3, and when the [[NFC:GetTagState|TagState]] is 3. |
| |} | | |} |
| | | |
Line 483: |
Line 623: |
| | 0xc8a17600 | | | 0xc8a17600 |
| | The current NFC tag [[NFC:GetTagState|state]], or other NFC state, is invalid with the NFC command which was used. | | | The current NFC tag [[NFC:GetTagState|state]], or other NFC state, is invalid with the NFC command which was used. |
| + | |} |
| + | |
| + | =Data Types= |
| + | |
| + | ==AdminInfo== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x00 |
| + | | 0x08 |
| + | | Program ID (From the Wii U, 3DS or Switch title who created the application area) |
| + | |- |
| + | | 0x08 |
| + | | 0x04 |
| + | | [[Amiibo#Games_using_Amiibo_AppData|App ID]] |
| + | |- |
| + | | 0x0C |
| + | | 0x02 |
| + | | CRC32 Change Counter |
| + | |- |
| + | | 0x0E |
| + | | 0x01 |
| + | | Flags (bit0 = amiibo initialized, bit1 = has application area, bit2/bit3 unknown) |
| + | |- |
| + | | 0x0F |
| + | | 0x01 |
| + | | 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 |
| + | | 0x07 |
| + | | Padding |
| + | |- |
| + | | 0x18 |
| + | | 0x28 |
| + | | Reserved |
| + | |} |
| + | |
| + | ==RegisterInfo== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x00 |
| + | | 0x60 |
| + | | [[Mii_Maker#Mii_QR_Code_format|Exported Mii Data]] (minus the AES-CCM used in the linked format) |
| + | |- |
| + | | 0x60 |
| + | | 0x16 |
| + | | Amiibo Name (NUL-Terminated) |
| + | |- |
| + | | 0x76 |
| + | | 0x01 |
| + | | Flags (bit0 = amiibo initialized, bit1 = has application area) |
| + | |- |
| + | | 0x77 |
| + | | 0x01 |
| + | | Font Region |
| + | |- |
| + | | 0x78 |
| + | | 0x04 |
| + | | Creation [[#Date|Date]] |
| + | |- |
| + | | 0x7C |
| + | | 0x2C |
| + | | Reserved |
| + | |} |
| + | |
| + | This data originates from the [[Amiibo]] settings data stored under the encrypted NFC data. |
| + | |
| + | ==CommonInfo== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x00 |
| + | | 0x04 |
| + | | Last Write [[#Date|Date]] |
| + | |- |
| + | | 0x04 |
| + | | 0x02 |
| + | | Write Counter |
| + | |- |
| + | | 0x06 |
| + | | 0x02 |
| + | | Character ID |
| + | |- |
| + | | 0x08 |
| + | | 0x01 |
| + | | Character Variant |
| + | |- |
| + | | 0x09 |
| + | | 0x01 |
| + | | Amiibo Series |
| + | |- |
| + | | 0x0A |
| + | | 0x02 |
| + | | Model Number |
| + | |- |
| + | | 0x0C |
| + | | 0x01 |
| + | | Amiibo Type |
| + | |- |
| + | | 0x0D |
| + | | 0x01 |
| + | | Version |
| + | |- |
| + | | 0x0E |
| + | | 0x02 |
| + | | Application Area Size (hardcoded to 0xD8) |
| + | |- |
| + | | 0x10 |
| + | | 0x30 |
| + | | Reserved |
| + | |} |
| + | |
| + | This data originates from the [[Amiibo]] NFC data. |
| + | |
| + | ==ModelInfo== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x00 |
| + | | 0x02 |
| + | | Character ID |
| + | |- |
| + | | 0x02 |
| + | | 0x01 |
| + | | Character Variant |
| + | |- |
| + | | 0x03 |
| + | | 0x01 |
| + | | Amiibo Series |
| + | |- |
| + | | 0x04 |
| + | | 0x02 |
| + | | Model Number |
| + | |- |
| + | | 0x06 |
| + | | 0x01 |
| + | | Amiibo Type |
| + | |- |
| + | | 0x07 |
| + | | 0x01 |
| + | | Version |
| + | |- |
| + | | 0x08 |
| + | | 0x2E |
| + | | Reserved |
| + | |} |
| + | |
| + | This data originates from the [[Amiibo]] NFC data. |
| + | |
| + | ==Date== |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x00 |
| + | | 0x02 |
| + | | Year |
| + | |- |
| + | | 0x02 |
| + | | 0x01 |
| + | | Month |
| + | |- |
| + | | 0x03 |
| + | | 0x01 |
| + | | Day |
| |} | | |} |
| | | |
Line 571: |
Line 896: |
| | v4106 | | | v4106 |
| | New3DS and Old3DS: the only changes regarding new commands is that new commands were added for the nfcu/nfcm command-set and new commands for an unknown cmd-handler were added. It's unknown if there's other changes. | | | New3DS and Old3DS: the only changes regarding new commands is that new commands were added for the nfcu/nfcm command-set and new commands for an unknown cmd-handler were added. It's unknown if there's other changes. |
| + | |} |
| + | |
| + | =Errors= |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Error code |
| + | ! Description |
| + | |- |
| + | | 0xC8A17600 |
| + | | This is returned when the current state is invalid for this command. |
| + | |- |
| + | | 0xC8A17620 |
| + | | This is returned by [[NFC:OpenAppData]] when the appdata is uninitialized since [[NFC:InitializeWriteAppData]] wasn't used previously. |
| + | |- |
| + | | 0xC8A17628 |
| + | | This is returned by [[NFC:GetAmiiboSettings]] when the amiibo wasn't setup by the amiibo Settings applet. |
| + | |- |
| + | | 0xC8A17638 |
| + | | This is returned by [[NFC:OpenAppData]] when the input AppID doesn't match the actual Amiibo AppID. |
| + | |- |
| + | | 0xC8C1760C |
| + | | Returned for HMAC-hash mismatch(data corruption), with HMAC-calculation input_buffer_size=0x34. |
| + | |- |
| + | | 0xC8A17618 |
| + | | HMAC-hash mismatch with input_buffer_size=0x1DF(see [[Amiibo|here]]). |
| |} | | |} |