130 lines
1.9 KiB
C
130 lines
1.9 KiB
C
|
|
|
|||
|
|
#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>λ
|
|||
|
|
}
|