/*****************************************************************************
 函 数 名  : bsp_amon_resume
 功能描述  : 上电恢复
 输入参数  : 无 
 输出参数  : 无
 返 回 值  : 
 调用函数  : 
 被调函数  : 
 
 修改历史      :
  1.日    期   : 2013年6月6日
    作    者   : f
    修改内容   : 新生成函数

*****************************************************************************/
void bsp_amon_resume()
{
    u32 i;
    u32 j;
    u32 clk_status;
    axi_reg_bak_t * reg_bak;

    for(i=0; i<AXI_CONFIG_BUTT; i++)
    {
        /* 掉电前monitor未运行,不执行恢复操作 */
        if(false == g_ul_running[i])
        {			
            continue;
        }  

        reg_bak = &g_st_reg_bak[i];
        clk_status = axi_is_clk_enable(i);
        if(!clk_status)
        {
            axi_clk_enable(i);
        }

        axi_reset(i);
        
        axi_reg_write(i, AXI_MON_CNT_CTRL, reg_bak->ctrl_reg);
        axi_reg_write(i, AXI_MON_PORT_SEL, reg_bak->port_reg);
        axi_reg_write(i, AXI_ID_INT_MASK, reg_bak->int_mask);
        for(j=0; j<AXI_MAX_CONFIG_ID; j++)
        {
            axi_reg_write(i, AXI_MON_CNT_ID(j), reg_bak->id_reg[j]);
            axi_reg_write(i, AXI_MON_ID_ADDR_DES(j), reg_bak->addr_start_reg[j]);
            axi_reg_write(i, AXI_MON_ID_ADDR_DES_M(j), reg_bak->addr_end_reg[j]);
        } 

        /* 启动monitor */
        axi_sc_mon_start(i);

        if(!clk_status)
        {
            axi_clk_disable(i);
        }         
    }
}
Example #2
0
/*****************************************************************************
 函 数 名  : bsp_amon_suspend
 功能描述  : 掉电前数据备份
 输入参数  : 无 
 输出参数  : 无
 返 回 值  : 
 调用函数  : 
 被调函数  : 
 
 修改历史      :
  1.日    期   : 2013年6月6日
    作    者   : f
    修改内容   : 新生成函数

*****************************************************************************/
void bsp_amon_suspend()
{
    u32 i;
    u32 j;
    u32 reg_value;
    /*lint -save -e958*/
    unsigned long long data_cnt;
    /*lint -restore*/
    u32 data_low;
    u32 data_high;
    axi_state_enum_uint32 state;
    u32 clk_status;
    axi_reg_bak_t * reg_bak;

    for(i=0; i<AXI_CONFIG_BUTT; i++)
    {
        reg_bak = &g_st_reg_bak[i];
        clk_status = axi_is_clk_enable(i);
        if(!clk_status)
        {
            axi_clk_enable(i);
        }
        
        state = axi_get_state(i);
        if(AXI_UNWIN_RUNNING != state)
        {
            g_ul_running[i] = false;

            if(!clk_status)
            {
                axi_clk_disable(i);
            } 
            
            continue;
        }

        /* 备份前,先停止monitor */
        axi_sc_mon_stop(i);
        g_ul_running[i] = true;
        
        /* 控制寄存器备份 */
        axi_reg_read(i, AXI_MON_CNT_CTRL, &(reg_bak->ctrl_reg));
        axi_reg_read(i, AXI_MON_PORT_SEL, &(reg_bak->port_reg));
        axi_reg_read(i, AXI_ID_INT_MASK, &(reg_bak->int_mask));
        for(j=0; j<AXI_MAX_CONFIG_ID; j++)
        {
            axi_reg_read(i, AXI_MON_CNT_ID(j), &(reg_bak->id_reg[j]));
            axi_reg_read(i, AXI_MON_ID_ADDR_DES(j), &(reg_bak->addr_start_reg[j]));
            axi_reg_read(i, AXI_MON_ID_ADDR_DES_M(j), &(reg_bak->addr_end_reg[j]));
        }
        
        /* 第一次下电,清空备份区 */
        if(g_ul_bak_flag[i] == false)
        {
            g_ul_bak_flag[i] = true;
            for(j=0; j<AXI_MAX_CONFIG_ID; j++)
            {
                reg_bak->incr1_reg[j] = 0;
                reg_bak->incr2_reg[j] = 0;
                reg_bak->incr4_reg[j] = 0;
                reg_bak->incr16_reg[j] = 0;
                reg_bak->wrap_reg[j] = 0;
                reg_bak->burst_send_reg[j] = 0;
                reg_bak->burst_fin_reg[j] = 0;
                reg_bak->rd_cnt_high_reg[j] = 0;
                reg_bak->rd_cnt_low_reg[j] = 0;
                reg_bak->wr_cnt_high_reg[j] = 0;
                reg_bak->wr_cnt_low_reg[j] = 0;
            }
        }
        
        /* 统计寄存器累加 */
        for(j=0; j<AXI_MAX_CONFIG_ID; j++)
        {
            axi_reg_read(i, AXI_MON_INCR1_ID(j), &reg_value);
            reg_bak->incr1_reg[j] += reg_value;
            axi_reg_read(i, AXI_MON_INCR2_ID(j), &reg_value);
            reg_bak->incr2_reg[j] += reg_value; 
            axi_reg_read(i, AXI_MON_INCR4_ID(j), &reg_value);
            reg_bak->incr4_reg[j] += reg_value; 
            axi_reg_read(i, AXI_MON_INCR8_ID(j), &reg_value);
            reg_bak->incr8_reg[j] += reg_value;  
            axi_reg_read(i, AXI_MON_INCR16_ID(j), &reg_value);
            reg_bak->incr16_reg[j] += reg_value; 
            axi_reg_read(i, AXI_MON_WRAP_ID(j), &reg_value);
            reg_bak->wrap_reg[j] += reg_value; 
            axi_reg_read(i, AXI_MON_BURST_ID(j), &reg_value);
            reg_bak->burst_send_reg[j] += reg_value; 
            axi_reg_read(i, AXI_MON_FINISH_ID(j), &reg_value);
            reg_bak->burst_fin_reg[j] += reg_value; 
            /* 读写数据总量40bit长度,需要计算溢出值 */
            axi_reg_read(i, AXI_MON_RD_BYTES_ID_LOW(j), &data_low);
            axi_reg_read(i, AXI_MON_RD_BYTES_ID_HIGH(j), &data_high); 
            data_cnt = (unsigned long long)data_low + (unsigned long long)reg_bak->rd_cnt_low_reg[j];
            reg_bak->rd_cnt_high_reg[j] += data_high; 
            if(data_cnt >> 32)
            {
                reg_bak->rd_cnt_high_reg[j] += 1;
            }
            reg_bak->rd_cnt_low_reg[j] = (u32)data_cnt;
            axi_reg_read(i, AXI_MON_WR_BYTES_ID_LOW(j), &data_low);
            axi_reg_read(i, AXI_MON_WR_BYTES_ID_HIGH(j), &data_high); 
            data_cnt = (unsigned long long)data_low + (unsigned long long)reg_bak->wr_cnt_low_reg[j];
            reg_bak->wr_cnt_high_reg[j] += data_high; 
            if(data_cnt >> 32)
            {
                reg_bak->wr_cnt_high_reg[j] += 1;
            }
            reg_bak->wr_cnt_low_reg[j] = (u32)data_cnt;            
        }

        if(!clk_status)
        {
            axi_clk_disable(i);
        }        
    }
}