11/*
22 *
3- * Copyright (c) 2020 Project CHIP Authors
3+ * Copyright (c) 2020, 2025 Project CHIP Authors
44 * Copyright (c) 2020 Nest Labs, Inc.
55 * All rights reserved.
66 *
2020/* *
2121 * @file
2222 * Provides the implementation of the Device Layer ConfigurationManager object
23- * for K32W platforms using the NXP SDK.
23+ * for NXP MCXW7X platforms using the NXP SDK.
2424 */
2525
2626/* this file behaves like a config.h, comes first */
3333#include < src/platform/nxp/mcxw71/SMU2Manager.h>
3434#endif
3535
36- // #include <openthread/platform/misc.h>
3736#include " fsl_cmc.h"
3837#include " fsl_device_registers.h"
3938
39+ #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
40+ #include " OtaSupport.h"
41+ #endif
42+
4043namespace chip {
4144namespace DeviceLayer {
4245
4346using namespace ::chip::DeviceLayer::Internal;
4447
45- // TODO: Define a Singleton instance of CHIP Group Key Store here
46-
4748ConfigurationManagerImpl & ConfigurationManagerImpl::GetDefaultInstance ()
4849{
4950 static ConfigurationManagerImpl sInstance ;
5051 return sInstance ;
5152}
5253
54+ CHIP_ERROR ConfigurationManagerImpl::DetermineBootReason (uint32_t reason)
55+ {
56+ BootReasonType bootReason = BootReasonType::kUnspecified ;
57+
58+ if ((reason & CMC_SRS_POR_MASK) || (reason & CMC_SRS_PIN_MASK))
59+ {
60+ bootReason = BootReasonType::kPowerOnReboot ;
61+ }
62+ else if (reason & CMC_SRS_SW_MASK)
63+ {
64+ bootReason = BootReasonType::kSoftwareReset ;
65+ #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR
66+ OtaImgState_t img_state = OTA_GetImgState ();
67+ if (img_state == OtaImgState_RunCandidate)
68+ {
69+ bootReason = BootReasonType::kSoftwareUpdateCompleted ;
70+ }
71+ #endif
72+ }
73+ else if ((reason & CMC_SRS_WDOG0_MASK) || (reason & CMC_SRS_WDOG1_MASK))
74+ {
75+ bootReason = BootReasonType::kSoftwareWatchdogReset ;
76+ }
77+ else
78+ {
79+ bootReason = BootReasonType::kUnspecified ;
80+ }
81+
82+ return StoreBootReason (to_underlying (bootReason));
83+ }
84+
85+ CHIP_ERROR ConfigurationManagerImpl::StoreSoftwareUpdateCompleted ()
86+ {
87+ /* Empty implementation*/
88+ return CHIP_NO_ERROR;
89+ }
90+
5391CHIP_ERROR ConfigurationManagerImpl::Init ()
5492{
5593 CHIP_ERROR err;
5694 uint32_t rebootCount = 0 ;
5795
96+ // Initialize the generic implementation base class.
97+ err = Internal::GenericConfigurationManagerImpl<NXPConfig>::Init ();
98+ SuccessOrExit (err);
99+
58100 if (NXPConfig::ConfigValueExists (NXPConfig::kCounterKey_RebootCount ))
59101 {
60102 err = GetRebootCount (rebootCount);
@@ -76,16 +118,15 @@ CHIP_ERROR ConfigurationManagerImpl::Init()
76118 SuccessOrExit (err);
77119 }
78120
121+ err = DetermineBootReason (CMC_GetSystemResetStatus (CMC0));
122+ SuccessOrExit (err);
123+
79124 if (!NXPConfig::ConfigValueExists (NXPConfig::kCounterKey_BootReason ))
80125 {
81126 err = StoreBootReason (to_underlying (BootReasonType::kUnspecified ));
82127 SuccessOrExit (err);
83128 }
84129
85- // Initialize the generic implementation base class.
86- err = Internal::GenericConfigurationManagerImpl<NXPConfig>::Init ();
87- SuccessOrExit (err);
88-
89130 // TODO: Initialize the global GroupKeyStore object here
90131
91132 err = CHIP_NO_ERROR;
@@ -94,61 +135,34 @@ CHIP_ERROR ConfigurationManagerImpl::Init()
94135 return err;
95136}
96137
97- CHIP_ERROR ConfigurationManagerImpl::StoreSoftwareUpdateCompleted ( )
138+ CHIP_ERROR ConfigurationManagerImpl::GetPrimaryWiFiMACAddress ( uint8_t * buf )
98139{
99- /* Empty implementation*/
100- return CHIP_NO_ERROR;
140+ return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
101141}
102142
103- CHIP_ERROR ConfigurationManagerImpl::GetRebootCount ( uint32_t & rebootCount )
143+ CHIP_ERROR ConfigurationManagerImpl::GetUniqueId ( char * buf, size_t bufSize )
104144{
105- return ReadConfigValue (NXPConfig::kCounterKey_RebootCount , rebootCount);
106- }
145+ CHIP_ERROR err;
146+ size_t uniqueIdLen = 0 ; // without counting null-terminator
147+ err = ReadConfigValueStr (NXPConfig::kConfigKey_UniqueId , buf, bufSize, uniqueIdLen);
107148
108- CHIP_ERROR ConfigurationManagerImpl::StoreRebootCount (uint32_t rebootCount)
109- {
110- return WriteConfigValue (NXPConfig::kCounterKey_RebootCount , rebootCount);
111- }
149+ ReturnErrorOnFailure (err);
112150
113- CHIP_ERROR ConfigurationManagerImpl::GetTotalOperationalHours (uint32_t & totalOperationalHours)
114- {
115- return ReadConfigValue (NXPConfig::kCounterKey_TotalOperationalHours , totalOperationalHours);
116- }
151+ VerifyOrReturnError (uniqueIdLen < bufSize, CHIP_ERROR_BUFFER_TOO_SMALL);
152+ VerifyOrReturnError (buf[uniqueIdLen] == 0 , CHIP_ERROR_INVALID_STRING_LENGTH);
117153
118- CHIP_ERROR ConfigurationManagerImpl::StoreTotalOperationalHours (uint32_t totalOperationalHours)
119- {
120- return WriteConfigValue (NXPConfig::kCounterKey_TotalOperationalHours , totalOperationalHours);
154+ return err;
121155}
122156
123- CHIP_ERROR ConfigurationManagerImpl::GetBootReason ( uint32_t & bootReason )
157+ CHIP_ERROR ConfigurationManagerImpl::StoreUniqueId ( const char * uniqueId, size_t uniqueIdLen )
124158{
125- bootReason = to_underlying (BootReasonType::kUnspecified );
126-
127- uint32_t reason = CMC_GetSystemResetStatus (CMC0);
128-
129- if ((reason & CMC_SRS_POR_MASK) || (reason & CMC_SRS_PIN_MASK))
130- {
131- bootReason = to_underlying (BootReasonType::kPowerOnReboot );
132- }
133- else if (reason & CMC_SRS_SW_MASK)
134- {
135- bootReason = to_underlying (BootReasonType::kSoftwareReset );
136- }
137- else if ((reason & CMC_SRS_WDOG0_MASK) || (reason & CMC_SRS_WDOG1_MASK))
138- {
139- bootReason = to_underlying (BootReasonType::kSoftwareWatchdogReset );
140- }
141- else
142- {
143- bootReason = to_underlying (BootReasonType::kUnspecified );
144- }
145-
146- return CHIP_NO_ERROR;
159+ return WriteConfigValueStr (NXPConfig::kConfigKey_UniqueId , uniqueId, uniqueIdLen);
147160}
148161
149- CHIP_ERROR ConfigurationManagerImpl::StoreBootReason ( uint32_t bootReason )
162+ CHIP_ERROR ConfigurationManagerImpl::GenerateUniqueId ( char * buf, size_t bufSize )
150163{
151- return WriteConfigValue (NXPConfig::kCounterKey_BootReason , bootReason);
164+ uint64_t randomUniqueId = Crypto::GetRandU64 ();
165+ return Encoding::BytesToUppercaseHexString (reinterpret_cast <uint8_t *>(&randomUniqueId), sizeof (uint64_t ), buf, bufSize);
152166}
153167
154168bool ConfigurationManagerImpl::CanFactoryReset ()
@@ -280,11 +294,41 @@ void ConfigurationManagerImpl::DoFactoryReset(intptr_t arg)
280294 // Restart the system.
281295 ChipLogProgress (DeviceLayer, " System restarting" );
282296
283- NVIC_SystemReset ();
297+ #if CONFIG_CHIP_NXP_PLATFORM_MCXW71
298+ PlatformMgrImpl ().Reset ();
299+ #else
300+ PlatformMgrImpl ().ScheduleResetInIdle ();
301+ #endif
302+ }
284303
285- while (1 )
286- {
287- }
304+ CHIP_ERROR ConfigurationManagerImpl::GetRebootCount (uint32_t & rebootCount)
305+ {
306+ return ReadConfigValue (NXPConfig::kCounterKey_RebootCount , rebootCount);
307+ }
308+
309+ CHIP_ERROR ConfigurationManagerImpl::StoreRebootCount (uint32_t rebootCount)
310+ {
311+ return WriteConfigValue (NXPConfig::kCounterKey_RebootCount , rebootCount);
312+ }
313+
314+ CHIP_ERROR ConfigurationManagerImpl::GetBootReason (uint32_t & bootReason)
315+ {
316+ return ReadConfigValue (NXPConfig::kCounterKey_BootReason , bootReason);
317+ }
318+
319+ CHIP_ERROR ConfigurationManagerImpl::StoreBootReason (uint32_t bootReason)
320+ {
321+ return WriteConfigValue (NXPConfig::kCounterKey_BootReason , bootReason);
322+ }
323+
324+ CHIP_ERROR ConfigurationManagerImpl::GetTotalOperationalHours (uint32_t & totalOperationalHours)
325+ {
326+ return ReadConfigValue (NXPConfig::kCounterKey_TotalOperationalHours , totalOperationalHours);
327+ }
328+
329+ CHIP_ERROR ConfigurationManagerImpl::StoreTotalOperationalHours (uint32_t totalOperationalHours)
330+ {
331+ return WriteConfigValue (NXPConfig::kCounterKey_TotalOperationalHours , totalOperationalHours);
288332}
289333
290334ConfigurationManager & ConfigurationMgrImpl ()
0 commit comments