예제 #1
0
/*****************************************************************************
 Function   : vos_FidTask
 Description: the process entry of every FID
 Input      : ulQueueID -- the queue of the FID
            : the ID of the FID
 Return     : VOS_VOID
 *****************************************************************************/
VOS_VOID vos_FidTask( VOS_UINT32 ulQueueID, VOS_UINT32 FID_value,
                      VOS_UINT32 Para1, VOS_UINT32 Para2 )
{

    MSG_CB                  *pMsg;
    VOS_UINT32              iThePid;
    VOS_UINT32              Msg_Address;

    for ( ; ; )
    {
        if ( VOS_ERR == VOS_FixedQueueRead(ulQueueID, &Msg_Address))
        {
            Print1("# FID fetch message error. the Q ID is %ld.\r\n",
                (VOS_INT)ulQueueID);

            continue;
        }

        Msg_Address += VOS_MSG_BLK_HEAD_LEN;

        pMsg = (MSG_CB *)Msg_Address;

        iThePid = pMsg->uwReceiverPid;

        if(!VOS_PidCheck(iThePid))
        {
            Print("# vos_FidTask Pid too big.\r\n");

            VOS_FreeMsg( iThePid, pMsg );

            continue;
        }

        if( VOS_ID_PID_BELONG_TO_FID
            == vos_FidCtrlBlk[FID_value].PidsBelong[VOS_PidIdx(iThePid)] )
        {
            /* 接收消息时调用hook */
            if ( VOS_NULL_PTR != g_pfVosHookFuncTable[OS_HOOK_TYPE_MSG_GET] )
            {
                ((VOS_MSG_HOOK_FUNC)g_pfVosHookFuncTable[OS_HOOK_TYPE_MSG_GET])(pMsg);
            }

            (vos_PidRecords[VOS_PidIdx(iThePid)].MsgFunction)(pMsg);
        }
        else
        {
            Print("# vos_FidTask Pid not belong the Fid.\r\n");
        }

        VOS_FreeMsg( iThePid, pMsg );
    }
}
예제 #2
0
/*****************************************************************************
 Function   : VOS_ResetFidsTask
 Description: Resume tasks of all FIDs
 Input      : VOS_VOID
            : VOS_VOID
 Return     : VOS_OK on success or errno on failure
 *****************************************************************************/
VOS_UINT32 VOS_ResetFidsTask(VOS_FID ulFid)
{
    VOS_CPU_SR              CpuLockLevel;
    VOS_UINT32              iThePid;
    VOS_UINT32              Msg_Address;
    MSG_CB                 *pMsg;

    if( (ulFid >= VOS_FID_BUTT) || (ulFid < VOS_FID_DOPRAEND) )
    {
        return VOS_ERR;
    }

    CpuLockLevel = VOS_SplIMP();

    if ( VOS_OK != VOS_FixedQueueClean(vos_FidCtrlBlk[ulFid].Qid, &Msg_Address) )
    {
        VOS_Splx(CpuLockLevel);

        return VOS_ERR;
    }

    if ( VOS_OK != VOS_ResetTask(vos_FidCtrlBlk[ulFid].Tid) )
    {
        VOS_Splx(CpuLockLevel);

        return VOS_ERR;
    }

    if ( FALSE == VOS_IsMemUsed(Msg_Address) )
    {
        VOS_Splx(CpuLockLevel);

        return VOS_OK;
    }

    Msg_Address += VOS_MSG_BLK_HEAD_LEN;

    pMsg         = (MSG_CB *)Msg_Address;

    iThePid      = pMsg->uwReceiverPid;

    if(!VOS_PidCheck(iThePid))
    {
        VOS_Splx(CpuLockLevel);

        return VOS_ERR;
    }

    if( VOS_ID_PID_BELONG_TO_FID
        == vos_FidCtrlBlk[ulFid].PidsBelong[iThePid - VOS_PID_DOPRAEND] )
    {
        VOS_FreeMsg( iThePid, pMsg );
    }


    VOS_Splx(CpuLockLevel);

    return VOS_OK;
}
예제 #3
0
VOS_VOID Aging_FreeMem(VOS_VOID)
{
    MODEM_ID_ENUM_UINT16                enModemID;

    if (VOS_NULL_PTR != g_pstOmAgingTestNV)
    {
        VOS_MemFree(WUEPS_PID_AGING, g_pstOmAgingTestNV);
    }

    for (enModemID = MODEM_ID_0; enModemID < MODEM_ID_BUTT; enModemID++)
    {
        if (VOS_NULL_PTR != g_apstGAgingTestMsg[enModemID])
        {
            VOS_FreeMsg(WUEPS_PID_AGING, g_apstGAgingTestMsg[enModemID]);
        }
    }

    if (VOS_NULL_PTR != g_pstOmAgingTestNV)
    {
        VOS_FreeMsg(WUEPS_PID_AGING, g_pstWAgingTestMsg);
    }

    return;
}
/*****************************************************************************
 函 数 名  : MNTN_ErrorLog
 功能描述  : 将错误信息记录到ERRORLOG中
 输入参数  : cFileName: 调用函数处的文件名
             ulFileId: 调用函数处的文件ID
             ulLine: 调用函数处在文件中行号
             ulErrNo: 错误号索引
             pRecord: 记录存放位置
             ulLen: 记录整个pRecord的长度,包括记录头,单位:字节
 输出参数  : VOID
 返 回 值  : VOS_ERR:函数执行过程中出现错误
             VOS_OK:函数执行正常
 修改历史      :
  1.日    期   : 2011年7月1日
    作    者   : g47350
    修改内容   : 新生成函数
*****************************************************************************/
unsigned int MNTN_ErrorLog(char * cFileName, unsigned int ulFileId, unsigned int ulLine,
                unsigned int ulErrNo, void *pRecord, unsigned int ulLen)
{
    ERRORLOG_REQ_STRU       *pstErrorLogReq;
    ERRORLOG_CNF_STRU       *pstErrorLogCnf;
    VOS_UINT32              ulResult;

    /* 参数检测 */
    if ((VOS_NULL_PTR == cFileName) || (VOS_NULL_PTR == pRecord))
    {
        return OM_ACPU_PARA_ERR;
    }

#if (VOS_OS_VER == VOS_LINUX)
    if( in_interrupt() )
    {
        return OM_ACPU_RUN_IRQ;
    }
#endif

    pstErrorLogReq = (ERRORLOG_REQ_STRU*)VOS_AllocMsg(ACPU_PID_OMAGENT,
                                                ERRORLOG_HEAD_LEN + ulLen);

    /* 分配消息失败 */
    if (VOS_NULL_PTR == pstErrorLogReq)
    {
        return OM_ACPU_ALLOC_FAIL;
    }

    pstErrorLogReq->ulReceiverPid = CCPU_PID_OMAGENT;
    pstErrorLogReq->usPrimId      = ERRORLOG_REQ;
    pstErrorLogReq->ulFileId      = ulFileId;
    pstErrorLogReq->ulLine        = ulLine;
    pstErrorLogReq->ulErrNo       = ulErrNo;
    pstErrorLogReq->ulLen         = ulLen;

    /* 为了确保aucFileName最后字节为'\0',拷贝长度需要加1 */
    VOS_MemCpy(pstErrorLogReq->aucFileName, cFileName, VOS_StrLen(cFileName) + 1);
    VOS_MemCpy(pstErrorLogReq->aucData, pRecord, ulLen);


    /* 如果有任务正在进行中,需要等待其完成 */
    if (VOS_OK != VOS_SmP(g_ulOmAcpuSyncSem, 0))
    {
        VOS_FreeMsg(ACPU_PID_OMAGENT, pstErrorLogReq);

        return OM_ACPU_SYNC_TIMEOUT;
    }

    /* 将请求消息发送给CCPU */
    if (VOS_OK != VOS_SendMsg(ACPU_PID_OMAGENT, pstErrorLogReq))
    {
        VOS_SmV(g_ulOmAcpuSyncSem);

        return OM_ACPU_SEND_FAIL;
    }

    /* 等待CCPU的回复 */
    if (VOS_OK != VOS_SmP(g_ulOmAcpuCnfSem, WAITING_CNF_TIMEOUT_LEN))
    {
        VOS_SmV(g_ulOmAcpuSyncSem);

        return OM_ACPU_CNF_TIMEOUT;
    }

    pstErrorLogCnf = (ERRORLOG_CNF_STRU*)g_pstOmAcpuCnfMsg;

    /* 判断回复消息内容是否正确 */
    if (ERRORLOG_CNF != pstErrorLogCnf->usPrimId)
    {
        VOS_FreeReservedMsg(ACPU_PID_OMAGENT, g_pstOmAcpuCnfMsg);

        VOS_SmV(g_ulOmAcpuSyncSem);

        return OM_ACPU_CNF_ERR;
    }

    ulResult = (VOS_UINT32)pstErrorLogCnf->usResult;

    VOS_FreeReservedMsg(ACPU_PID_OMAGENT, g_pstOmAcpuCnfMsg);

    VOS_SmV(g_ulOmAcpuSyncSem);

    return ulResult;
}
예제 #5
0
/*****************************************************************************
 Function   : vos_FidTask
 Description: the process entry of every FID
 Input      : ulQueueID -- the queue of the FID
            : the ID of the FID
 Return     : void
 *****************************************************************************/
VOS_VOID vos_FidTask( VOS_UINT32 ulQueueID, VOS_UINT32 FID_value,
                      VOS_UINT32 Para1, VOS_UINT32 Para2 )
{

    MSG_CB                  *pMsg;
    VOS_UINT32              *pulMsgAddr;
    VOS_UINT32              iThePid;
    VOS_UINT32              Msg_Address;

    for(;;)
    {
        if ( VOS_ERR
            == VOS_FixedQueueRead(ulQueueID, 0, &Msg_Address, VOS_FID_MAX_MSG_LENGTH))
        {
            LogPrint1("# FID fetch message error. the Q ID is %d.\r\n",
                (int)ulQueueID);

            continue;
        }

        Msg_Address += VOS_MSG_BLK_HEAD_LEN;

        pMsg = (MSG_CB *)Msg_Address;

        iThePid = pMsg->ulReceiverPid;

        if(iThePid >= VOS_PID_BUTT)
        {
            LogPrint("# vos_FidTask Pid too big.\r\n");

            pulMsgAddr = (VOS_UINT32 *)pMsg;
            LogPrint4("# Msg :S pid %08X R Pid %08X Length %08X Name %08X.\r\n",
                *(pulMsgAddr + 1), *(pulMsgAddr + 3),
                *(pulMsgAddr + 4), *(pulMsgAddr + 5));

            VOS_FreeMsg( iThePid, pMsg );

            continue;
        }

        if( FID_value == vos_PidRecords[iThePid-VOS_PID_DOPRAEND].Fid )
        {
            if ( VOS_NULL_PTR != vos_MsgHook )
            {
                (vos_MsgHook)(pMsg);
            }
            (vos_PidRecords[iThePid-VOS_PID_DOPRAEND].MsgFunction)(pMsg);
        }
        else
        {
            LogPrint("# vos_FidTask Pid not belong the Fid.\r\n");

            pulMsgAddr = (VOS_UINT32 *)pMsg;
            LogPrint4("# Msg :S pid %08X R Pid %08X Length %08X Name %08X.\r\n",
                *(pulMsgAddr + 1), *(pulMsgAddr + 3),
                *(pulMsgAddr + 4), *(pulMsgAddr + 5));
        }

        VOS_FreeMsg( iThePid, pMsg );
    }
}
/******************************************************************************
函数名  :OM_GetData
功能描述:OM Ccpu接收各组件上报工程模式数据
输入参数:enProjectModule    :组建编号
          pData              :发送数据
          ulLen              :发送数据长度
输出参数:NA
返回值  :VOS_OK/VOS_ERR
修改历史:
1.  日期    :2014年1月2日
作者    :
修改内容:新生成函数
说明:pData从OMHeader的MsgType域开始。相当于调用组件预先申请Header部分,其中Header部分的SN字段由COMM填写
*****************************************************************************/
VOS_UINT32 OM_GetData(OM_ERR_LOG_MOUDLE_ID_ENUM_UINT32 enProjectModule, VOS_VOID *pData, VOS_UINT32 ulLen)
{
    OM_ALARM_MSG_HEAD_STRU             *pstOmHead;
    OM_FTM_REPROT_IND_STRU             *pstOmFtmReportInd;
    VOS_UINT32                          ulAddr;
    VOS_UINT32                          ulIndex;

    for (ulIndex=0; ulIndex<(sizeof(g_astFTMCallBackFuncCtx) / sizeof(g_astFTMCallBackFuncCtx[0])); ulIndex++)
    {
        /* 上报消息时,如果该组件没有注册过回调函数,就不传递他的消息 */
        if ( (g_astFTMCallBackFuncCtx[ulIndex].enProjectModule == enProjectModule)
             && (g_astFTMCallBackFuncCtx[ulIndex].pSendUlAtFunc  != VOS_NULL_PTR) )
        {
            break;
        }
    }

    if ((sizeof(g_astFTMCallBackFuncCtx) / sizeof(g_astFTMCallBackFuncCtx[0])) <= ulIndex)
    {
        OM_CCPU_ERR_LOG1("OM_GetData:ModuleID is error %d\r\n", enProjectModule);
        return OM_APP_MSG_MODULE_ID_ERR;
    }

    if ((VOS_NULL_PTR == pData) || ((sizeof(OM_ALARM_MSG_HEAD_STRU) + sizeof(OM_FTM_HEADER_STRU)) > ulLen))
    {
        OM_CCPU_ERR_LOG2("\r\n OM_GetData: Module ID is %d, Send data is NULL or len is error:%d\n", enProjectModule, ulLen);
        return OM_APP_MSG_LENGTH_ERR;
    }

    /*lint -e40*/
    OM_CCPU_DEBUG_TRACE((VOS_UINT8*)pData, ulLen, OM_CCPU_ERRLOG_RCV);
    /*lint +e40*/

    /* 工程模式相关消息上报给OM */
    pstOmFtmReportInd  = (OM_FTM_REPROT_IND_STRU*)VOS_AllocMsg(WUEPS_PID_OM_CALLBACK, (ulLen + sizeof(VOS_UINT32)));

    if (VOS_NULL_PTR == pstOmFtmReportInd)
    {
        OM_CCPU_ERR_LOG1("OM_GetData:Module ID is %d, malloc msg is fail\r\n", enProjectModule);
        return OM_APP_OMCCPU_ALLOC_MSG_ERR;
    }
    
    pstOmFtmReportInd->ulReceiverPid = ACPU_PID_OM;
    pstOmHead = (OM_ALARM_MSG_HEAD_STRU*)pData;

    /* 消息TYPE简单判断*/
    if (OM_ERR_LOG_MSG_FTM_REPORT == pstOmHead->ulMsgType)
    {
        pstOmFtmReportInd->ulMsgName     = ID_OM_FTM_REPROT_IND;
    }
    else if (OM_ERR_LOG_MSG_FTM_CNF == pstOmHead->ulMsgType)
    {
        pstOmFtmReportInd->ulMsgName     = ID_OM_FTM_REQUIRE_CNF;
    }
    else
    {
        OM_CCPU_ERR_LOG2("OM_GetData:Module ID is %d, Msg Type is Err %d\r\n", 
                     enProjectModule, pstOmHead->ulMsgType);

        VOS_FreeMsg(WUEPS_PID_OM_CALLBACK, pstOmFtmReportInd);

        return OM_APP_MSG_TYPE_ERR;
    }

    /* make pclint happy  begin */
    ulAddr = (VOS_UINT32)(&pstOmFtmReportInd->ulMsgType);
    VOS_MemCpy((VOS_VOID *)ulAddr, (VOS_VOID*)pData, ulLen);
    /* make pclint happy  end */

    (VOS_VOID)VOS_SendMsg(WUEPS_PID_OM_CALLBACK, pstOmFtmReportInd);

    return OM_APP_MSG_OK;
}