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;
 | 
						|
}
 |