VOS_VOID CSD_DL_ProcDataTask(VOS_VOID) { VOS_UINT32 *pulDownLinkSem; pulDownLinkSem = CSD_GetDownLinkDataSem(); for ( ; ; ) { /* 获取下行取数据信号量 */ if (VOS_OK != VOS_SmP( *pulDownLinkSem, 0 )) { CSD_NORMAL_LOG(ACPU_PID_CSD, "CSD_DL_ProcDataTask:: VOS_SmP pulDownLinkSem then continue !"); #ifdef __PC_UT__ break; #else continue; #endif } /*获取当前是否挂断电话*/ if (AT_CSD_CALL_STATE_ON != CSD_GetCallState()) { /*释放数据*/ CSD_DL_ClearData(); #if 0 /*使能中断*/ DICC_EnableIsr(ACPU_PID_CSD, DICC_SERVICE_TYPE_CSD_DATA, DICC_CPU_ID_ACPU); #endif CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_DL_ProcDataTask:: AT_CSD_CALL_STATE_OFF Receive ISR"); #ifdef __PC_UT__ break; #else continue; #endif } CSD_DL_SendData(); #if 0 /* 使能中断 */ DICC_EnableIsr(ACPU_PID_CSD, DICC_SERVICE_TYPE_CSD_DATA, DICC_CPU_ID_ACPU); #endif #ifdef __PC_UT__ break; #endif } }
VOS_UINT32 CSD_InitSem(VOS_VOID) { VOS_UINT32 ulRslt; VOS_UINT32 *pULDataSem; VOS_UINT32 *pDLDataSem; pDLDataSem = CSD_GetDownLinkDataSem(); pULDataSem = CSD_GetUpLinkDataSem(); /* 初始下行信号量 */ ulRslt = VOS_SmBCreate("ulDldataSem", CSD_SEMAPHORE_INIT_CNT, VOS_SEMA4_FIFO, pDLDataSem); if (VOS_OK != ulRslt) { VOS_SmDelete(*pDLDataSem); CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_InitSem:: VOS_SmBCreate pDLDataSem fail"); return VOS_ERR; } /* 初始上行信号量 */ ulRslt = VOS_SmBCreate("ulUldataSem", CSD_SEMAPHORE_INIT_CNT, VOS_SEMA4_FIFO, pULDataSem); if (VOS_OK != ulRslt) { VOS_SmDelete(*pULDataSem); CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_InitSem:: VOS_SmBCreate pULDataSem fail"); return VOS_ERR; } return VOS_OK; }
VOS_UINT32 CSD_UL_PidInit(enum VOS_INIT_PHASE_DEFINE ip) { VOS_UINT32 ulRslt; switch ( ip ) { case VOS_IP_LOAD_CONFIG: /*DICC通道初始化*/ ulRslt = CSD_InitDicc(); if (VOS_OK != ulRslt) { CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_UL_PidInit::CSD_InitDicc FAIL"); return VOS_ERR; } /*全局变量初始化*/ ulRslt = CSD_InitCtx(); break; case VOS_IP_FARMALLOC: case VOS_IP_INITIAL: case VOS_IP_ENROLLMENT: case VOS_IP_LOAD_DATA: case VOS_IP_FETCH_DATA: case VOS_IP_STARTUP: case VOS_IP_RIVAL: case VOS_IP_KICKOFF: case VOS_IP_STANDBY: case VOS_IP_BROADCAST_STATE: case VOS_IP_RESTART: case VOS_IP_BUTT: break; } return VOS_OK; }
VOS_VOID CSD_DL_SendData(VOS_VOID) { IMM_ZC_STRU *pstCsdDLMem; CST_CSD_DATA_IND_STRU stDLData; VOS_UINT32 ulDICCNodeCnt; VOS_UINT32 ulRslt; VOS_CHAR *ImmZcData; for ( ; ; ) { /*获取DICC通道发送来数据的个数*/ ulDICCNodeCnt = DICC_GetChannelCurrDataCnt(ACPU_PID_CSD, DICC_CHAN_ID_DL_CSD_DATA_CHAN, DICC_CPU_ID_ACPU); if ( DICC_INVALID_VALUE == ulDICCNodeCnt ) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_DL_SendData :: DICC_GetChannelCurrDataCnt is Wrong", ulDICCNodeCnt); break; } if (0 != ulDICCNodeCnt ) { /*从DICC通道中移出数据*/ ulRslt = DICC_RemoveChannelData(ACPU_PID_CSD, DICC_CHAN_ID_DL_CSD_DATA_CHAN, (VOS_UINT8 *)(&stDLData), DICC_CPU_ID_ACPU); if (DICC_OK != ulRslt) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_DL_SendData:: enMsgId Illage", ulRslt); break; } if (VOS_NULL_PTR == stDLData.pGarbage) { CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_DL_SendData:: stDLData.pGarbage Is Null"); break; } CSD_DBG_DL_RECV_PKT_NUM(1); /*申请sk_buffer内存*/ pstCsdDLMem = IMM_ZcStaticAlloc(stDLData.usLen); if (VOS_NULL_PTR == pstCsdDLMem) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_DL_SendData:: pstCsdDLMem Is Null IMM_ZcStaticAlloc Fail", pstCsdDLMem); /*通知cCpu释放TTFmem*/ IMM_RemoteFreeTtfMem(stDLData.pGarbage); /*此处用continue可能导致死循环*/ break; } /*此步骤不能少用来偏移数据尾指针*/ /* Modified by l60609 for AP适配项目 ,2012-08-31 Begin */ ImmZcData = (VOS_CHAR *)IMM_ZcPut(pstCsdDLMem, stDLData.usLen); /* Modified by l60609 for AP适配项目 ,2012-08-31 End */ PS_MEM_CPY(ImmZcData, (VOS_UINT8 *)TTF_PHY_TO_VIRT((VOS_UINT32)stDLData.pucData), stDLData.usLen); /*发送数据到驱动,第一个参数为pppid目前不使用,由于失败AT会释放内存, 所以此处不需要另行释放a核内存*/ ulRslt = AT_SendCsdZcDataToModem(CSD_UL_GetAtClientIndex(), pstCsdDLMem); if (VOS_OK != ulRslt) { CSD_DBG_DL_SEND_FAIL_NUM(1); CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_DL_SendData:: AT_SendZcDataToModem Fail"); /*通知cCpu释放TTFmem*/ IMM_RemoteFreeTtfMem(stDLData.pGarbage); /*此处用continue可能导致死循环*/ break; } CSD_DBG_DL_SEND_PKT_NUM(1); /*通知cCpu释放TTFmem*/ IMM_RemoteFreeTtfMem(stDLData.pGarbage); } else { /*通道内数据发送完*/ CSD_NORMAL_LOG1(ACPU_PID_CSD, "CSD_DL_SendData Queue is Null", ulDICCNodeCnt); break; } CSD_NORMAL_LOG1(ACPU_PID_CSD, "CSD_DL_SendData Done", ulDICCNodeCnt); } }
VOS_UINT32 CSD_FidInit (enum VOS_INIT_PHASE_DEFINE enInitPhase) { VOS_UINT32 ulReturnCode; switch ( enInitPhase ) { case VOS_IP_LOAD_CONFIG: /*初始化上行下行信号量*/ ulReturnCode = CSD_InitSem(); if (VOS_OK != ulReturnCode) { CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_FidInit::CSD_InitSem FAIL"); return VOS_ERR; } ulReturnCode = VOS_RegisterPIDInfo(ACPU_PID_CSD, (Init_Fun_Type) CSD_UL_PidInit, (Msg_Fun_Type) CSD_UL_ProcMsg); if ( VOS_OK != ulReturnCode ) { CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_FidInit::VOS_RegisterPIDInfo ACPU_PID_CSD FAIL"); return VOS_ERR; } /* 上行自处理任务注册 */ ulReturnCode = VOS_RegisterSelfTask(ACPU_FID_CSD, (VOS_TASK_ENTRY_TYPE)CSD_UL_ProcDataTask, VOS_PRIORITY_P5, CSD_UL_DATA_TASK_STACK_SIZE); if ( VOS_NULL_BYTE == ulReturnCode ) { CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_FidInit, ERROR, Fail regist CSD_UL_ProcDataTask"); return VOS_ERR; } /* 下行自处理任务注册 */ ulReturnCode = VOS_RegisterSelfTask(ACPU_FID_CSD, (VOS_TASK_ENTRY_TYPE)CSD_DL_ProcDataTask, VOS_PRIORITY_P5, CSD_DL_DATA_TASK_STACK_SIZE); if ( VOS_NULL_BYTE == ulReturnCode ) { CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_FidInit, ERROR, Fail regist CSD_DL_ProcDataTask"); return VOS_ERR; } /* 任务优先级 */ ulReturnCode = VOS_RegisterMsgTaskPrio(ACPU_FID_CSD, VOS_PRIORITY_P3); if( VOS_OK != ulReturnCode ) { return VOS_ERR; } break; case VOS_IP_FARMALLOC: case VOS_IP_INITIAL: case VOS_IP_ENROLLMENT: case VOS_IP_LOAD_DATA: case VOS_IP_FETCH_DATA: case VOS_IP_STARTUP: case VOS_IP_RIVAL: case VOS_IP_KICKOFF: case VOS_IP_STANDBY: case VOS_IP_BROADCAST_STATE: case VOS_IP_RESTART: case VOS_IP_BUTT: break; } return VOS_OK; }