112 lines
3.8 KiB
C
112 lines
3.8 KiB
C
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
#include "os_types.h"
|
|
#include "iot_io.h"
|
|
#include "dbg_io.h"
|
|
#include "hw_reg_api.h"
|
|
|
|
#include "efuse.h"
|
|
#include "efuse_mapping.h"
|
|
#define EFUSE_DONE_OK 0
|
|
#define EFUSE_EMPTY 1
|
|
#define EFUSE_ERROR_DATA 2
|
|
|
|
uint8_t efuse_prog_done()
|
|
{
|
|
uint32_t i = 0;
|
|
uint32_t tmp = 0;
|
|
bool_t check_empty = true;
|
|
/* check 2048 efuse bit */
|
|
for(i = 0; i < 64; i++) {
|
|
tmp = efuse_read(i*4);
|
|
if (tmp != 0) {
|
|
check_empty = false;
|
|
}
|
|
}
|
|
|
|
if (check_empty == true) {
|
|
iot_printf("This is empty board, do nothing\n");
|
|
return EFUSE_EMPTY;
|
|
} else {
|
|
/* check mac addr */
|
|
tmp = efuse_read(CFG_EFUSE_BITS32_7_ADDR);
|
|
iot_printf("efuse pkg version: %x\n",
|
|
(tmp & VERSION_PKG_MASK)>>VERSION_PKG_OFFSET);
|
|
tmp = efuse_read(CFG_EFUSE_BITS32_0_ADDR);
|
|
iot_printf("efuse wafer version: %x\n",
|
|
(tmp & VERSION_WAFER_MASK)>>VERSION_WAFER_OFFSET);
|
|
iot_printf("efuse reserve version: %x\n",
|
|
(tmp & VERSION_WAFER_MASK)>>VERSION_WAFER_OFFSET);
|
|
|
|
tmp = efuse_read(CFG_EFUSE_BITS32_2_ADDR);
|
|
if(0x48 != REG_FIELD_GET(MAC_ADDR_B0,tmp)){
|
|
iot_printf("efuse mac address error\n");
|
|
return EFUSE_ERROR_DATA;
|
|
}
|
|
tmp = efuse_read(CFG_EFUSE_BITS32_3_ADDR);
|
|
if(0x55 != REG_FIELD_GET(MAC_ADDR_B1,tmp)){
|
|
iot_printf("efuse mac address error\n");
|
|
return EFUSE_ERROR_DATA;
|
|
}
|
|
tmp = efuse_read(CFG_EFUSE_BITS32_3_ADDR);
|
|
if(0x5c != REG_FIELD_GET(MAC_ADDR_B2,tmp)){
|
|
iot_printf("efuse mac address error\n");
|
|
return EFUSE_ERROR_DATA;
|
|
}
|
|
|
|
/* efuse prog done */
|
|
tmp = efuse_read(CFG_EFUSE_BITS32_0_ADDR);
|
|
if (0x1 != REG_FIELD_GET(VENDOR_EFUSE_PROG_DONE, tmp) ||
|
|
0x1 != REG_FIELD_GET(VENDOR_EFUSE_PROG_DONE_BACKUP, tmp)) {
|
|
iot_printf("efuse program done bit is 0, set it to 1\n");
|
|
tmp = 0;
|
|
REG_FIELD_SET(VENDOR_EFUSE_PROG_DONE, tmp, 1);
|
|
REG_FIELD_SET(VENDOR_EFUSE_PROG_DONE_BACKUP, tmp, 1);
|
|
efuse_write(CFG_EFUSE_BITS32_0_ADDR, tmp);
|
|
}
|
|
/* efuse: user space prog done */
|
|
tmp = efuse_read(0x20);
|
|
if (((tmp & 0x10000) == 0) || ((tmp & 0x1000000) == 0)) {
|
|
iot_printf("efuse user program done bit is 0, set it to 1\n");
|
|
tmp = 0;
|
|
tmp |= (1 << 16);
|
|
tmp |= (1 << 24);
|
|
efuse_write(0x20, tmp);
|
|
}
|
|
|
|
return EFUSE_DONE_OK;
|
|
}
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
uint8_t ret = 0;
|
|
dbg_uart_init();
|
|
|
|
iot_printf("start testing\n");
|
|
|
|
ret = efuse_prog_done();
|
|
|
|
if (ret == EFUSE_EMPTY) {
|
|
iot_printf("efuse empty, result: ###program done failed###\n");
|
|
} else if (ret == EFUSE_ERROR_DATA) {
|
|
iot_printf("efuse data not match, result: ###program done failed###\n");
|
|
} else if ( ret == EFUSE_DONE_OK) {
|
|
iot_printf("efuse program done , result: ###program done successful###\n");
|
|
}
|
|
|
|
return 0;
|
|
}
|