/***************************************************************************** 函 数 名 : 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); } } }
/***************************************************************************** 函 数 名 : 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), ®_value); reg_bak->incr1_reg[j] += reg_value; axi_reg_read(i, AXI_MON_INCR2_ID(j), ®_value); reg_bak->incr2_reg[j] += reg_value; axi_reg_read(i, AXI_MON_INCR4_ID(j), ®_value); reg_bak->incr4_reg[j] += reg_value; axi_reg_read(i, AXI_MON_INCR8_ID(j), ®_value); reg_bak->incr8_reg[j] += reg_value; axi_reg_read(i, AXI_MON_INCR16_ID(j), ®_value); reg_bak->incr16_reg[j] += reg_value; axi_reg_read(i, AXI_MON_WRAP_ID(j), ®_value); reg_bak->wrap_reg[j] += reg_value; axi_reg_read(i, AXI_MON_BURST_ID(j), ®_value); reg_bak->burst_send_reg[j] += reg_value; axi_reg_read(i, AXI_MON_FINISH_ID(j), ®_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); } } }