Skip to content

Commit 45fa581

Browse files
[nrf toup][nrfconnect] Adapt NFC Commissioning manager to unpowered mode
- Added define switch for powered and unpowered NFC Commissioning modes - Added Kconfigs to switch between these two modes. Signed-off-by: Arkadiusz Balys <arkadiusz.balys@nordicsemi.no>
1 parent 119637c commit 45fa581

4 files changed

Lines changed: 103 additions & 28 deletions

File tree

‎config/nrfconnect/chip-module/Kconfig‎

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,20 @@ config CHIP_NFC_ONBOARDING_PAYLOAD
5454

5555
# See config/common/cmake/Kconfig for full definition
5656
config CHIP_NFC_BASED_COMMISSIONING
57-
depends on HAS_HW_NRF_NFCT
57+
help
58+
Enables Matter NFC-based commissioning. Use CHIP_NFC_COMMISSIONING_MODE to select
59+
powered (on-chip NFCT) or unpowered (external ST25DA-C) operation.
60+
61+
if CHIP_NFC_BASED_COMMISSIONING
62+
63+
choice CHIP_NFC_COMMISSIONING_MODE
64+
prompt "NFC commissioning mode"
65+
default CHIP_NFC_COMMISSIONING_MODE_POWERED
66+
67+
config CHIP_NFC_COMMISSIONING_MODE_POWERED
68+
bool "Powered (on-chip NFCT, live NTL session)"
5869
depends on !CHIP_NFC_ONBOARDING_PAYLOAD
70+
depends on HAS_HW_NRF_NFCT
5971
imply NFC_T4T_NRFXLIB
6072
imply NFC_THREAD_CALLBACK
6173
imply NFC_OWN_THREAD
@@ -71,6 +83,17 @@ config CHIP_NFC_BASED_COMMISSIONING
7183
Application file alongside the Matter NTL application, both within the same raw
7284
ISO-DEP (Type 4A) session.
7385

86+
config CHIP_NFC_COMMISSIONING_MODE_UNPOWERED
87+
bool "Unpowered (external ST25DA-C via I2C)"
88+
help
89+
Commissioner writes commissioning data to an external ST25DA-C tag. The
90+
application reads the stored TLV over I2C (e.g. nfc commission shell) and
91+
completes Thread join and Matter fabric provisioning via nfctag.cpp.
92+
93+
endchoice
94+
95+
endif # CHIP_NFC_BASED_COMMISSIONING
96+
7497
config CHIP_NFC_BASED_COMMISSIONING_APDU_DEBUG
7598
bool "NFC based commissioning APDU hex logging"
7699
depends on CHIP_NFC_BASED_COMMISSIONING

‎src/platform/nrfconnect/CHIPDevicePlatformConfig.h‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,6 @@
9595
#endif // CONFIG_CHIP_NFC_ONBOARDING_PAYLOAD
9696
#endif // CHIP_DEVICE_CONFIG_ENABLE_NFC_ONBOARDING_PAYLOAD
9797

98-
#if CHIP_DEVICE_CONFIG_ENABLE_NFC_ONBOARDING_PAYLOAD && CHIP_DEVICE_CONFIG_ENABLE_NFC_BASED_COMMISSIONING
99-
#error \
100-
"CHIP_DEVICE_CONFIG_ENABLE_NFC_ONBOARDING_PAYLOAD and CHIP_DEVICE_CONFIG_ENABLE_NFC_BASED_COMMISSIONING are mutually exclusive on nRF Connect SDK."
101-
#endif
102-
10398
#ifdef CONFIG_BT
10499
#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE CONFIG_BT
105100
#ifdef CONFIG_CHIP_CHIPOBLE_SINGLE_CONNECTION

‎src/platform/nrfconnect/NFCCommissioningManagerImpl.cpp‎

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@
3434
#include <setup_payload/QRCodeSetupPayloadGenerator.h>
3535
#include <setup_payload/SetupPayload.h>
3636

37+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
3738
#include <nfc/ndef/uri_msg.h>
3839
#include <nfc/ndef/uri_rec.h>
40+
#endif
3941

4042
#include <algorithm>
4143
#include <cstring>
@@ -48,6 +50,7 @@ namespace chip {
4850
namespace DeviceLayer {
4951
namespace Internal {
5052

53+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
5154
namespace {
5255

5356
// Matter Application Identifier (NTL, spec 4.21)
@@ -149,14 +152,17 @@ class SessionLock
149152
};
150153

151154
} // namespace
155+
#endif // CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
152156

153157
Global<NFCCommissioningManagerImpl> NFCCommissioningManagerImpl::sInstance;
154158

155159
CHIP_ERROR NFCCommissioningManagerImpl::_Init()
156160
{
157161
ChipLogDetail(DeviceLayer, "Initializing NFC Commissioning Manager");
158162

163+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
159164
ResetSession();
165+
#endif
160166
ReturnErrorOnFailure(PlatformMgr().AddEventHandler(OnPlatformEvent, reinterpret_cast<intptr_t>(this)));
161167

162168
return CHIP_NO_ERROR;
@@ -170,17 +176,21 @@ void NFCCommissioningManagerImpl::OnPlatformEvent(const ChipDeviceEvent * event,
170176
{
171177
case DeviceEventType::kServerReady:
172178
case DeviceEventType::kDnssdInitialized:
179+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
173180
self->StartNfcCommissioning();
181+
#endif
174182
break;
175183
case DeviceEventType::kCommissioningComplete:
176184
self->HandleCommissioningComplete();
177185
break;
186+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
178187
case DeviceEventType::kFailSafeTimerExpired:
179188
self->HandleFailSafeTimerExpired();
180189
break;
181190
case DeviceEventType::kSecureSessionEstablished:
182191
self->HandleSecureSessionEstablished(event);
183192
break;
193+
#endif
184194
default:
185195
break;
186196
}
@@ -195,6 +205,9 @@ void NFCCommissioningManagerImpl::ScheduledStartNfcCommissioning(intptr_t arg)
195205

196206
void NFCCommissioningManagerImpl::StartNfcCommissioning()
197207
{
208+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_UNPOWERED
209+
return;
210+
#else
198211
VerifyOrReturn(!mRawIsoDepStarted);
199212

200213
if (Server::GetInstance().GetFabricTable().FabricCount() != 0)
@@ -208,16 +221,20 @@ void NFCCommissioningManagerImpl::StartNfcCommissioning()
208221
{
209222
ChipLogError(DeviceLayer, "Failed to start NFC tag emulation for commissioning");
210223
}
224+
#endif // CONFIG_CHIP_NFC_COMMISSIONING_MODE_UNPOWERED
211225
}
212226

213227
void NFCCommissioningManagerImpl::HandleCommissioningComplete()
214228
{
229+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
215230
mBlockMatterAidSelection = false;
216231
mNfcEmulationPausedForFailSafe = false;
232+
#endif
217233
ChipLogProgress(DeviceLayer, "Commissioning complete: stopping NFC commissioning");
218234
NFCCommissioningMgr().Shutdown();
219235
}
220236

237+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
221238
void NFCCommissioningManagerImpl::HandleFailSafeTimerExpired()
222239
{
223240
VerifyOrReturn(mBlockMatterAidSelection || mNfcEmulationPausedForFailSafe);
@@ -255,9 +272,14 @@ void NFCCommissioningManagerImpl::HandleSecureSessionEstablished(const ChipDevic
255272
ChipLogProgress(DeviceLayer,
256273
"NFC PASE session established: blocking NFC commissioning until fail-safe completes or commissioning succeeds");
257274
}
275+
#endif // CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
258276

259277
CHIP_ERROR NFCCommissioningManagerImpl::ConfigureOnboardingPayload()
260278
{
279+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_UNPOWERED
280+
ChipLogDetail(DeviceLayer, "Unpowered NFC commissioning: skipping on-chip tag setup");
281+
return CHIP_NO_ERROR;
282+
#else
261283
PayloadContents payload;
262284
payload.version = 0;
263285
payload.rendezvousInformation.SetValue(RendezvousInformationFlags(RendezvousInformationFlag::kNFC));
@@ -283,8 +305,11 @@ CHIP_ERROR NFCCommissioningManagerImpl::ConfigureOnboardingPayload()
283305
TEMPORARY_RETURN_IGNORED PlatformMgr().ScheduleWork(ScheduledStartNfcCommissioning, reinterpret_cast<intptr_t>(this));
284306

285307
return CHIP_NO_ERROR;
308+
#endif // CONFIG_CHIP_NFC_COMMISSIONING_MODE_UNPOWERED
286309
}
287310

311+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
312+
288313
void NFCCommissioningManagerImpl::StartRawIsoDepTagEmulation()
289314
{
290315
VerifyOrReturn(!mRawIsoDepStarted);
@@ -332,14 +357,6 @@ bool NFCCommissioningManagerImpl::IsSessionIdle() const
332357
mApduFragmentCount == 0 && !mAwaitingApplicationResponse && mOutgoingMessage.IsNull();
333358
}
334359

335-
void NFCCommissioningManagerImpl::_Shutdown()
336-
{
337-
ChipLogDetail(DeviceLayer, "Shutting down NFC Commissioning Manager");
338-
PlatformMgr().RemoveEventHandler(OnPlatformEvent, reinterpret_cast<intptr_t>(this));
339-
StopRawIsoDepTagEmulation();
340-
ResetSession(/* notifyAborted = */ true);
341-
}
342-
343360
void NFCCommissioningManagerImpl::ResetSession(bool notifyAborted)
344361
{
345362
SessionLock lock;
@@ -1095,6 +1112,38 @@ void NFCCommissioningManagerImpl::DeliverIncomingMessage()
10951112
mAwaitingApplicationResponse = true;
10961113
}
10971114

1115+
#else // CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
1116+
1117+
void NFCCommissioningManagerImpl::SetNFCBase(Transport::NFCBase * nfcBase)
1118+
{
1119+
(void) nfcBase;
1120+
}
1121+
1122+
bool NFCCommissioningManagerImpl::CanSendToPeer(const Transport::PeerAddress & address)
1123+
{
1124+
(void) address;
1125+
return false;
1126+
}
1127+
1128+
CHIP_ERROR NFCCommissioningManagerImpl::SendToNfcTag(const Transport::PeerAddress & address, System::PacketBufferHandle && msgBuf)
1129+
{
1130+
(void) address;
1131+
(void) msgBuf;
1132+
return CHIP_ERROR_INCORRECT_STATE;
1133+
}
1134+
1135+
#endif // CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
1136+
1137+
void NFCCommissioningManagerImpl::_Shutdown()
1138+
{
1139+
ChipLogDetail(DeviceLayer, "Shutting down NFC Commissioning Manager");
1140+
PlatformMgr().RemoveEventHandler(OnPlatformEvent, reinterpret_cast<intptr_t>(this));
1141+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
1142+
StopRawIsoDepTagEmulation();
1143+
ResetSession(/* notifyAborted = */ true);
1144+
#endif
1145+
}
1146+
10981147
} // namespace Internal
10991148
} // namespace DeviceLayer
11001149
} // namespace chip

‎src/platform/nrfconnect/NFCCommissioningManagerImpl.h‎

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,16 @@
2828

2929
#include <platform/internal/NFCCommissioningManager.h>
3030

31-
#include <transport/raw/NfcApplicationDelegate.h>
32-
3331
#include <lib/core/Global.h>
3432
#include <system/SystemPacketBuffer.h>
3533

34+
#include <transport/raw/NfcApplicationDelegate.h>
35+
36+
#include "autoconf.h"
37+
38+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
3639
#include <nfc_t4t_lib.h>
40+
#endif
3741

3842
#include <cstdint>
3943

@@ -56,21 +60,26 @@ class NFCCommissioningManagerImpl final : public NFCCommissioningManager, privat
5660
public:
5761
NFCCommissioningManagerImpl() {}
5862

59-
// ===== Members that implement virtual methods on NfcApplicationDelegate.
60-
6163
void SetNFCBase(Transport::NFCBase * nfcBase) override;
6264
bool CanSendToPeer(const Transport::PeerAddress & address) override;
6365
CHIP_ERROR SendToNfcTag(const Transport::PeerAddress & address, System::PacketBufferHandle && msgBuf) override;
66+
6467
bool HasOnboardingPayload() const
6568
{
69+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
6670
return mHasOnboardingPayload && mRawIsoDepStarted && !mBlockMatterAidSelection && !mNfcEmulationPausedForFailSafe;
71+
#else
72+
return false;
73+
#endif
6774
}
6875
CHIP_ERROR ConfigureOnboardingPayload();
6976

77+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
7078
// Maximum size of the NDEF message (URI record) served by the NDEF Tag Application's NDEF
7179
// file, and total size of that file (message plus its 2-byte NLEN length header).
7280
static constexpr size_t kNdefMessageCapacity = 128;
7381
static constexpr size_t kNdefFileBufferSize = kNdefMessageCapacity + 2;
82+
#endif
7483

7584
private:
7685
// ===== Members that implement the NFCCommissioningManager internal interface.
@@ -103,26 +112,19 @@ class NFCCommissioningManagerImpl final : public NFCCommissioningManager, privat
103112
/** Blocks new Matter AID selection once an NFC PASE session is established. */
104113
void HandleSecureSessionEstablished(const ChipDeviceEvent * event);
105114

106-
// Grant header-local singleton accessors access to sInstance.
107-
friend NFCCommissioningManager & NFCCommissioningMgr();
108-
friend NFCCommissioningManagerImpl & NFCCommissioningMgrImpl();
109-
110-
static Global<NFCCommissioningManagerImpl> sInstance;
111-
115+
#ifdef CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
112116
static constexpr size_t kMaxApduSize = 261;
113117
static constexpr uint8_t kNtlProtocolVersion = 0x01;
114118

115119
// Applications selectable within our single raw ISO-DEP session (see file header).
116-
enum class SelectedApplication
117-
{
120+
enum class SelectedApplication{
118121
kNone,
119122
kMatter,
120123
kNdef,
121124
};
122125

123126
// Elementary files selectable under the NDEF Tag Application, once selected.
124-
enum class SelectedFile
125-
{
127+
enum class SelectedFile{
126128
kNone,
127129
kCapabilityContainer,
128130
kNdefFile,
@@ -347,6 +349,12 @@ class NFCCommissioningManagerImpl final : public NFCCommissioningManager, privat
347349
// Set when tag emulation is stopped during fail-safe rollback. While set, all NFC
348350
// callbacks are ignored to avoid corrupting the NFC platform ring buffer on re-tap.
349351
bool mNfcEmulationPausedForFailSafe = false;
352+
#endif // CONFIG_CHIP_NFC_COMMISSIONING_MODE_POWERED
353+
354+
static Global<NFCCommissioningManagerImpl> sInstance;
355+
356+
friend NFCCommissioningManager & NFCCommissioningMgr();
357+
friend NFCCommissioningManagerImpl & NFCCommissioningMgrImpl();
350358
};
351359

352360
/**

0 commit comments

Comments
 (0)