VOS_UINT32 CSD_UL_FreeQueue(IMM_ZC_HEAD_STRU *pstQueue) { IMM_ZC_STRU *pstNode; VOS_UINT32 i; VOS_UINT32 ulQueueCnt; ulQueueCnt = IMM_ZcQueueLen(pstQueue); for (i = 0; i < ulQueueCnt; i++) { pstNode = CSD_UL_GetQueueFrontNode(pstQueue); if(VOS_NULL_PTR == pstNode) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_UL_FreeQueue:: CSD_UL_GetQueueFrontNode fail", pstNode); return VOS_ERR; } /*释放数据内存*/ IMM_ZcFree(pstNode); } CSD_NORMAL_LOG3(ACPU_PID_CSD, "CSD_UL_FreeQueue:: Queue len is %d, Pre is 0x%x, Next is 0x%x", pstQueue->qlen, pstQueue->next, pstQueue->prev); return VOS_OK; }
VOS_VOID CSD_DL_ClearData(VOS_VOID) { VOS_UINT32 ulDICCNodeCnt; VOS_UINT32 ulRslt; CST_CSD_DATA_IND_STRU stDLData; /*获取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_ClearData :: DICC_GetChannelCurrDataCnt is Wrong", ulDICCNodeCnt); return; } while ((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_ClearData:: DICC_RemoveChannelData Fail", ulRslt); break; } ulDICCNodeCnt-- ; /*通知cCpu释放TTFmem*/ IMM_RemoteFreeTtfMem(stDLData.pGarbage); } CSD_NORMAL_LOG(ACPU_PID_CSD,"CSD_DL_ClearData Done"); }
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_InitDicc(VOS_VOID) { VOS_UINT32 ulDICCRslt; DICC_INIT_CHN_INFO_STRU stSendInitInfo; DICC_INIT_CHN_INFO_STRU stRcvInitInfo; /* 发送端参数设置 */ stSendInitInfo.enUserRole = DICC_CHAN_ROLE_SENDER; stSendInitInfo.u.stSndInitInfo.stSndChnInfo.usChnBlkNum = DICC_PER_QUEUE_MAX_NODE_NUM; stSendInitInfo.u.stSndInitInfo.stSndChnInfo.usChnBlkSize = DICC_INFO_BLOCK_MAX_LEN; /* 接收端参数设置 */ stRcvInitInfo.enUserRole = DICC_CHAN_ROLE_RECVER; /*中断响应函数*/ stRcvInitInfo.u.stRcvInitInfo.pfuncRecvIsr = CSD_DL_ProcIsr; /*初始化DICC发送通道*/ ulDICCRslt = DICC_SingleChnInit(ACPU_PID_CSD, DICC_SERVICE_TYPE_CSD_DATA, &stSendInitInfo, DICC_CPU_ID_ACPU); if (DICC_OK != ulDICCRslt) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_InitDicc::DICC Sender INIT FAIL",ulDICCRslt); return VOS_ERR; } /* 初始化DICC接收通道*/ ulDICCRslt = DICC_SingleChnInit(ACPU_PID_CSD, DICC_SERVICE_TYPE_CSD_DATA, &stRcvInitInfo, DICC_CPU_ID_ACPU); if (DICC_OK != ulDICCRslt) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_InitDicc::DICC Sender INIT FAIL",ulDICCRslt); return VOS_ERR; } /*打开上行DICC发送通道*/ ulDICCRslt = DICC_OpenChannel(ACPU_PID_CSD, DICC_CHAN_ID_UL_CSD_DATA_CHAN, DICC_CHAN_ROLE_SENDER, DICC_CPU_ID_ACPU); if (DICC_OK != ulDICCRslt) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_InitDicc::DICC SENDER OPEN FAIL",ulDICCRslt); return VOS_ERR; } /*打开下行DICC接收通道*/ ulDICCRslt = DICC_OpenChannel(ACPU_PID_CSD, DICC_CHAN_ID_DL_CSD_DATA_CHAN, DICC_CHAN_ROLE_RECVER, DICC_CPU_ID_ACPU); if (DICC_OK != ulDICCRslt) { CSD_ERROR_LOG1(ACPU_PID_CSD,"CSD_InitDicc :DICC RECVER OPEN FAIL",ulDICCRslt); return VOS_ERR; } return VOS_OK; }