optical/NxBase/cpuid.c

130 lines
1.9 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#include "cpuid.h"
#include "crc32.h"
#define CPUID_BEG UID_BASE
#define ID_SEQUE (4671014970607679160ull) // 0x40D2C75E1F9A36B8
#define STM32_CPUID_LEN 12 // stm32 cpuid <20><><EFBFBD><EFBFBD>
// <20>õ<EFBFBD> CPU ID<49><44><EFBFBD><EFBFBD>16<31>ֽ<EFBFBD>
u32 g_cpuIDBeg = CPUID_BEG;
void InitCpuIDBase(u32 base)
{
g_cpuIDBeg = base;
}
void GetCpuID(CpuId * pId)
{
int i;
u8 * pBuf;
u8 dat;
u32 addr = (g_cpuIDBeg) / 7;
if (pId != NULL)
{
addr *= 7;
addr += (g_cpuIDBeg) % 7;
pBuf = (u8*)(addr);
for (i = 0; i < STM32_CPUID_LEN; i++)
{
dat = *pBuf;
pId->buff[i] = dat;
pBuf++;
}
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Ϊid<69>ӳ<EFBFBD><D3B3><EFBFBD>
pId->dword.dword4 = CalcCrc32(pId->buff, STM32_CPUID_LEN);
#if (0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
printf("\r\nread cpuid: ");
for (i = 0; i < CPUID_LEN; i++)
{
printf("%02x ", pId->buff[i]);
}
printf("\r\n");
#endif
#if (1) // <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
{
#define XMOVE_NUM 1 // <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1--7<><37><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>
// ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
uint64_t seque = ID_SEQUE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 idx, temp, first;
CpuId tmpbuf;
memcpy(tmpbuf.buff, pId->buff, CPUID_LEN);
// ȡ<><C8A1> <20><><EFBFBD><EFBFBD>
for (i = 0; i < CPUID_LEN; i++)
{
dat = tmpbuf.buff[i];
idx = (seque & 0x0F);
seque >>= 4;
pId->buff[idx] = ~dat;
}
// <20><>λ
for (idx = 0; idx < XMOVE_NUM; idx++)
{
first = pId->buff[0];
for (i = 1; i <= CPUID_LEN; i++)
{
dat = pId->buff[i-1];
dat >>= 1;
if (i == CPUID_LEN)
{
temp = first;
}
else
{
temp = pId->buff[i];
}
temp <<= 7;
dat |= temp;
pId->buff[i-1] = dat;
}
}
}
#endif
}
}
//----------------------------------
static int g_cricount = 0;
void EnterCritical(void)
{
if (g_cricount == 0)
{
__disable_irq();
}
g_cricount++;
}
void ExitCritical(void)
{
if (g_cricount != 0)
{
g_cricount--;
}
if (g_cricount == 0)
{
__enable_irq();
}
}
// STM32<33><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
void RestartMcu(void)
{
printf("restart the mcu...\r\n");
__disable_irq();
NVIC_SystemReset(); // ϵͳ<CFB5><CDB3>λ
}