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

 

分析: 

  1. 是否 支持 CORE_SUPPORT,根据   libero ProASIC3 A3P250 JTAG 烧录 协议抓取 - 所长 - 博客园  分析 ,不支持 
  2. global_buf1 数组清零
  3.  global_buf1  数组 赋值 三个字节 分别是 UROW_ERASE_BITS_BYTE0 = 0x00、UROW_ERASE_BITS_BYTE1 = 0x40、UROW_ERASE_BITS_BYTE2 = 0x00;
  4. 跳转到  dp_exe_erase 函数!
  5. dp_read_urow  读取 urow ,  暂时未知!
  6. 擦除指令 opcode = 0x85u ,发送该指令 , 并 读取 23bit  ,  JTAG 状态 迁移到  JTAG_RUN_TEST_IDLE, 执行 dp_poll_erase()函数
  7. 是否空闲指令 opcode = 0x84u ,读取 数据 5bit ,   最后2bit  = 0 , 即擦除完毕!判断是否超时 ,MAX_ERASE_POLL =  262140u

 

JTAG 16种 状态图:

image

 

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

image

 

指令 0x84  返回值 抓取  0x15

image

 

posted on 2026-01-19 17:39  所长  阅读(0)  评论(0)    收藏  举报

导航