Skip to content

Commit a95b44d

Browse files
committed
[nRF52] build of NFC tag
1 parent 53d8956 commit a95b44d

File tree

4 files changed

+230
-0
lines changed

4 files changed

+230
-0
lines changed

software/firmware/source/SoftRF/src/platform/iomap/LilyGO_TEcho.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,7 @@
9494

9595
/* RTC */
9696
#define SOC_GPIO_PIN_R_INT _PINNUM(0, 16) // P0.16
97+
98+
/* NFC */
99+
#define SOC_GPIO_PIN_NFC_ANT1 _PINNUM(0, 9) // P0.09
100+
#define SOC_GPIO_PIN_NFC_ANT2 _PINNUM(0, 10) // P0.10

software/firmware/source/SoftRF/src/platform/nRF52.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,32 @@ ExtensionIOXL9555 *xl9555 = nullptr;
637637
bool nRF52_has_extension = false;
638638
#endif /* ARDUINO_ARCH_MBED */
639639

640+
#if defined(ENABLE_NFC)
641+
#include <NFC.h>
642+
643+
extern "C" int nfcpins_enable(void);
644+
645+
void nfc_func(void *context, nfc_t2t_event_t event,
646+
const uint8_t *data, size_t dataLength)
647+
{
648+
(void) context;
649+
650+
switch (event)
651+
{
652+
case NFC_T2T_EVENT_FIELD_ON:
653+
Serial.println("******NFC_T2T_EVENT_FIELD_ON******");
654+
break;
655+
656+
case NFC_T2T_EVENT_FIELD_OFF:
657+
Serial.println("------NFC_T2T_EVENT_FIELD_OFF------");
658+
break;
659+
660+
default:
661+
break;
662+
}
663+
}
664+
#endif /* ENABLE_NFC */
665+
640666
static void nRF52_setup()
641667
{
642668
ui = &ui_settings;
@@ -1348,6 +1374,26 @@ static void nRF52_setup()
13481374
break;
13491375
}
13501376
#endif /* EXCLUDE_WIFI */
1377+
1378+
#if defined(ENABLE_NFC)
1379+
if (nRF52_board == NRF52_LILYGO_TECHO_REV_0 ||
1380+
nRF52_board == NRF52_LILYGO_TECHO_REV_1 ||
1381+
nRF52_board == NRF52_LILYGO_TECHO_REV_2 ||
1382+
nRF52_board == NRF52_LILYGO_TULTIMA) {
1383+
String NFC_name = SOFTRF_IDENT;
1384+
NFC_name += "-";
1385+
NFC_name += String(SoC->getChipId() & 0x00FFFFFFU, HEX);
1386+
1387+
if ((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) != (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)) {
1388+
Serial.println("*** NFC pins are disabled ***");
1389+
// nfcpins_enable();
1390+
}
1391+
1392+
NFC.setTXTmessage((NFC_name+"-NFC").c_str(), "en");
1393+
NFC.start();
1394+
NFC.registerCallback(nfc_func);
1395+
}
1396+
#endif /* ENABLE_NFC */
13511397
}
13521398

13531399
static void nRF52_post_init()

software/firmware/source/SoftRF/src/platform/nRF52.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ struct rst_info {
265265
#define USE_TFT
266266
#define USE_RADIOLIB
267267
//#define ENABLE_RECORDER
268+
//#define ENABLE_NFC
268269
#else
269270
#undef USE_EPAPER
270271
//#define EXCLUDE_BLUETOOTH
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
/*
2+
* Copyright (c) 2016-2023 Makerdiary
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#if defined(NRF52840) || defined(NRF52840_XXAA)
8+
9+
#include <nrf.h>
10+
#include <stddef.h>
11+
12+
#if !defined(ARRAY_SIZE)
13+
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
14+
#endif
15+
16+
int nfcpins_enable(void)
17+
{
18+
/* if NFCPINS in UICR is disabled, NFC functionality will be disabled.
19+
* To enable NFC, NFCPINS in UICR should be erased.
20+
* This function will erase NFCPINS and keep other registers in UICR unchanged.
21+
*/
22+
23+
NRF_UICR_Type nrf_uicr;
24+
volatile uint32_t *addr = NULL;
25+
26+
if ((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) != (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)){
27+
28+
addr = NRF_UICR->NRFFW;
29+
for (int i = 0; i < ARRAY_SIZE(nrf_uicr.NRFFW); i++) {
30+
nrf_uicr.NRFFW[i] = *addr;
31+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
32+
;
33+
}
34+
addr++;
35+
}
36+
37+
addr = NRF_UICR->NRFHW;
38+
for (int i = 0; i < ARRAY_SIZE(nrf_uicr.NRFHW); i++) {
39+
nrf_uicr.NRFHW[i] = *addr;
40+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
41+
;
42+
}
43+
addr++;
44+
}
45+
46+
addr = NRF_UICR->CUSTOMER;
47+
for (int i = 0; i < ARRAY_SIZE(nrf_uicr.CUSTOMER); i++) {
48+
nrf_uicr.CUSTOMER[i] = *addr;
49+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
50+
;
51+
}
52+
addr++;
53+
}
54+
55+
nrf_uicr.PSELRESET[0] = NRF_UICR->PSELRESET[0];
56+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
57+
;
58+
}
59+
60+
nrf_uicr.PSELRESET[1] = NRF_UICR->PSELRESET[1];
61+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
62+
;
63+
}
64+
65+
nrf_uicr.APPROTECT = NRF_UICR->APPROTECT;
66+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
67+
;
68+
}
69+
70+
nrf_uicr.NFCPINS = NRF_UICR->NFCPINS;
71+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
72+
;
73+
}
74+
75+
nrf_uicr.DEBUGCTRL = NRF_UICR->DEBUGCTRL;
76+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
77+
;
78+
}
79+
80+
nrf_uicr.REGOUT0 = NRF_UICR->REGOUT0;
81+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
82+
;
83+
}
84+
85+
// Enable Erase mode
86+
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Een << NVMC_CONFIG_WEN_Pos; // 0x02;
87+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
88+
;
89+
}
90+
91+
// Erase the UICR registers
92+
NRF_NVMC->ERASEUICR = NVMC_ERASEUICR_ERASEUICR_Erase << NVMC_ERASEUICR_ERASEUICR_Pos; //0x00000001;
93+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
94+
;
95+
}
96+
97+
// Enable WRITE mode
98+
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
99+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
100+
;
101+
}
102+
103+
addr = NRF_UICR->NRFFW;
104+
for (int i = 0; i < ARRAY_SIZE(nrf_uicr.NRFFW); i++) {
105+
if (nrf_uicr.NRFFW[i] != 0xFFFFFFFF) {
106+
*addr = nrf_uicr.NRFFW[i];
107+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
108+
;
109+
}
110+
}
111+
addr++;
112+
}
113+
114+
addr = NRF_UICR->NRFHW;
115+
for (int i = 0; i < ARRAY_SIZE(nrf_uicr.NRFHW); i++) {
116+
if (nrf_uicr.NRFHW[i] != 0xFFFFFFFF) {
117+
*addr = nrf_uicr.NRFHW[i];
118+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
119+
;
120+
}
121+
}
122+
addr++;
123+
}
124+
125+
addr = NRF_UICR->CUSTOMER;
126+
for (int i = 0; i < ARRAY_SIZE(nrf_uicr.CUSTOMER); i++) {
127+
if (nrf_uicr.CUSTOMER[i] != 0xFFFFFFFF) {
128+
*addr = nrf_uicr.CUSTOMER[i];
129+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
130+
;
131+
}
132+
}
133+
addr++;
134+
}
135+
136+
if (nrf_uicr.PSELRESET[0] != 0xFFFFFFFF) {
137+
NRF_UICR->PSELRESET[0] = nrf_uicr.PSELRESET[0];
138+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
139+
;
140+
}
141+
}
142+
143+
if (nrf_uicr.PSELRESET[1] != 0xFFFFFFFF) {
144+
NRF_UICR->PSELRESET[1] = nrf_uicr.PSELRESET[1];
145+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
146+
;
147+
}
148+
}
149+
150+
if (nrf_uicr.APPROTECT != 0xFFFFFFFF) {
151+
NRF_UICR->APPROTECT = nrf_uicr.APPROTECT;
152+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
153+
;
154+
}
155+
}
156+
157+
if (nrf_uicr.DEBUGCTRL != 0xFFFFFFFF) {
158+
NRF_UICR->DEBUGCTRL = nrf_uicr.DEBUGCTRL;
159+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
160+
;
161+
}
162+
}
163+
164+
if (nrf_uicr.REGOUT0 != 0xFFFFFFFF) {
165+
NRF_UICR->REGOUT0 = nrf_uicr.REGOUT0;
166+
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {
167+
;
168+
}
169+
}
170+
171+
/* a reset is required for changes to take effect */
172+
NVIC_SystemReset();
173+
}
174+
175+
return 0;
176+
}
177+
178+
#endif /* NRF52840 */
179+

0 commit comments

Comments
 (0)