/***************************************************************************** 函 数 名 : 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) ); }
/***************************************************************************** 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 ; }
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; }