libero ProASIC3 A3P250 JTAG-DirectC 源码分析二 dp_erase
1、JTAG C代码 实现 JTAG-DirectC v2022.1 User Guide , 源码下载 DirectC | Microchip Technology
void dp_erase(void) { #ifdef ENABLE_DISPLAY dp_display_text("\r\nErasing. Please wait..."); #endif #ifdef CORE_SUPPORT if (dat_support_status & CORE_DAT_SUPPORT_BIT) { #ifdef CORE_PLAIN if ((dat_support_status & CORE_DAT_ENCRYPTION_BIT) == 0u) { dp_disable_rlock(); } #endif #ifdef CORE_ENCRYPT if (dat_support_status & CORE_DAT_ENCRYPTION_BIT) { dp_enc_disable_rlock(); } #endif } #endif dp_flush_global_buf1(); global_buf1[0] = UROW_ERASE_BITS_BYTE0; global_buf1[1] = UROW_ERASE_BITS_BYTE1; global_buf1[2] = UROW_ERASE_BITS_BYTE2; #ifdef CORE_SUPPORT if (dat_support_status & CORE_DAT_SUPPORT_BIT) { global_buf1[0] |= CORE_ERASE_BITS_BYTE0; global_buf1[1] |= CORE_ERASE_BITS_BYTE1; global_buf1[2] |= CORE_ERASE_BITS_BYTE2; } #endif /* This is for FROM erase. Need to get which bits are set to erase from the data file. */ #ifdef FROM_SUPPORT if (dat_support_status & FROM_DAT_SUPPORT_BIT) { global_uchar1 = (DPUCHAR) dp_get_bytes(FRomAddressMask_ID,0U,1U); if (global_uchar1 & 0x1U) { global_buf1[1]|=0x80U; } global_buf1[2] |= (DPUCHAR)(global_uchar1 >> 1U); } #endif #ifdef SECURITY_SUPPORT /* This is for security erase */ if (dat_support_status & SEC_DAT_SUPPORT_BIT) { global_buf1[0] |= 0xeU; } #endif if (error_code == DPE_SUCCESS) { dp_exe_erase(); } return; }
分析:
- 是否 支持 CORE_SUPPORT,根据 libero ProASIC3 A3P250 JTAG 烧录 协议抓取 - 所长 - 博客园 分析 ,不支持
-
global_buf1 数组清零
- global_buf1 数组 赋值 三个字节 分别是 UROW_ERASE_BITS_BYTE0 = 0x00、UROW_ERASE_BITS_BYTE1 = 0x40、UROW_ERASE_BITS_BYTE2 = 0x00;
- 跳转到 dp_exe_erase 函数!
-
dp_read_urow 读取 urow , 暂时未知!
- 擦除指令 opcode = 0x85u ,发送该指令 , 并 读取 23bit , JTAG 状态 迁移到 JTAG_RUN_TEST_IDLE, 执行 dp_poll_erase()函数
- 是否空闲指令 opcode = 0x84u ,读取 数据 5bit , 最后2bit = 0 , 即擦除完毕!判断是否超时 ,MAX_ERASE_POLL = 262140u
JTAG 16种 状态图:

擦除指令发送后, 判断是否擦除完毕 , 指令 0x84 波形抓取:

指令 0x84 返回值 抓取 0x15

浙公网安备 33010602011771号