📄 sec2_diag.c
字号:
/************************************************************************
* 版权所有 (C)2005, 深圳市中兴通讯股份有限公司。
*
* 文件名称: sec2_diag.c
* 文件标识: 见配置管理计划书
* 内容摘要: sec2诊断测试
* 其它说明:
* 当前版本: V1.0
* 作 者: 陈晓
* 完成日期: 2007年03月27日
*
* 修改记录1:
* 修改日期:
* 版 本 号:
* 修 改 人:陈 晓
* 修改内容:创 建
* 修改记录2:…
************************************************************************
*
*/
#include "sec2_diag.h"
diag_sec2_internal* diag_sec2 = (diag_sec2_internal*)NULL;
int drv_Sec2RegisterDiag(void)
{
return diag_prjIntfCardCtrlRegist((UINT32)20, diag_prjSec2Parse, drv_Sec2Diag);
}
/******************************************************
Function:
diag_prjSec2Parse()
Description:
Sec2诊断参数解析函数
Inputs:
pMsg OAM消息
pLe1veParam 项目诊断参数
Outputs:
Returns:
OK or ERROR
Remarks:
*******************************************************/
int diag_prjSec2Parse(MSG_COMM_OAM *pMsg, diagPrjParam *pSec2Param)
{
DIAG_TRACE(DIAG_NORMAL_FN_ID,"diag_prjSec2Parse --",0,0,0,0,0,0);
if(NULL== pMsg || NULL == pSec2Param)
{
DIAG_TRACE(DIAG_ERR_FN_ID,"diag_prjSec2Parse --Null Pointer",0,0,0,0,0,0);
return ERROR;
}
pSec2Param->IntfCard.diagSubType = DIAG_TYPE_GET((unsigned int)pMsg->CmdID);
pSec2Param->IntfCard.slotNum = 20;
return OK;
}
/******************************************************
Function:
drv_lce1fDiag()
Description:
CE1诊断入口函数
Inputs:
pdiagPrjParam 诊断参数指针
ret_buffer 回显字符串指针
Outputs:
*ret_buffer
Returns:
OK or ERROR
Remarks:
*******************************************************/
int drv_Sec2Diag(diagPrjParam *pdiagPrjParam, char **ret_buffer)
{
char *tempbuf= (char *)NULL;
if((char *)NULL ==(tempbuf = (char *)DIAG_ALLOC(2*DIAG_BUFFER_SIZE)))
{
return ERROR;
}
memset(tempbuf,0,2*DIAG_BUFFER_SIZE);
/*分配内存*/
switch(pdiagPrjParam->IntfCard.diagSubType)
{
case DIAG_PRJ_CARD_BASICINFO:
drv_Sec2ShowCardInfo(tempbuf);
break;
case DIAG_PRJ_CARD_CPLD:
drv_Sec2ShowCPLD(tempbuf);
break;
case DIAG_PRJ_CARD_FPGA:
drv_Sec2ShowFPGA(tempbuf);
break;
case DIAG_PRJ_CARD_BUFFER:
drv_Sec2ShowBuffer(tempbuf);
break;
case DIAG_SEC2_INTERNAL:
drv_Sec2Diaginternal(tempbuf);
break;
default :
break;
}
(*ret_buffer) = tempbuf;
return OK;
}
void Sec2_coreId_Identity(char *buffer)
{
char* coreID;
sec2_coremask = *((volatile unsigned long *)(sec2_IOBaseAddress + IDENTIFICATION_OFFSET) + 1);
switch(sec2_coremask)
{
case SEC_COREID_2_0_0:
case SEC_COREID_2_0_1:
coreID = "2.0.0";
break;
case SEC_COREID_2_1_0:
coreID = "2.1.0";
break;
default:
coreID = "unknown";
break;
}
sprintf((buffer+strlen(buffer)),"Security Core Version Mask: %s (0x%lx)\n\n",coreID,sec2_coremask);
}
int drv_Sec2ShowCPLD(char *buffer)
{
sprintf( buffer,"\n========\tSec2 Core Info begin\t ========\n");
sprintf((buffer+strlen(buffer)),"No CPLD On sec2 core\n");
sprintf((buffer+strlen(buffer)),"\n========\tSec2 Core Info end\t ========\n");
return OK;
}
int drv_Sec2ShowFPGA(char *buffer)
{
sprintf( buffer,"\n========\tSec2 Core Info begin\t ========\n");
sprintf((buffer+strlen(buffer)),"No FPGA On sec2 core\n");
sprintf((buffer+strlen(buffer)),"\n========\tSec2 Core Info end\t ========\n");
return OK;
}
/******************************************************
Function:
drv_Sec2ShowCardInfo()
Description:
Sec2诊断,显示单板基本信息
Inputs:
slotNum 槽位号
buffer 字符串回显
Outputs:
buffer
Returns:
OK or ERROR
Remarks:
*******************************************************/
int drv_Sec2ShowCardInfo(char *buffer)
{
int sec2_channel;
int cha;
sprintf(buffer,"\n========\tSec2 Core Info begin\t ========\n");
Sec2_coreId_Identity(buffer);
/*打印PM7366的寄存器的数值*/
sprintf((buffer+strlen(buffer)),"\nSec2 Regiter Value:\n");
sprintf((buffer+strlen(buffer)),"sec2_IOBaseAddress(0x0)(low) :0x%lx\n",(sec2_IOBaseAddress));
sprintf((buffer+strlen(buffer)),"sec2_ChaAssignmentStatusRegister(0x%lx)(low) :0x%lx\n",CHA_ASSIGNMENT_STATUS_OFFSET,*(sec2_ChaAssignmentStatusRegister));
sprintf((buffer+strlen(buffer)),"sec2_ChaAssignmentStatusRegister(0x%lx)(high):0x%lx\n",CHA_ASSIGNMENT_STATUS_OFFSET,*(sec2_ChaAssignmentStatusRegister+1));
sprintf((buffer+strlen(buffer)),"sec2_InterruptControlRegister(0x%lx)(low) :0x%lx\n",INTERRUPT_CONTROL_OFFSET,*(sec2_InterruptControlRegister));
sprintf((buffer+strlen(buffer)),"sec2_InterruptControlRegister(0x%lx)(high):0x%lx\n",INTERRUPT_CONTROL_OFFSET,*(sec2_InterruptControlRegister+1));
sprintf((buffer+strlen(buffer)),"sec2_InterruptStatusRegister(0x%lx)(low) :x%lx\n",INTERRUPT_STATUS_OFFSET,*(sec2_InterruptStatusRegister));
sprintf((buffer+strlen(buffer)),"sec2_InterruptStatusRegister(0x%lx)(high):x%lx\n",INTERRUPT_STATUS_OFFSET,*(sec2_InterruptStatusRegister+1));
sprintf((buffer+strlen(buffer)),"sec2_InterruptClearRegister(0x%lx)(low) :0x%lx\n",INTERRUPT_CLEAR_OFFSET,*(sec2_InterruptClearRegister));
sprintf((buffer+strlen(buffer)),"sec2_InterruptClearRegister(0x%lx)(high):0x%lx\n",INTERRUPT_CLEAR_OFFSET,*(sec2_InterruptClearRegister+1));
sprintf((buffer+strlen(buffer)),"sec2_IdRegister(0x%lx)(low) :0x%lx\n",IDENTIFICATION_OFFSET,*(sec2_IdRegister));
sprintf((buffer+strlen(buffer)),"sec2_IdRegister(0x%lx)(high):0x%lx\n",IDENTIFICATION_OFFSET,*(sec2_IdRegister+1));
sprintf((buffer+strlen(buffer)),"sec2_MasterControlRegister(0x%lx)(low) :0x%lx\n",SEC2_MASTER_CONTROL_REGISTER,*(sec2_MasterControlRegister));
sprintf((buffer+strlen(buffer)),"sec2_MasterControlRegister(0x%lx)(high):0x%lx\n",SEC2_MASTER_CONTROL_REGISTER,*(sec2_MasterControlRegister+1));
sprintf((buffer+strlen(buffer)),"\n");
for (sec2_channel=0; sec2_channel<SEC2_NUM_CHANNELS; sec2_channel++)
{
sprintf((buffer+strlen(buffer)),"sec2_ChannelConfigRegister[%d](0x%lx)(low) :0x%lx\n",sec2_channel,CHANNEL_CONFIG_BASE,*(sec2_ChannelConfigRegister[sec2_channel]));
sprintf((buffer+strlen(buffer)),"sec2_ChannelConfigRegister[%d](0x%lx)(high):0x%lx\n",sec2_channel,CHANNEL_CONFIG_BASE,*(sec2_ChannelConfigRegister[sec2_channel]+1));
}
for (sec2_channel=0; sec2_channel<SEC2_NUM_CHANNELS; sec2_channel++)
{
sprintf((buffer+strlen(buffer)),"sec2_ChannelPointerStatusRegister[%d](0x%lx)(low) :0x%lx\n",sec2_channel,CHANNEL_CONFIG_BASE,*(sec2_ChannelConfigRegister[sec2_channel]));
sprintf((buffer+strlen(buffer)),"sec2_ChannelPointerStatusRegister[%d](0x%lx)(high):0x%lx\n",sec2_channel,CHANNEL_CONFIG_BASE,*(sec2_ChannelConfigRegister[sec2_channel]+1));
}
for (sec2_channel=0; sec2_channel<SEC2_NUM_CHANNELS; sec2_channel++)
{
sprintf((buffer+strlen(buffer)),"sec2_ChannelDataBufferDescriptorRegister[%d](0x%lx)(low) :0x%lx\n",sec2_channel,CHANNEL_DBR_BASE,*(sec2_ChannelDataBufferDescriptorRegister[sec2_channel]));
sprintf((buffer+strlen(buffer)),"sec2_ChannelDataBufferDescriptorRegister[%d](0x%lx)(high):0x%lx\n",sec2_channel,CHANNEL_DBR_BASE,*(sec2_ChannelDataBufferDescriptorRegister[sec2_channel]+1));
}
for (cha=0; cha<NUM_CHAS; cha++)
{
sprintf((buffer+strlen(buffer)),"sec2_ChaResetControlRegister[%d](0x%lx)(low) :0x%lx\n",cha,CHA_RESET_CONTROL_BASE,
*(sec2_ChaResetControlRegister[cha]));
sprintf((buffer+strlen(buffer)),"sec2_ChaResetControlRegister[%d](0x%lx)(high):0x%lx\n",cha,CHA_RESET_CONTROL_BASE,
*(sec2_ChaResetControlRegister[cha]+1));
}
for (cha=0; cha<NUM_CHAS; cha++)
{
sprintf((buffer+strlen(buffer)),"Sec2ChaInterruptStatusRegister[%d](0x%lx)(low) :0x%lx\n",cha,CHA_INTERRUPT_STATUS_BASE,
*(Sec2ChaInterruptStatusRegister[cha]));
sprintf((buffer+strlen(buffer)),"Sec2ChaInterruptStatusRegister[%d](0x%lx)(high):0x%lx\n",cha,CHA_INTERRUPT_STATUS_BASE,
*(Sec2ChaInterruptStatusRegister[cha]+1));
}
for (cha=0; cha<NUM_CHAS; cha++)
{
sprintf((buffer+strlen(buffer)),"sec2_ChaInterruptControlRegister[%d](0x%lx)(low) :0x%lx\n",cha,CHA_INTERRUPT_CONTROL_BASE,
*(sec2_ChaInterruptControlRegister[cha]));
sprintf((buffer+strlen(buffer)),"sec2_ChaInterruptControlRegister[%d](0x%lx)(high):0x%lx\n",cha,CHA_INTERRUPT_CONTROL_BASE,
*(sec2_ChaInterruptControlRegister[cha]+1));
}
sprintf((buffer+strlen(buffer)),"\n");
sprintf((buffer+strlen(buffer)),"sec2_FreeChannels:0x%lx\n",sec2_FreeChannels);
sprintf((buffer+strlen(buffer)),"sec2_FreeRngas:0x%lx\n",sec2_FreeRngas);
sprintf((buffer+strlen(buffer)),"sec2_FreeAfhas:0x%lx\n",sec2_FreeAfhas);
sprintf((buffer+strlen(buffer)),"sec2_FreeDesas:0x%lx\n",sec2_FreeDesas);
sprintf((buffer+strlen(buffer)),"sec2_FreeMdhas:0x%lx\n",sec2_FreeMdhas);
sprintf((buffer+strlen(buffer)),"sec2_FreePkhas:0x%lx\n",sec2_FreePkhas);
sprintf((buffer+strlen(buffer)),"sec2_FreeAesas:0x%lx\n",sec2_FreeAesas);
/*结束*/
sprintf((buffer+strlen(buffer)),"\n========\tSec2 Core Info end\t ========\n");
return OK;
}
/******************************************************
Function:
drv_Sec2ShowBuffer()
Description:
打印SEC2内核BUFFER 基本信息
Inputs:
slotNum 槽位号
buffer 回显字符串指针
Outputs:
buffer
Returns:
OK or ERROR
Remarks:
*******************************************************/
int drv_Sec2ShowBuffer(char *buffer)
{
sprintf(buffer,"\n========\tSec2 Core buffer begin\t ========\n");
drv_Sec2_Fwd_Queue_sprintf(buffer);
drv_Sec2_Handle_Queue_sprintf(buffer);
drv_Sec2_show_Global_stat(buffer);
drv_Sec2_show_channel_stat(buffer);
sprintf((buffer+strlen(buffer)),"========\tSec2 Core buffer end\t ========\n");
return OK;
}
void drv_Sec2_show_channel_stat(char *buffer)
{
int sec2_channel;
sprintf((buffer+strlen(buffer)),"\n");
for(sec2_channel = 0;sec2_channel < SEC2_NUM_CHANNELS; sec2_channel++)
{
sprintf((buffer+strlen(buffer)),"Channel[%d] DynamicCnt: 0x%lx\n",sec2_channel,pgsec2_channel_debug[sec2_channel].channel_DynamicCnt);
sprintf((buffer+strlen(buffer)),"Channel[%d] ErrCnt : 0x%lx\n",sec2_channel,pgsec2_channel_debug[sec2_channel].channel_ErrCnt);
sprintf((buffer+strlen(buffer)),"Channel[%d] SuccCnt : 0x%lx\n",sec2_channel,pgsec2_channel_debug[sec2_channel].channel_SuccCnt);
sprintf((buffer+strlen(buffer)),"Channel[%d] WaitCnt : 0x%lx\n",sec2_channel,pgsec2_channel_debug[sec2_channel].channel_WaitCnt);
sprintf((buffer+strlen(buffer)),"\n");
}
}
void drv_Sec2_show_Global_stat(char *buffer)
{
sprintf((buffer+strlen(buffer)),"\nGlobal Pkt in : 0x%lx\n",pgsec2_global_debug->pkt_in);
sprintf((buffer+strlen(buffer)),"Global Isr out: 0x%lx\n",pgsec2_global_debug->isr_out);
}
void drv_Sec2_diag_clear_stat(void)
{
int sec2_channel;
pgsec2_global_debug->pkt_in = 0;
pgsec2_global_debug->isr_out = 0;
for(sec2_channel = 0;sec2_channel < SEC2_NUM_CHANNELS; sec2_channel++)
{
pgsec2_channel_debug[sec2_channel].channel_DynamicCnt = 0;
pgsec2_channel_debug[sec2_channel].channel_ErrCnt = 0;
pgsec2_channel_debug[sec2_channel].channel_SuccCnt = 0;
pgsec2_channel_debug[sec2_channel].channel_WaitCnt = 0;
}
}
void drv_Sec2_Fwd_Queue_sprintf(char *buffer)
{
UINT32 loopCnt;
UINT32 useCnt = 0;
UINT32 unuseCnt = 0;
SEC2_FWD_QUEUE* sec2_queue;
sec2_queue = gpSec2_fwd_Queue;
sprintf(buffer+strlen(buffer),"\n======\tSec2 Core fwd queue begin\t ======\n");
sprintf(buffer+strlen(buffer),"\nindex use taskid \n");
for(loopCnt = 0; loopCnt < SEC2_FWD_QUEUE_DEPTH; loopCnt ++)
{
if(loopCnt < 10)
{
sprintf((buffer+strlen(buffer)),"%d ",loopCnt);
}
else
{
sprintf((buffer+strlen(buffer)),"%d",loopCnt);
}
if(sec2_queue->used == SEC2_PKT_USED_FLAG)
{
useCnt++;
sprintf((buffer+strlen(buffer)),"\t yes");
}
else
{
unuseCnt++;
sprintf((buffer+strlen(buffer)),"\t no");
}
sprintf((buffer+strlen(buffer)),"\t0x%x\n",sec2_queue->requestingTaskId);
sec2_queue = gpSec2_fwd_Queue[loopCnt].next;
}
sprintf((buffer+strlen(buffer)),"fwd queue used = %d\n",useCnt);
sprintf((buffer+strlen(buffer)),"fwd queue unused = %d\n",unuseCnt);
sprintf(buffer+strlen(buffer),"\n======\tSec2 Core fwd queue end\t ======\n");
}
void drv_Sec2_Handle_Queue_sprintf(char *buffer)
{
int loopCnt;
UINT32 useCnt = 0;
QUEUE_ENTRY* sec2_queue;
sec2_queue = sec2_Queue;
sprintf(buffer+strlen(buffer),"\n======\tSec2 Core handle queue begin\t ======\n");
sprintf((buffer+strlen(buffer)),"index taskid \n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -