95 lines
3.0 KiB
C
95 lines
3.0 KiB
C
/*================================================================
|
|
Copyright (c) 2021, Quectel Wireless Solutions Co., Ltd. All rights reserved.
|
|
Quectel Wireless Solutions Proprietary and Confidential.
|
|
=================================================================*/
|
|
#include <stdio.h>
|
|
#include "ql_application.h"
|
|
#include "ql_otp.h"
|
|
|
|
//NOTES:If secboot is enabled, operation of bank1 and bank2 areas is prohibited
|
|
//如果使能了secboot,禁止操作bank1和bank2区域
|
|
/*Fuse的每个Bit写1有效,而且只能写一次*/
|
|
/*当板子使能了secboot,禁止向bank1、bank2写数据,会导致板子启动不了且不能恢复!!!*/
|
|
/*当板子使能了secboot,禁止向bank1、bank2写数据,会导致板子启动不了且不能恢复!!!*/
|
|
/*当板子使能了secboot,禁止向bank1、bank2写数据,会导致板子启动不了且不能恢复!!!*/
|
|
void quec_otp_bank1_test(void * argv)
|
|
{
|
|
int ret = 0;
|
|
unsigned int bank1_key1_t1=0;
|
|
unsigned int bank1_key1_t2=0;
|
|
|
|
unsigned int bank1_key1=0;
|
|
|
|
ql_rtos_task_sleep_s(10);
|
|
printf("<------quec_otp_bank1_test------>\r\n");
|
|
|
|
ret = ql_otp_read(GEU_FUSE_VAL_OEM_HASH_KEY1,&bank1_key1);
|
|
if(ret<0)
|
|
printf("ERR:first:ql_otp_read()-GEU_FUSE_VAL_ROOT_KEY1 fail ret=%d\r\n",ret);
|
|
|
|
printf("Get GEU_FUSE_VAL_ROOT_KEY1 bank1_key1=0x%x\r\n",bank1_key1);
|
|
|
|
bank1_key1_t1 |= (1<<31);//set bit31 to 1
|
|
printf("Will Set BANK1 Bit31 to 1\r\n");
|
|
ret = ql_otp_write(GEU_FUSE_VAL_OEM_HASH_KEY1,bank1_key1_t1);
|
|
if(ret<0)
|
|
printf("ERR:first:ql_otp_write()-GEU_FUSE_VAL_ROOT_KEY1 fail ret=%d\r\n",ret);
|
|
bank1_key1_t1 = 0;
|
|
ret = ql_otp_read(GEU_FUSE_VAL_OEM_HASH_KEY1,&bank1_key1_t1);
|
|
if(ret<0)
|
|
printf("ERR:second:ql_otp_read()-GEU_FUSE_VAL_ROOT_KEY1 fail ret=%d\r\n",ret);
|
|
|
|
printf("Get bank1_key1_t1(0x%x)\r\n",bank1_key1_t1);
|
|
|
|
bank1_key1_t2 |= (1<<0);//set bit0 to 1
|
|
printf("Will Set BANK1 Bit0 to 1\r\n");
|
|
ret = ql_otp_write(GEU_FUSE_VAL_OEM_HASH_KEY1,bank1_key1_t2);
|
|
if(ret<0)
|
|
printf("ERR:second:ql_otp_write()-GEU_FUSE_VAL_ROOT_KEY1 fail ret=%d\r\n",ret);
|
|
|
|
ret = ql_otp_read(GEU_FUSE_VAL_OEM_HASH_KEY1,&bank1_key1);
|
|
if(ret<0)
|
|
printf("ERR:3:ql_otp_read()-GEU_FUSE_VAL_ROOT_KEY1 fail ret=%d\r\n",ret);
|
|
|
|
printf("Get bank1_key1(0x%x)\r\n",bank1_key1);
|
|
|
|
for(;;)
|
|
{
|
|
if(1 == ((bank1_key1>>31)&1))
|
|
printf("This is 'A'\r\n");
|
|
|
|
if(1 == ((bank1_key1>>0)&1))
|
|
printf("This is 'B'\r\n");
|
|
|
|
if((1 == ((bank1_key1>>0)&1))&&(1 == ((bank1_key1>>31)&1)))
|
|
printf("This is 'C'\r\n");
|
|
|
|
ql_rtos_task_sleep_s(3);
|
|
printf("this is bank1 tast\r\n");
|
|
}
|
|
}
|
|
|
|
|
|
//read-write interface to OTP
|
|
static void quec_otp_test(void * argv)
|
|
{
|
|
ql_rtos_task_sleep_s(10);
|
|
printf("<------example_otp.c------>\r\n");
|
|
|
|
unsigned int fuse_id = 0;
|
|
ql_otp_read(GEU_FUSE_ADDR_READ_USE1,&fuse_id);
|
|
printf("0x%x\n",fuse_id);
|
|
|
|
fuse_id = 0x1;
|
|
ql_otp_write(GEU_FUSE_ADDR_WRITE_USE1,fuse_id);
|
|
fuse_id = 0;
|
|
|
|
ql_otp_read(GEU_FUSE_ADDR_READ_USE1,&fuse_id);
|
|
printf("0x%x\n",fuse_id);
|
|
}
|
|
|
|
// application_init(quec_otp_test, "quec_otp_test", 2, 0);
|
|
// application_init(quec_otp_bank1_test, "quec_otp_test", 2, 0);
|
|
|
|
|