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 33: |
Line 33: |
| | void | | | void |
| | s32 result, u32 unknownA[16] | | | s32 result, u32 unknownA[16] |
− | | Output seems to be a struct | + | | Output seems to be a struct. unknownA[2]'s value is the AppID of the Amiibo. |
| |- | | |- |
| | 0x04030000 | | | 0x04030000 |
Line 102: |
Line 102: |
| | | |
| ==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 219: |
| ! Available since system-version | | ! Available since system-version |
| ! Description | | ! Description |
| + | |- |
| + | | 0x00130102 |
| + | | |
| + | | [[NFCS:SendTagCommand|SendTagCommand]] |
| |- | | |- |
| | 0x00230000 | | | 0x00230000 |
Line 219: |
Line 324: |
| | 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 345: |
| | 0x000F0000 | | | 0x000F0000 |
| | | | | |
− | | ??? | + | | [[NFC:CommunicationGetStatus|CommunicationGetStatus]] |
− | | void | + | | |
− | | u32 result, u32 unknownA | + | | |
| | | | | |
| |- | | |- |
| | 0x00100000 | | | 0x00100000 |
| | | | | |
− | | ??? | + | | [[NFC:GetTagInfo2|GetTagInfo2]] |
− | | void | + | | |
− | | s32 result, u32 unknownA[24] | + | | |
| | | | | |
| |- | | |- |
Line 261: |
Line 366: |
| | 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 349: |
Line 454: |
| | 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 571: |
Line 704: |
| | 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]]). |
| |} | | |} |