m_reburn_print_api.log_print((const char*)localBuf);\r
}\r
\r
-static int is_sec_empty(uint8_t* buf, uint32_t len) {\r
- for (int i = 0 ; i < len ; i++) {\r
- if (buf[i] != m_var.sec_empty_value) {\r
- printf("is_sec_empty(): block %d not empty(0x%02x)\n", i, buf[i]);\r
- return 0;\r
- }\r
- }\r
-\r
- return 1;\r
-}\r
-\r
static void dump_sec(uint8_t* buf, uint32_t len) {\r
uint32_t offset = 0, remainBytes = len;\r
\r
return;\r
\r
while (remainBytes >= 16) {\r
- printf("%08x | %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", offset,\r
+ reburn_log_printf("%08x | %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", offset,\r
*(buf + (offset) + 0 ), *(buf + (offset) + 1 ), *(buf + (offset) + 2 ), *(buf + (offset) + 3 ),\r
*(buf + (offset) + 4 ), *(buf + (offset) + 5 ), *(buf + (offset) + 6 ), *(buf + (offset) + 7 ),\r
*(buf + (offset) + 8 ), *(buf + (offset) + 9 ), *(buf + (offset) + 10), *(buf + (offset) + 11),\r
}\r
}\r
\r
+static int is_block_blank(uint8_t* buf, uint32_t len, int show_msg) {\r
+ dump_sec(buf, len);\r
+\r
+ for (int i = 0 ; i < len ; i++) {\r
+ if (buf[i] != m_var.sec_blank_value) {\r
+ if (show_msg)\r
+ reburn_log_printf("[is_block_blank] block %d not empty(0x%02x)\n", i, buf[i]);\r
+ return 0;\r
+ }\r
+ }\r
+\r
+ return 1;\r
+}\r
+\r
+static int write_sec(unsigned int sec_is_blank, unsigned char *p_rbuf, unsigned char *p_wbuf, int len) {\r
+ int ret;\r
+ int total = m_var.sec_write_len;\r
+ int bytes_per_write = m_var.sec_bytes_per_write;\r
+ unsigned char blank_val = m_var.sec_blank_value;\r
+\r
+ if (sec_is_blank) {\r
+ reburn_log_printf("[write_sec] mode:write all\n");\r
+\r
+ if (m_var.p_func_write_ex) {\r
+ ret = m_var.p_func_write_ex(0, p_wbuf, total);\r
+ if (ret != 1) {\r
+ reburn_log_printf("[write_sec] write_ex failed(%d)\n", ret);\r
+ return -1;\r
+ }\r
+ } else {\r
+ ret = impl_sec_write(p_wbuf, total);\r
+ if ( ret != 1) {\r
+ reburn_log_printf("[write_sec] write failed(%d)\n", ret);\r
+ return -2;\r
+ }\r
+ }\r
+ } else {\r
+ reburn_log_printf("[write_sec] mode:%d byte \n", bytes_per_write);\r
+\r
+ if (m_var.p_func_write_ex && bytes_per_write > 0) {\r
+ } else {\r
+ reburn_log_printf("[write_sec] error, not support partial write\n");\r
+ return -3;\r
+ }\r
+\r
+ for (int i = 0; i < total / bytes_per_write; i ++) {\r
+ int offset, block_blank, block_the_same, do_write;\r
+\r
+ offset = (i * bytes_per_write);\r
+ block_blank = is_block_blank(p_rbuf + offset, bytes_per_write, 0);\r
+ do_write = 0;\r
+\r
+ if (memcmp(p_rbuf + offset, p_wbuf + offset, bytes_per_write) == 0)\r
+ block_the_same = 1;\r
+ else\r
+ block_the_same = 0;\r
+\r
+ if (block_the_same == 0 && block_blank == 0 && m_var.force_write_even_dirty == 0) {\r
+ reburn_log_printf("[write_sec] error, force_write_even_dirty=0\n", *(p_rbuf + offset), blank_val);\r
+ return -4;\r
+ }\r
+\r
+ if (block_the_same == 0) {\r
+ if (block_blank == 1 || m_var.force_write_even_dirty == 1)\r
+ do_write = 1;\r
+ }\r
+\r
+ if (do_write) {\r
+ ret = m_var.p_func_write_ex(offset, p_wbuf + offset, bytes_per_write);\r
+ if (ret != 1) {\r
+ reburn_log_printf("[write_sec] write_ex failed(%d)\n", ret);\r
+ return -5;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return 1;\r
+}\r
+\r
+int erase_and_confirm(unsigned char *pbuf, unsigned int len) {\r
+ int ret;\r
+\r
+ ret = impl_sec_erase();\r
+ if (ret != 1) {\r
+ reburn_log_printf("[erase_and_confirm] erase error(%d)\n", ret);\r
+ return -1;\r
+ }\r
+\r
+ memset(pbuf, 0x0, len);\r
+ ret = impl_sec_read(pbuf, len);\r
+ if (ret != 1) {\r
+ reburn_log_printf("[erase_and_confirm] read error(%d)\n", ret);\r
+ return -2;\r
+ }\r
+\r
+ if (!is_block_blank(pbuf, len, 1)) {\r
+ reburn_log_printf("[erase_and_confirm] block is not cleaned\n");\r
+ return -3;\r
+ }\r
+\r
+ return 1;\r
+}\r
+\r
int reburn_second_dev(void) {\r
SettingControl_t scl;\r
char str_chipInfo[48];\r
- unsigned char buf[256];\r
- char EncodeData[512];\r
- int len = 0, ret = 0;\r
+ unsigned char sec_from_device[512];\r
+ unsigned char sec_from_lib[512];\r
+ int len = 0, ret = 0, sec_is_blank = 0;\r
\r
impl_prepare(&m_var);\r
- printf("[reburn_second_dev] Built at %s %s\n", __DATE__, __TIME__);\r
+\r
+ reburn_log_printf("[reburn_second_dev] Built at %s %s\n", __DATE__, __TIME__);\r
\r
if (!impl_checkMcuModel()) {\r
- printf("cannot reburn: wrong model \r\n");\r
+ reburn_log_printf("cannot reburn: wrong model\n");\r
return STS_ERR_WRONG_MODEL;\r
}\r
\r
scl.iData[0] = 1;\r
CWM_SettingControl(SCL_GET_LIB_INFO, &scl);\r
if (scl.iData[5] < 3000) {\r
- printf("%d Not a valid reburn library\n", scl.iData[5]);\r
+ reburn_log_printf("cannot reburn: %d not a valid reburn library\n", scl.iData[5]);\r
return STS_ERR_INVALID_LIB;\r
}\r
- printf("model:%s version:%d.%d.%d.%d product:%d\n", m_var.chip_name, scl.iData[1], scl.iData[2], scl.iData[3], scl.iData[4], scl.iData[5]);\r
+ reburn_log_printf("model:%s version:%d.%d.%d.%d product:%d\n", m_var.chip_name, scl.iData[1], scl.iData[2], scl.iData[3], scl.iData[4], scl.iData[5]);\r
\r
impl_sec_env_init();\r
\r
impl_stick_env_init();\r
- // uint8_t buffer[80] = {0};\r
- // uapi_efuse_read_buffer(buffer, 0x100, 80);\r
- // printf("reburn buffer : ");\r
- // for(int i = 0 ; i < 80 ; i++)\r
- // printf("%d",buffer[i]);\r
- // printf("\n");\r
+\r
CWM_LibPostInit(NULL);\r
\r
if (secFactory_init(0) != 1) {\r
- printf("secFactory_init fail\n");\r
+ reburn_log_printf("cannot reburn: secFactory_init fail\n");\r
return STS_ERR_SEC_INIT;\r
}\r
\r
scl.iData[5] = 0;\r
scl.iData[6] = 0;\r
CWM_SettingControl(SCL_GET_CHIP_INFO, &scl);\r
- printf("have_security = %d.%d ret_buff_size = %d\n", scl.iData[5], scl.iData[6], scl.iData[4]);\r
- printf("[getinfo]chipInfo=%s\n", str_chipInfo);\r
+ reburn_log_printf("have_security = %d.%d ret_buff_size = %d\n", scl.iData[5], scl.iData[6], scl.iData[4]);\r
+ reburn_log_printf("[getinfo]chipInfo=%s\n", str_chipInfo);\r
if (scl.iData[5] == 1) {\r
- printf("valid security found\n");\r
+ reburn_log_printf("valid security found\n");\r
return STS_OK;\r
}\r
\r
- memset(buf, 0x0, sizeof(buf));\r
- ret = impl_sec_read(buf, m_var.sec_write_len);\r
- if (ret != 1) {\r
- printf("cannot reburn: read error(%d)\n", ret);\r
- return STS_ERR_SEC_READ_FAIL;\r
- }\r
- dump_sec(buf, m_var.sec_write_len);\r
-\r
if (impl_sec_is_locked()) {\r
- printf("cannot reburn: locked\n");\r
+ reburn_log_printf("cannot reburn: locked\n");\r
return STS_ERR_MEDIUM_LOCKED;\r
}\r
\r
- if (!is_sec_empty(buf, m_var.sec_write_len)) {\r
- if (!m_var.sec_rewritable) {\r
- printf("cannot reburn: block not empty\n");\r
- return STS_ERR_BLOCK_NOT_EMPTY;\r
- }\r
- ret = impl_sec_erase();\r
- if (ret != 1) {\r
- printf("cannot reburn: erase error(%d)\n", ret);\r
- return STS_ERR_ERASE_FAILED;\r
+ memset(sec_from_device, 0x0, sizeof(sec_from_device));\r
+ ret = impl_sec_read(sec_from_device, m_var.sec_write_len);\r
+ if (ret != 1) {\r
+ reburn_log_printf("cannot reburn: read error(%d)\n", ret);\r
+ return STS_ERR_SEC_READ_FAIL;\r
+ }\r
+\r
+ if (is_block_blank(sec_from_device, m_var.sec_write_len, 1)) {\r
+ sec_is_blank = 1;\r
+ } else {\r
+ if (m_var.sec_erasable) {\r
+ ret = erase_and_confirm(sec_from_device, m_var.sec_write_len);\r
+ if (ret != 1) {\r
+ reburn_log_printf("cannot reburn: erase not success (%d)\n", ret);\r
+ return STS_ERR_ERASE_FAILED;\r
+ } else {\r
+ sec_is_blank = 1;\r
+ }\r
}\r
}\r
\r
if (secFactory_make_chipInfo(str_chipInfo) != 1) {\r
- printf("secFactory_make_chipInfo fail\n");\r
+ reburn_log_printf("secFactory_make_chipInfo fail\n");\r
return STS_ERR_SEC_MAKE_CHIPINFO;\r
}\r
- printf("[makesec]chipInfo=%s\n", str_chipInfo);\r
+ reburn_log_printf("[makesec]chipInfo=%s\n", str_chipInfo);\r
\r
- memset(EncodeData, 0, sizeof(EncodeData));\r
- ret = secFactory_make_sec(0x01, EncodeData, &len);\r
+ memset(sec_from_lib, 0, sizeof(sec_from_lib));\r
+ ret = secFactory_make_sec(0x01, (char*)sec_from_lib, &len);\r
if (ret != 1) {\r
- printf("secFactory_make_sec fail\n");\r
+ reburn_log_printf("secFactory_make_sec fail\n");\r
return STS_ERR_SEC_MAKE_SEC;\r
}\r
\r
if (len < m_var.sec_write_len) {\r
- printf("sec length error(%d/%d)\n", len, m_var.sec_write_len);\r
+ reburn_log_printf("sec length error(%d/%d)\n", len, m_var.sec_write_len);\r
return STS_ERR_SEC_WRITE_LEN;\r
}\r
\r
- ret = impl_sec_write((uint8_t*)&EncodeData[0], len);\r
+ ret = write_sec(sec_is_blank, sec_from_device, sec_from_lib, m_var.sec_write_len);\r
if (ret != 1) {\r
- printf("cannot reburn: write error(%d)\n", ret);\r
+ reburn_log_printf("cannot reburn: write error(%d)\n", ret);\r
return STS_ERR_SEC_WRITE;\r
}\r
\r
- printf("reburn complete\n");\r
+ reburn_log_printf("reburn complete\n");\r
\r
return STS_OK;\r
}\r