/*****************************************************************************
 函 数 名  : OM_ComRx_ICC_Init
 功能描述  : 用于OM在CCPU初始化ICC通道
 输入参数  : 无
 输出参数  : 无
 返 回 值  : VOS_ERR/VOS_OK
 调用函数  :
 被调函数  :
 修改历史  :
   1.日    期  : 2011年3月10日
     作    者  : l46160
     修改内容  : Creat Function
*****************************************************************************/
VOS_UINT32 OM_ComRx_ICC_Init(VOS_VOID)
{
    OM_ICC_UDI_CTRL_STRU                astACPUICCCtrlTable;

    /*初始化 ICC通道*/
    VOS_MemSet((&astACPUICCCtrlTable), 0, sizeof(astACPUICCCtrlTable));

    astACPUICCCtrlTable.pstICCAttr = (ICC_CHAN_ATTR_S*)VOS_MemAlloc(ACPU_PID_OM,
                                                                       STATIC_MEM_PT,
                                                                       sizeof(ICC_CHAN_ATTR_S));
    if(VOS_NULL_PTR == astACPUICCCtrlTable.pstICCAttr)
    {
        return VOS_ERR;             /*分配内存失败单板会重启,因此不需要释放之前已经申请的内存*/
    }

    astACPUICCCtrlTable.enICCId                    = UDI_ICC_GUOM0;

    astACPUICCCtrlTable.pstICCAttr->u32Priority    = OM_ICC_CHANNEL_PRIORITY;
    astACPUICCCtrlTable.pstICCAttr->u32TimeOut     = OM_ICC_HANDSHAKE_TIME_MAX;
    astACPUICCCtrlTable.pstICCAttr->u32FIFOInSize  = OM_ICC_BUFFER_SIZE;
    astACPUICCCtrlTable.pstICCAttr->u32FIFOOutSize = OM_ICC_BUFFER_SIZE;
    astACPUICCCtrlTable.pstICCAttr->enChanMode     = ICC_CHAN_MODE_PACKET;
    astACPUICCCtrlTable.pstICCAttr->event_cb       = GU_OamAcpu_ICCError_CB;
    astACPUICCCtrlTable.pstICCAttr->write_cb       = VOS_NULL_PTR;

    if(VOS_ERROR == DRV_ICC_OPEN(astACPUICCCtrlTable.enICCId, astACPUICCCtrlTable.pstICCAttr))
    {
        /* 打开失败时记录当前ICC通道信息 */
        VOS_ProtectionReboot(OM_APP_ICC_INIT_ERROR, THIS_FILE_ID, __LINE__,VOS_NULL_PTR,0);

        return VOS_ERR;
    }

    return VOS_OK;
}
/*****************************************************************************
 Function   : VOS_ProtectInit
 Description: reboot if OSA can't init
 Calls      :
 Called By  : root
 Input      : None
 Return     : None
 Other      :
 *****************************************************************************/
VOS_VOID VOS_ProtectInit(VOS_UINT32 ulParam1, VOS_UINT32 ulParam2)
{
    VOS_START_ERR_STEP_STRU stStep;

    stStep.ulStartUpStage = vos_StartUpStage;
    stStep.ulStep         = g_ulVosStartStep;
    stStep.ulOutSideStep  = g_ulVosOutsideStep;
    stStep.usFidInitStep  = g_usFidInitStep;
    stStep.usFidInitId    = g_usFidInitId;
    stStep.usPidInitStep  = g_usPidInitStep;
    stStep.usPidInitId    = g_usPidInitId;


    VOS_ProtectionReboot(OSA_EXPIRE_ERROR, 0, 0, (VOS_CHAR *)&stStep, sizeof(VOS_START_ERR_STEP_STRU) );
}
Пример #3
0
/*****************************************************************************
 Function   : HPA_3G0MsIsr
 Description: ISR of R99 0ms
 Input      : void
 Return     : void
 Other      :
 *****************************************************************************/
VOS_VOID HPA_3G0MsIsr(VOS_VOID)
{
    if (PWRCTRL_COMM_OFF == DRV_PWRCTRL_PWRSTATUSGET((PWC_COMM_MODE_E)VOS_RATMODE_WCDMA, PWC_COMM_MODULE_BBP_DRX, (PWC_COMM_MODEM_E)MODEM_ID_0))
    {
        VOS_ProtectionReboot(DRX_REPORT_BBP_POWERDOWN_ERROR, PS_FILE_ID_HPA_ISR_C, __LINE__,
                VOS_NULL_PTR, 0);

        return;
    }

    /* Clear interrupt */
    HPA_Write32Reg(WBBP_ARM_INT01_CLR_ADDR, 1);

    DRV_VICINT_DISABLE(g_ulWBBP0MsIntNO);

    g_stHpaIntCount.ul0msIntNum++;
    g_stHpaIntCount.ul0msIntSlice = OM_GetSlice();

#ifdef HPA_ITT
    Stub_RttRegGet();

    if ( VOS_NULL_PTR != g_pfnHpaDspIsrStub )
    {
        g_pfnHpaDspIsrStub();
    }
#endif

    /* Read SFN & CFN */
    HPA_ReadCfnSfn();

    /* Trigger HPA_TransferTaskEntry task to transfer msg
       between ARM and DSP.*/
    atomic_inc(&g_stDspMailBoxTransferCount);
    VOS_SmV(g_ulHpaTransferSem);

    g_ul3GISRNum++;

    DRV_VICINT_ENABLE(g_ulWBBP0MsIntNO);

    return ;
}
Пример #4
0
VOS_UINT32 VOS_ICC_Init(VOS_VOID)
{
   OM_ICC_UDI_CTRL_STRU                astCCPUICCCtrlTable;

    /*初始化 ICC通道*/
    /*lint -e534*/
    VOS_MemSet((&astCCPUICCCtrlTable), 0, sizeof(astCCPUICCCtrlTable));
    /*lint +e534*/

    astCCPUICCCtrlTable.pstICCAttr = (ICC_CHAN_ATTR_S*)VOS_MemAlloc(CCPU_PID_PAM_OM,
                                                              STATIC_MEM_PT,
                                                              sizeof(ICC_CHAN_ATTR_S));
    if(VOS_NULL_PTR == astCCPUICCCtrlTable.pstICCAttr)
    {
        return VOS_ERR;
    }

    astCCPUICCCtrlTable.enICCId               = UDI_ICC_GUOM4;
    astCCPUICCCtrlTable.pstICCAttr->read_cb   = V_ICC_OSAMsg_CB;

    astCCPUICCCtrlTable.pstICCAttr->u32Priority    = OM_ICC_CHANNEL_PRIORITY;  /* 统一使用最高优先级 */
    astCCPUICCCtrlTable.pstICCAttr->u32TimeOut     = OM_ICC_HANDSHAKE_TIME_MAX;
    astCCPUICCCtrlTable.pstICCAttr->u32FIFOInSize  = OSA_ICC_BUFFER_SIZE;
    astCCPUICCCtrlTable.pstICCAttr->u32FIFOOutSize = OSA_ICC_BUFFER_SIZE;
    astCCPUICCCtrlTable.pstICCAttr->enChanMode     = ICC_CHAN_MODE_PACKET;
    astCCPUICCCtrlTable.pstICCAttr->event_cb       = VOS_ICCError_CB;
    astCCPUICCCtrlTable.pstICCAttr->write_cb       = VOS_NULL_PTR;

    if (VOS_ERROR == DRV_ICC_OPEN(astCCPUICCCtrlTable.enICCId, astCCPUICCCtrlTable.pstICCAttr))
    {
        /* 打开失败时记录当前ICC通道信息 */
        VOS_ProtectionReboot(OM_APP_ICC_INIT_ERROR, THIS_FILE_ID, __LINE__, VOS_NULL_PTR,0);
        return VOS_ERR;
    }

    VOS_IccDebugInfoInit();

    return VOS_OK;
}
VOS_UINT32 VOS_Startup( enum VOS_STARTUP_PHASE ph )
{
    VOS_UINT32      ulReturnValue;
    VOS_UINT32      ulStartUpFailStage = 0;

    switch(ph)
    {
    case VOS_STARTUP_INIT_DOPRA_SOFEWARE_RESOURCE :
        vos_StartUpStage = 0x00010000;

        if ( VOS_OK != VOS_MemInit() )
        {
            ulStartUpFailStage |= 0x0001;

            break;
        }

        VOS_SemCtrlBlkInit();

        VOS_QueueCtrlBlkInit();

        VOS_TaskCtrlBlkInit();

        VOS_TimerCtrlBlkInit();

        OM_RecordMemInit();

        if ( VOS_OK != RTC_TimerCtrlBlkInit() )
        {
            ulStartUpFailStage |= 0x0100;
        }

#if (OSA_CPU_CCPU == VOS_OSA_CPU)
        if ( VOS_OK != VOS_DrxTimerCtrlBlkInit())
        {
            ulStartUpFailStage |= 0x0200;
        }
#endif

        if ( VOS_OK != VOS_PidCtrlBlkInit() )
        {
            ulStartUpFailStage |= 0x0400;
        }

        if ( VOS_OK != VOS_FidCtrlBlkInit() )
        {
            ulStartUpFailStage |= 0x0800;
        }

        if ( VOS_OK != CreateFidsQueque() )
        {
            ulStartUpFailStage |= 0x1000;
        }
        break;

    case VOS_STARTUP_SET_TIME_INTERRUPT:
        vos_StartUpStage = 0x00020000;
        break;

    case VOS_STARTUP_CREATE_TICK_TASK:
        vos_StartUpStage = 0x00040000;
        /* create soft timer task */
        if ( VOS_OK != VOS_TimerTaskCreat() )
        {
            ulStartUpFailStage |= 0x0001;
        }

        if ( VOS_OK != RTC_TimerTaskCreat() )
        {
            ulStartUpFailStage |= 0x0002;
        }

#if (OSA_CPU_CCPU == VOS_OSA_CPU)
        if ( VOS_OK != VOS_DrxTimerTaskCreat() )
        {
            ulStartUpFailStage |= 0x0004;
        }
#endif

        break;

    case VOS_STARTUP_CREATE_ROOT_TASK:
        vos_StartUpStage = 0x00080000;

        if ( VOS_OK !=
                VOS_StartCallBackRelTimer(&g_VosProtectInitTimer,
                                          DOPRA_PID_TIMER, 20000, 0, 0,
                                          VOS_RELTIMER_NOLOOP, VOS_ProtectInit, VOS_TIMER_NO_PRECISION) )
        {
            ulStartUpFailStage |= 0x0001;
        }

        g_ulVosStartStep = 0x0000;

        ulReturnValue = VOS_OutsideInit();

        if(VOS_OK != ulReturnValue)
        {
            ulStartUpFailStage |= ulReturnValue;
        }

        g_ulVosStartStep = 0x0004;

        if ( VOS_OK != WD_TaskCreat() )
        {
            ulStartUpFailStage |= 0x0004;
        }

        g_ulVosStartStep = 0x0008;

        if ( VOS_OK != VOS_FidsInit() )
        {
            ulStartUpFailStage |= 0x0008;
        }

        g_ulVosStartStep = 0x0010;

#if 0
        /* 创建VOS各FID任务之前,锁任务 */
        if ( VOS_OK != VOS_TaskLock() )
        {
            ulStartUpFailStage |= 0x0010;
        }
#endif
        g_ulVosStartStep = 0x0020;

        /* create FID task & selftask task */
        if ( VOS_OK != CreateFidsTask() )
        {
            ulStartUpFailStage |= 0x0020;
        }

#if (VOS_WIN32 != VOS_OS_VER)
        g_ulVosStartStep = 0x0040;

        /* suspend FID task & selftask task */
        if ( VOS_OK != VOS_SuspendFidsTask() )
        {
            ulStartUpFailStage |= 0x0040;
        }
#endif

        g_ulVosStartStep = 0x0080;
#if 0
        /* 创建VOS各FID任务完成后解锁 */
        if ( VOS_OK != VOS_TaskUnlock() )
        {
            ulStartUpFailStage |= 0x0080;
        }
#endif
        g_ulVosStartStep = 0x0100;

        if ( VOS_OK != VOS_PidsInit() )
        {
            ulStartUpFailStage |= 0x0100;
        }
        break;

    case VOS_STARTUP_SUSPEND_MAIN_TASK:
        vos_StartUpStage = 0x00100000;

        g_ulVosStartStep = 0x0001;

        /* Resume任务之前,锁任务 */
        if ( VOS_OK != VOS_TaskLock() )
        {
            ulStartUpFailStage |= 0x0001;
        }

#if (VOS_WIN32 != VOS_OS_VER)

        g_ulVosStartStep = 0x0002;

        /* Resume FID task & selftask task */
        if ( VOS_OK != VOS_ResumeFidsTask() )
        {
            ulStartUpFailStage |= 0x0002;
        }
#endif

        g_ulVosStartStep = 0x0004;

        /* Resume任务之后解锁 */
        if ( VOS_OK != VOS_TaskUnlock() )
        {
            ulStartUpFailStage |= 0x0004;
        }

        g_ulVosStartStep = 0x0008;

        /* stop protect timer */
        VOS_StopRelTimer(&g_VosProtectInitTimer);

#if (OSA_CPU_CCPU == VOS_OSA_CPU)
        /* OSA初始化完成,需要调用DRV函数通知DRV OSA启动完成 */
        if ( VOS_OK != DRV_CCPU_RESET_OVER() )
        {
            ulStartUpFailStage |= 0x0008;
        }
#endif

#if (VOS_LINUX == VOS_OS_VER)
        VOS_RunTask();
#endif


        break;

    default:
        break;
    }

    /* calculate return value */
    if( 0 != ulStartUpFailStage )
    {
        ulReturnValue = vos_StartUpStage;
        ulReturnValue |= ulStartUpFailStage;
        Print1("startup retuen value is %x.\r\n",ulReturnValue);

        /* reboot */
        VOS_ProtectionReboot(OSA_INIT_ERROR, (VOS_INT)ulReturnValue,
                             (VOS_INT)g_ulOmPidInit, (VOS_CHAR *)&g_ulOmFidInit, sizeof(VOS_UINT32));

        return(ulReturnValue);
    }
    else
    {
        return(VOS_OK);
    }
}
VOS_VOID OM_CallBackMsgProc(MsgBlock* pMsg)
{
    OM_REQ_PACKET_STRU                 *pstAppMsg;
    OM_REQUEST_PROCEDURE               *pOmFuncProc;

    if (UEPS_PID_APM == pMsg->ulSenderPid)
    {
#ifdef  __LDF_FUNCTION__
        if ( VOS_FALSE == pMsg->aucValue[0])
        {
            SHPA_Ldf_Check();
            VOS_ProtectionReboot(DSP_REPORT_ERROR, 0, 0, VOS_NULL_PTR, 0);
        }
        else
        {
            SHPA_Ldf_Hifi_Saving();
            VOS_ProtectionReboot(HIFI_REPORT_ERROR, 0, 0, VOS_NULL_PTR, 0);
        }
#endif
        return;
    }

    if ((DSP_PID_WPHY == pMsg->ulSenderPid)
        || (I0_DSP_PID_GPHY == pMsg->ulSenderPid)
        || (I1_DSP_PID_GPHY == pMsg->ulSenderPid))
    {
        OM_DspMsgProc(pMsg);

        return;
    }

    if ((I0_WUEPS_PID_MMA == pMsg->ulSenderPid)||(I1_WUEPS_PID_MMA == pMsg->ulSenderPid))
    {
        OM_MmaMsgProc(pMsg);

        return;
    }

    if (WUEPS_PID_OM_CALLBACK == pMsg->ulSenderPid)
    {
        OM_HsicInitMsgProc(pMsg);

        return;
    }

#if(FEATURE_ON == FEATURE_PTM)
    if (ACPU_PID_OM == pMsg->ulSenderPid)
    {
        OM_ErrLogMsgProc(pMsg);
        return;
    }
#endif

    if (UEPS_PID_OMRL != pMsg->ulSenderPid)
    {
        VOS_UnreserveMsg(WUEPS_PID_OM, pMsg);
        PS_LOG1(WUEPS_PID_OM, 0, PS_PRINT_ERROR,
             "OM_OutMsgProc: Unknown Send Pid: %d.\n", (VOS_INT32)(pMsg->ulSenderPid));
        return;
    }

    pstAppMsg = (OM_REQ_PACKET_STRU*)pMsg->aucValue;

    /*参数检测*/
    /* 高2Bit为操作modem标示 */
    if ((OM_FUNCID_PART_NUM >= (pstAppMsg->ucModuleId&OM_FUNCID_VALUE_BITS))
        || (OM_FUNCID_MAX_NUM < (pstAppMsg->ucModuleId&OM_FUNCID_VALUE_BITS)))
    {
        VOS_UnreserveMsg(WUEPS_PID_OM, pMsg);
        PS_LOG1(WUEPS_PID_OM, 0, PS_PRINT_WARNING,
        "OM_CallBackMsgProc:ucModuleId is overflow :", (VOS_INT32)pstAppMsg->ucModuleId);
        return;
    }

    pOmFuncProc = g_astOmFuncIdProcTbl[pstAppMsg->ucModuleId - 1].pOmFuncProc;
    pOmFuncProc(pstAppMsg, OM_SendData);

    VOS_UnreserveMsg(WUEPS_PID_OM, pMsg);
    return;
}