Changes

Jump to navigation Jump to search
682 bytes added ,  00:54, 30 April 2016
Release info
Line 1: Line 1: −
The Nintendo NFC adapter is an upcoming external device which adds NFC capabilities for [[amiibo]]s to old Nintendo 3DS and Nintendo 2DS consoles, using the infrared port on the back of the console.
+
The Nintendo NFC adapter, formally '''Nintendo NFC Reader/Writer'''  and codenamed '''Fangate''', is an external device which adds NFC capabilities for [[amiibo]]s to old Nintendo 3DS and Nintendo 2DS consoles, using the infrared port on the back of the console.
 +
 
 +
It launched simultaneously with Animal Crossing Happy Home Designer, with which it's optionally bundled; it can also be bought standalone at a nominal price of 21 €.
    
[[File:150217nfcreader-640x360.jpg|thumb|right|250px|Media preview, as released by Nintendo]]
 
[[File:150217nfcreader-640x360.jpg|thumb|right|250px|Media preview, as released by Nintendo]]
Line 7: Line 9:  
Based on analysis of the [[fangate_updater.bin]] file, which is part of the old Nintendo 3DS operating system since [[9.3.0-21]] and contains the firmware running on the external adapter; and analysis of the [[NFC Services]] running on old 3DS.
 
Based on analysis of the [[fangate_updater.bin]] file, which is part of the old Nintendo 3DS operating system since [[9.3.0-21]] and contains the firmware running on the external adapter; and analysis of the [[NFC Services]] running on old 3DS.
   −
* SOC inside the adapter: Broadcom BCM20791B1
+
* SOC inside the adapter: Broadcom BCM20791B1 or ST proprietary "MCU-FGT/rev.A/GH24S VQ"
 
* CPU: ARM Cortex M0
 
* CPU: ARM Cortex M0
 
* Communications: infrared, with [[ir:USER]] running on the console. Uses obfuscated payloads. Baud rate is 115200 bps.
 
* Communications: infrared, with [[ir:USER]] running on the console. Uses obfuscated payloads. Baud rate is 115200 bps.
Line 146: Line 148:  
uint16_t * plain = (uint16_t *) voidplain;
 
uint16_t * plain = (uint16_t *) voidplain;
 
uint16_t * cipher = (uint16_t *) voidcipher;
 
uint16_t * cipher = (uint16_t *) voidcipher;
size_t halfCount = size / sizeof(uint16_t);
+
size_t halfCount = size >> 1; // Divide by 2 rounding towards zero
    
uint16_t xorval = htobe16(0xE963);
 
uint16_t xorval = htobe16(0xE963);
Line 160: Line 162:  
uint16_t * cipher = (uint16_t *) voidcipher;
 
uint16_t * cipher = (uint16_t *) voidcipher;
 
uint16_t * plain = (uint16_t *) voidplain;
 
uint16_t * plain = (uint16_t *) voidplain;
size_t halfCount = size / sizeof(uint16_t);
+
size_t halfCount = size >> 1; // Divide by 2 rounding towards zero
   −
if (halfCount) {
+
uint16_t xorval = htobe16(0xE963);
size_t i;
+
size_t i;
for (i = halfCount - 1; i > 0; i--) {
  −
plain[i] = cipher[i] ^ cipher[i - 1];
  −
}
     −
plain[0] = cipher[0] ^ htobe16(0xE963);
+
for (i = 0; i < halfCount; i++) {
 +
uint16_t word = plain[i];
 +
cipher[i] = xorval ^ word;
 +
xorval = word;
 
}
 
}
 
}</nowiki>
 
}</nowiki>
Line 225: Line 227:  
=== Operation codes ===
 
=== Operation codes ===
 
{| class="wikitable"
 
{| class="wikitable"
|+IR framing format - long frame
  −
|-
   
! Code
 
! Code
 
! Name
 
! Name
 +
! Has payload
 
! Direction
 
! Direction
 
|-
 
|-
 
! 0x0
 
! 0x0
 
| Layer 3 command?
 
| Layer 3 command?
| 3DS to NFC
+
| style="background: green" | Yes
 +
| Master to slave
 
|-
 
|-
 
! 0x1
 
! 0x1
Line 273: Line 275:  
! 0xA
 
! 0xA
 
| Disconnect request
 
| Disconnect request
| 3DS to NFC
+
| style="background: red" | No
 +
| Master to slave
 
|-
 
|-
 
! 0xB
 
! 0xB
 
| Disconnection acknowledgment
 
| Disconnection acknowledgment
| NFC to 3DS
+
| style="background: red" | No
 +
| Slave to master
 
|-
 
|-
 
! 0xC
 
! 0xC
 
| Handshake
 
| Handshake
| 3DS to NFC
+
| style="background: red" | No
 +
| Master to slave
 
|-
 
|-
 
! 0xD
 
! 0xD
 
| Handshake acknowledgement
 
| Handshake acknowledgement
| NFC to 3DS
+
| style="background: red" | No
 +
| Slave to master
 
|-
 
|-
 
! 0xE
 
! 0xE
Line 298: Line 304:  
== Samples ==
 
== Samples ==
   −
NFC adapter update beacon, as sent by the console:
+
NFC handshake beacons:
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Raw
+
! Layer 1 packet
! Deobfuscated
+
! Layer 2 packet
 +
! Layer 3 packet
 
|-
 
|-
 
| <code>A5 00 08 73 FE A5 C4 A4 2C A4 20 F5</code>
 
| <code>A5 00 08 73 FE A5 C4 A4 2C A4 20 F5</code>
 
| <code>9A 9D D6 3A 01 E8 00 0C</code>
 
| <code>9A 9D D6 3A 01 E8 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 D1 3E B7 7B B6 91 B6 9D 87</code>
 
| <code>A5 00 08 D1 3E B7 7B B6 91 B6 9D 87</code>
 
| <code>38 5D 66 45 01 EA 00 0C</code>
 
| <code>38 5D 66 45 01 EA 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 09 58 23 36 22 DA 22 D6 AE</code>
 
| <code>A5 00 08 09 58 23 36 22 DA 22 D6 AE</code>
 
| <code>E0 3B 2A 6E 01 EC 00 0C</code>
 
| <code>E0 3B 2A 6E 01 EC 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 5E DD A4 A0 A5 4E A5 42 A8</code>
 
| <code>A5 00 08 5E DD A4 A0 A5 4E A5 42 A8</code>
 
| <code>B7 BE FA 7D 01 EE 00 0C</code>
 
| <code>B7 BE FA 7D 01 EE 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 BC 19 C6 37 C7 C7 C7 CB 8B</code>
 
| <code>A5 00 08 BC 19 C6 37 C7 C7 C7 CB 8B</code>
 
| <code>55 7A 7A 2E 01 F0 00 0C</code>
 
| <code>55 7A 7A 2E 01 F0 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 C9 15 F6 63 F7 91 F7 9D B2</code>
 
| <code>A5 00 08 C9 15 F6 63 F7 91 F7 9D B2</code>
 
| <code>20 76 3F 76 01 F2 00 0C</code>
 
| <code>20 76 3F 76 01 F2 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 6E 48 47 1A 46 EE 46 E2 C7</code>
 
| <code>A5 00 08 6E 48 47 1A 46 EE 46 E2 C7</code>
 
| <code>87 2B 29 52 01 F4 00 0C</code>
 
| <code>87 2B 29 52 01 F4 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 A2 8C E5 C3 E4 35 E4 39 74</code>
 
| <code>A5 00 08 A2 8C E5 C3 E4 35 E4 39 74</code>
 
| <code>4B EF 47 4F 01 F6 00 0C</code>
 
| <code>4B EF 47 4F 01 F6 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 26 1C 07 10 06 E8 06 E4 64</code>
 
| <code>A5 00 08 26 1C 07 10 06 E8 06 E4 64</code>
 
| <code>CF 7F 21 0C 01 F8 00 0C</code>
 
| <code>CF 7F 21 0C 01 F8 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 7E 73 A2 3F A3 C5 A3 C9 FD</code>
 
| <code>A5 00 08 7E 73 A2 3F A3 C5 A3 C9 FD</code>
 
| <code>97 10 DC 4C 01 FA 00 0C</code>
 
| <code>97 10 DC 4C 01 FA 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 75 00 F3 B8 F2 44 F2 48 63</code>
 
| <code>A5 00 08 75 00 F3 B8 F2 44 F2 48 63</code>
 
| <code>9C 63 86 B8 01 FC 00 0C</code>
 
| <code>9C 63 86 B8 01 FC 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 8D AC 0F D5 0E 2B 0E 27 72</code>
 
| <code>A5 00 08 8D AC 0F D5 0E 2B 0E 27 72</code>
 
| <code>64 CF 82 79 01 FE 00 0C</code>
 
| <code>64 CF 82 79 01 FE 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 A3 55 7C 53 7D 52 7D 5E B2</code>
 
| <code>A5 00 08 A3 55 7C 53 7D 52 7D 5E B2</code>
 
| <code>4A 36 DF 06 01 01 00 0C</code>
 
| <code>4A 36 DF 06 01 01 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 15 06 43 C0 42 C3 42 CF 85</code>
 
| <code>A5 00 08 15 06 43 C0 42 C3 42 CF 85</code>
 
| <code>FC 65 56 C6 01 03 00 0C</code>
 
| <code>FC 65 56 C6 01 03 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 66 E0 9A 17 9B 12 9B 1E A0</code>
 
| <code>A5 00 08 66 E0 9A 17 9B 12 9B 1E A0</code>
 
| <code>8F 83 FC F7 01 05 00 0C</code>
 
| <code>8F 83 FC F7 01 05 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 A4 35 09 97 08 90 08 9C 25</code>
 
| <code>A5 00 08 A4 35 09 97 08 90 08 9C 25</code>
 
| <code>4D 56 AD A2 01 07 00 0C</code>
 
| <code>4D 56 AD A2 01 07 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 73 E2 BD AF BC A6 BC AA 60</code>
 
| <code>A5 00 08 73 E2 BD AF BC A6 BC AA 60</code>
 
| <code>9A 81 CE 4D 01 09 00 0C</code>
 
| <code>9A 81 CE 4D 01 09 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 02 57 D7 B0 D6 BB D6 B7 28</code>
 
| <code>A5 00 08 02 57 D7 B0 D6 BB D6 B7 28</code>
 
| <code>EB 34 D5 E7 01 0B 00 0C</code>
 
| <code>EB 34 D5 E7 01 0B 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 0D 79 01 AA 00 A7 00 AB 22</code>
 
| <code>A5 00 08 0D 79 01 AA 00 A7 00 AB 22</code>
 
| <code>E4 1A 0C D3 01 0D 00 0C</code>
 
| <code>E4 1A 0C D3 01 0D 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 14 91 04 B9 05 B6 05 BA B2</code>
 
| <code>A5 00 08 14 91 04 B9 05 B6 05 BA B2</code>
 
| <code>FD F2 10 28 01 0F 00 0C</code>
 
| <code>FD F2 10 28 01 0F 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 2C 86 B1 49 B0 58 B0 54 C0</code>
 
| <code>A5 00 08 2C 86 B1 49 B0 58 B0 54 C0</code>
 
| <code>C5 E5 9D CF 01 11 00 0C</code>
 
| <code>C5 E5 9D CF 01 11 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 D5 1D DE DB DF C8 DF C4 F9</code>
 
| <code>A5 00 08 D5 1D DE DB DF C8 DF C4 F9</code>
 
| <code>3C 7E 0B C6 01 13 00 0C</code>
 
| <code>3C 7E 0B C6 01 13 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 AF 75 DE 5C DF 49 DF 45 9C</code>
 
| <code>A5 00 08 AF 75 DE 5C DF 49 DF 45 9C</code>
 
| <code>46 16 71 29 01 15 00 0C</code>
 
| <code>46 16 71 29 01 15 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 C8 E2 5B C6 5A D1 5A DD B5</code>
 
| <code>A5 00 08 C8 E2 5B C6 5A D1 5A DD B5</code>
 
| <code>21 81 93 24 01 17 00 0C</code>
 
| <code>21 81 93 24 01 17 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 9B 51 68 2D 69 34 69 38 41</code>
 
| <code>A5 00 08 9B 51 68 2D 69 34 69 38 41</code>
 
| <code>72 32 F3 7C 01 19 00 0C</code>
 
| <code>72 32 F3 7C 01 19 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 13 7B 9F EF 9E F4 9E F8 32</code>
 
| <code>A5 00 08 13 7B 9F EF 9E F4 9E F8 32</code>
 
| <code>FA 18 8C 94 01 1B 00 0C</code>
 
| <code>FA 18 8C 94 01 1B 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 A7 62 02 9C 03 81 03 8D BD</code>
 
| <code>A5 00 08 A7 62 02 9C 03 81 03 8D BD</code>
 
| <code>4E 01 A5 FE 01 1D 00 0C</code>
 
| <code>4E 01 A5 FE 01 1D 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 39 06 94 36 95 29 95 25 09</code>
 
| <code>A5 00 08 39 06 94 36 95 29 95 25 09</code>
 
| <code>D0 65 AD 30 01 1F 00 0C</code>
 
| <code>D0 65 AD 30 01 1F 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 32 4C D7 C0 D6 E1 D6 ED 92</code>
 
| <code>A5 00 08 32 4C D7 C0 D6 E1 D6 ED 92</code>
 
| <code>DB 2F E5 8C 01 21 00 0C</code>
 
| <code>DB 2F E5 8C 01 21 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 83 BE F2 8F F3 AC F3 A0 B1</code>
 
| <code>A5 00 08 83 BE F2 8F F3 AC F3 A0 B1</code>
 
| <code>6A DD 71 31 01 23 00 0C</code>
 
| <code>6A DD 71 31 01 23 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 83 5E A0 57 A1 72 A1 7E F0</code>
 
| <code>A5 00 08 83 5E A0 57 A1 72 A1 7E F0</code>
 
| <code>6A 3D 23 09 01 25 00 0C</code>
 
| <code>6A 3D 23 09 01 25 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 6E C8 AD 69 AC 4E AC 42 D1</code>
 
| <code>A5 00 08 6E C8 AD 69 AC 4E AC 42 D1</code>
 
| <code>87 AB C3 A1 01 27 00 0C</code>
 
| <code>87 AB C3 A1 01 27 00 0C</code>
 +
| ␀
 
|-
 
|-
 
| <code>A5 00 08 C7 33 A1 2C A0 05 A0 09 FC</code>
 
| <code>A5 00 08 C7 33 A1 2C A0 05 A0 09 FC</code>
 
| <code>2E 50 66 1F 01 29 00 0C</code>
 
| <code>2E 50 66 1F 01 29 00 0C</code>
 +
| ␀
 
|}
 
|}
    
= External links =
 
= External links =
 
* [https://www.broadcom.com/products/NFC/NFC-Solutions/BCM2079x-Family BCM2079x brief on Broadcom's website]
 
* [https://www.broadcom.com/products/NFC/NFC-Solutions/BCM2079x-Family BCM2079x brief on Broadcom's website]
149

edits

Navigation menu