MCUXpresso_MIMXRT1021xxxxx/components/silicon_id/fsl_silicon_id.c

103 lines
2.6 KiB
C

/*
* Copyright 2022-2023 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "fsl_silicon_id.h"
#if defined(SIM)
#include "fsl_sim.h"
#elif defined(FSL_FEATURE_SYSCON_IAP_ENTRY_LOCATION)
#include "fsl_iap.h"
#elif (defined(FSL_FEATURE_SYSCON_ROMAPI) && (FSL_FEATURE_SYSCON_ROMAPI == 1))
#include "fsl_flash.h"
#include "fsl_flash_ffr.h"
#endif
/* Component ID definition, used by tools. */
#ifndef FSL_COMPONENT_ID
#define FSL_COMPONENT_ID "component.silicon_id"
#endif
status_t SILICONID_GetID(uint8_t *siliconId, uint32_t *idLen)
{
assert((siliconId != NULL) && (idLen != NULL) && (*idLen != 0U));
status_t result = kStatus_Fail;
#if defined(SIM)
assert(sizeof(sim_uid_t) <= SILICONID_MAX_LENGTH);
uint32_t readBytes = *idLen;
sim_uid_t uid;
SIM_GetUniqueId(&uid);
readBytes = (readBytes > sizeof(sim_uid_t)) ? sizeof(sim_uid_t) : readBytes;
(void)memcpy((void *)&siliconId[0], (void *)(uint8_t *)&uid, readBytes);
*idLen = readBytes;
result = kStatus_Success;
#elif defined(FSL_FEATURE_SYSCON_IAP_ENTRY_LOCATION)
uint32_t readBytes = *idLen;
uint8_t uid[16];
result = IAP_ReadUniqueID((uint32_t *)(uintptr_t)&uid[0]);
if (result == kStatus_Success)
{
readBytes = (readBytes > 16U) ? 16U : readBytes;
(void)memcpy((void *)&siliconId[0], (void *)&uid[0], readBytes);
*idLen = readBytes;
}
else
{
*idLen = 0;
}
#elif (defined(FSL_FEATURE_SYSCON_ROMAPI) && FSL_FEATURE_SYSCON_ROMAPI)
flash_config_t s_flashDriver;
(void)memset(&s_flashDriver, 0, sizeof(flash_config_t));
result = FLASH_Init(&s_flashDriver);
if (result == kStatus_Success)
{
result = FFR_Init(&s_flashDriver);
if (result == kStatus_Success)
{
result = FFR_GetUUID(&s_flashDriver, siliconId);
*idLen = 4;
}
}
#else
extern status_t SILICONID_ReadUniqueID(uint8_t * siliconId, uint32_t * idLen);
result = SILICONID_ReadUniqueID(&siliconId[0], idLen);
#endif
return result;
}
status_t SILICONID_ConvertToMacAddr(uint8_t (*macAddr)[6])
{
status_t result;
uint8_t siliconId[SILICONID_MAX_LENGTH];
uint32_t idLen = sizeof(siliconId);
result = SILICONID_GetID(&siliconId[0], &idLen);
if (result != kStatus_Success)
{
return result;
}
/* Valid ID should > 3. */
assert(idLen >= 3U);
/* Set NXP OUI. */
macAddr[0][0] = 0x54;
macAddr[0][1] = 0x27;
macAddr[0][2] = 0x8d;
/* Set with silicon id. */
macAddr[0][3] = siliconId[0];
macAddr[0][4] = siliconId[1];
macAddr[0][5] = siliconId[2];
return result;
}