TAF_MMA_INTERNAL_MSG_BUF_STRU* TAF_MMA_GetNextInternalMsg( VOS_VOID ) { TAF_MMA_INTERNAL_MSG_BUF_STRU *pstNextMsg = VOS_NULL_PTR; TAF_MMA_CONTEXT_STRU *pstMmaCtx = VOS_NULL_PTR; VOS_UINT8 ucNextIndex; pstMmaCtx = TAF_MMA_GetMmaCtxAddr(); if (pstMmaCtx->stInternalMsgQueue.ucHeader != pstMmaCtx->stInternalMsgQueue.ucTail) { ucNextIndex = pstMmaCtx->stInternalMsgQueue.ucHeader; pstNextMsg = (TAF_MMA_INTERNAL_MSG_BUF_STRU *)&(pstMmaCtx->stInternalMsgQueue.astMmaMsgQueue[ucNextIndex]); /* 取完一条消息,头指针向后偏移 */ (pstMmaCtx->stInternalMsgQueue.ucHeader)++; (pstMmaCtx->stInternalMsgQueue.ucHeader) %= TAF_MMA_MAX_MSG_QUEUE_SIZE; return pstNextMsg; } TAF_INFO_LOG(WUEPS_PID_MMA, "TAF_MMA_GetNextInternalMsg:Empty Internal Msg"); return VOS_NULL_PTR; }
TAF_MMA_INTERNAL_MSG_BUF_STRU *TAF_MMA_GetIntMsgSendBuf( VOS_UINT32 ulLen ) { TAF_MMA_INTERNAL_MSG_BUF_STRU *pstTafMmaMsg = VOS_NULL_PTR; TAF_MMA_INTERNAL_MSG_QUEUE_STRU *pstInternalMsgQueue = VOS_NULL_PTR; pstInternalMsgQueue = &(TAF_MMA_GetMmaCtxAddr()->stInternalMsgQueue); /* 从上下文中获取消息缓冲区指针 */ pstTafMmaMsg = ( TAF_MMA_INTERNAL_MSG_BUF_STRU *)&(pstInternalMsgQueue->stSendMsgBuf); if (ulLen > TAF_MMA_MAX_MSG_BUFFER_LEN ) { TAF_ERROR_LOG(WUEPS_PID_MMA, "TAF_MMA_GetIntMsgSendBuf: Buffer full" ); TAF_MMA_SndOmInternalMsgQueueInfo(VOS_FALSE, VOS_FALSE); return VOS_NULL_PTR; } /* 清空这个消息缓冲单元 */ PS_MEM_SET(pstTafMmaMsg, 0x00, sizeof(TAF_MMA_INTERNAL_MSG_BUF_STRU)); /* 返回缓冲区指针 */ return pstTafMmaMsg; }
VOS_UINT32 TAF_MMA_InitTask( VOS_VOID ) { VOS_UINT32 ulAutoInitPsFlg; /* 全局变量初始化 */ TAF_MMA_InitCtx(TAF_MMA_INIT_CTX_STARTUP, TAF_MMA_GetMmaCtxAddr()); /* 读取NV */ TAF_MMA_ReadNvim(); /* 注册状态机 */ TAF_MMA_RegFsm(); ulAutoInitPsFlg = TAF_MMA_GetAutoInitPsFlg(); /* 上电初始化协议栈NV打开并且不是SFT平台则自动上电 */ if ((DRV_NOT_START_UMTS != DRV_BBP_GPIO_GET()) && (VOS_TRUE == ulAutoInitPsFlg)) { /* 发送内部上电消息 */ TAF_MMA_SndInterPowerInitReq(); } else { /* FID初始化已投票禁止睡眠,非自动开机的场景允许睡眠 */ TAF_DRVAPI_PWRCTRL_SLEEPVOTE_UNLOCK(PWRCTRL_SLEEP_NAS); } return VOS_TRUE; }
VOS_VOID TAF_MMA_InitAttachInfo(VOS_VOID) { TAF_MMA_CONTEXT_STRU *pstMmaCtx = VOS_NULL_PTR; pstMmaCtx = TAF_MMA_GetMmaCtxAddr(); pstMmaCtx->stAttachInfo.ucAttachOpId = 0; }
VOS_UINT16 TAF_MMA_GetCurPhoneErrorCode_PhoneMode(VOS_VOID) { /* 如果当前状态机不是PHONE MODE, 异常打印 */ if (TAF_MMA_FSM_PHONE_MODE != TAF_MMA_GetCurrFsmId()) { TAF_ERROR_LOG(WUEPS_PID_MMA, "TAF_MMA_GetCurPhoneErrorCode_PhoneMode,ERROR:FsmId Error"); } return (TAF_MMA_GetMmaCtxAddr()->stCurFsm.unFsmCtx.stPhoneModeCtx.usPhoneError); }
VOS_UINT32 TAF_MMA_SndInternalMsg( VOS_VOID *pSndMsg ) { VOS_UINT8 ucMsgPnt; TAF_MMA_INTERNAL_MSG_BUF_STRU *pstMmaMsg = VOS_NULL_PTR; TAF_MMA_INTERNAL_MSG_QUEUE_STRU *pstInternalMsgQueue = VOS_NULL_PTR; TAF_MMA_INTERNAL_MSG_BUF_STRU *pstSndMsg = VOS_NULL_PTR; pstInternalMsgQueue = &(TAF_MMA_GetMmaCtxAddr()->stInternalMsgQueue); pstSndMsg = (TAF_MMA_INTERNAL_MSG_BUF_STRU*)pSndMsg; /* 1. 判断内部消息缓冲区是否已满 */ ucMsgPnt = pstInternalMsgQueue->ucTail; if ( ((ucMsgPnt + 1) % TAF_MMA_MAX_MSG_QUEUE_SIZE) == pstInternalMsgQueue->ucHeader ) { TAF_WARNING_LOG(WUEPS_PID_MMA, "TAF_MMA_SndInternalMsg:Warning: The Queue is full."); TAF_MMA_SndOmInternalMsgQueueInfo(VOS_TRUE, VOS_FALSE); return VOS_FALSE; } /* 2. 取得一个消息缓冲单元 */ pstMmaMsg = (TAF_MMA_INTERNAL_MSG_BUF_STRU *)&(pstInternalMsgQueue->astMmaMsgQueue[ucMsgPnt]); /* 3. 判断消息长度是否非法 */ if ( pstSndMsg->ulLength > TAF_MMA_MAX_MSG_BUFFER_LEN) { TAF_WARNING_LOG(WUEPS_PID_MMC, "TAF_MMA_SndInternalMsg:Warning: ulBufLen is too long."); return VOS_FALSE; } TAF_NORMAL_LOG1(WUEPS_PID_MMA, "TAF_MMA_SndInternalMsg: usMsgID is ", pstMmaMsg->usMsgID); /* 4. 将内部消息发送到内部消息队列中 */ PS_MEM_CPY(pstMmaMsg, pstSndMsg, sizeof(TAF_MMA_INTERNAL_MSG_BUF_STRU)); /* 更新内部消息缓冲区 */ pstInternalMsgQueue->ucTail++; pstInternalMsgQueue->ucTail %= TAF_MMA_MAX_MSG_QUEUE_SIZE; return VOS_TRUE; }
VOS_VOID TAF_MMA_InitTask( VOS_VOID ) { VOS_UINT32 ulAutoInitPsFlg; NAS_TRACE_HIGH("Mma Init Task Begin!!"); /* 全局变量初始化 */ TAF_MMA_InitCtx(TAF_MMA_INIT_CTX_STARTUP, TAF_MMA_GetMmaCtxAddr()); /* 读取NV */ TAF_MMA_ReadNvim(); TAF_MMA_InitTimerLen(); /* 注册状态机 */ TAF_MMA_RegFsm(); ulAutoInitPsFlg = TAF_MMA_GetAutoInitPsFlg(); NAS_TRACE_HIGH("ulAutoInitPsFlg = %d",ulAutoInitPsFlg); /* 上电初始化协议栈NV打开并且不是SFT平台则自动上电 */ if ((DRV_NOT_START_UMTS != mdrv_sysboot_check_startps()) && (VOS_TRUE == ulAutoInitPsFlg)) { /* 发送内部上电消息 */ TAF_MMA_SndInterPowerInitReq(); } else { NAS_TRACE_HIGH("Not start PS"); /* FID初始化已投票禁止睡眠,非自动开机的场景允许睡眠 */ TAF_DRVAPI_PWRCTRL_SLEEPVOTE_UNLOCK(PWRCTRL_SLEEP_NAS); } return; }
TAF_MMA_FSM_CTX_STRU* TAF_MMA_GetCurFsmAddr(VOS_VOID) { return &(TAF_MMA_GetMmaCtxAddr()->stCurFsm); }
TAF_MMA_FSM_STACK_STRU* TAF_MMA_GetFsmStackAddr(VOS_VOID) { return &(TAF_MMA_GetMmaCtxAddr()->stFsmStack); }
VOS_VOID TAF_MMA_SetMmaLogInfoFlag( VOS_UINT8 ucMmaLogInfoFlag ) { TAF_MMA_GetMmaCtxAddr()->stMaintainInfo.ucMmaLogInfoFlag = ucMmaLogInfoFlag; }
VOS_UINT8 TAF_MMA_GetMmaLogInfoFlag( VOS_VOID ) { return TAF_MMA_GetMmaCtxAddr()->stMaintainInfo.ucMmaLogInfoFlag; }
TAF_MMA_OPER_CTX_STRU* TAF_MMA_GetOperCtxAddr( VOS_VOID ) { return TAF_MMA_GetMmaCtxAddr()->astMmaOperCtx; }
TAF_MMA_TIMER_CTX_STRU* TAF_MMA_GetTimerCtxAddr( VOS_VOID ) { return TAF_MMA_GetMmaCtxAddr()->astMmaTimerCtx; }
TAF_MMA_PHONE_MODE_CTRL_CTX_STRU *TAF_MMA_GetPhoneModeCtrl(VOS_VOID) { return &(TAF_MMA_GetMmaCtxAddr()->stPhoneModeCtrl); }
TAF_MMA_MSG_QUEUE_STRU* TAF_MMA_GetCachMsgBufferAddr(VOS_VOID) { return &(TAF_MMA_GetMmaCtxAddr()->stBufferEntryMsgQueue); }
TAF_MMA_FSM_ID_ENUM_UINT32 TAF_MMA_GetCurrFsmId(VOS_VOID) { return (TAF_MMA_GetMmaCtxAddr()->stCurFsm.enFsmId); }
TAF_MMA_ENTRY_MSG_STRU* TAF_MMA_GetCurrFsmMsgAddr(VOS_VOID) { return &(TAF_MMA_GetMmaCtxAddr()->stCurFsm.stEntryMsg); }
TAF_FSM_DESC_STRU* TAF_MMA_GetCurFsmDesc(VOS_VOID) { return (TAF_MMA_GetMmaCtxAddr()->stCurFsm.pstFsmDesc); }