VOS_VOID TTF_MemRbRxFreeMemTask(VOS_VOID) { /* 解决UT死循环问题 */ #ifdef __UT_CENTER__ VOS_UINT32 ulLoop; #endif VOS_UINT32 ulLoopCnt = 0; VOS_UINT32 ulSmRst = VOS_OK; TTF_RbRxFreeMemTaskInit(); #ifndef __UT_CENTER__ for ( ; ; ) #else for (ulLoop = 0; ulLoop < 1; ulLoop++) #endif { ulSmRst = VOS_SmP(g_ulTtfMemRbFreeSem, 0); /* take信号量失败是异常失败 */ if(VOS_OK != ulSmRst) { ulLoopCnt++; if (ulLoopCnt >= TTF_MEM_RB_TASK_FAIL_CNT_MAX) { DRV_SYSTEM_ERROR((VOS_INT)(TTF_MEM_RB_TASK_FAIL_SEM_ERR), (VOS_INT)ulSmRst, (VOS_INT)g_ulTtfMemRbFreeSem, (VOS_VOID *)&g_ulFreeTtfMemBlkNoticNum, 2 * sizeof(VOS_UINT32)); } TTF_LOG1(UEPS_PID_TTF_MEM_RB_FREE, PS_PRINT_ERROR, "TTF_MemRb, TTF_MEM_RB_RxFreeMemTask : ERROR : VOS_SmP Failed, Error Code = %d !\n", (VOS_INT)ulSmRst); VOS_TaskDelay(2); continue; } /* 释放 */ TTF_MemFreeFromQue(); } }/* TTF_MemRbRxFreeMemTask */
VOS_UINT32 diag_ReleaseLogMem(DIAG_BUF_CTRL_STRU *pstBufCtrl,VOS_UINT8 *pAddr, VOS_INT32 lLen) { VOS_INT32 lUsedSize; VOS_INT32 lTmpRls; /* 如果当前处于中断上下文,则复位系统,诊断接口不允许在中断中使用*/ if(VOS_FALSE != VOS_CheckInterrupt()) { DRV_SYSTEM_ERROR(DIAG_CALLED_IN_IRQ, MSP_FILE_ID_DIAG_BUF_CTRL_C, __LINE__, VOS_NULL, 0);/*lint !e569*/ } /* 输入参数检测 */ if ((VOS_NULL_PTR == pstBufCtrl) || (lLen >= pstBufCtrl->lBufSize)) { diag_printf("diag_ReleaseLogMem:入参不对,lLen=%d!\n",lLen); return ERR_MSP_FAILURE; } /* 释放内存地址进行检测 */ if ((pAddr != (pstBufCtrl->pucBuf + pstBufCtrl->lRelease)) && (pAddr != pstBufCtrl->pucBuf)) { diag_printf("diag_ReleaseLogMem:待释放地址不对!pAddr=%p,pstBufCtrl->pucBuf=%p,pstBufCtrl->lRelease=0x%x\n", pAddr,pstBufCtrl->pucBuf,pstBufCtrl->lRelease); /*DRV_SYSTEM_ERROR(DIAG_REALSE_POINTER_ERROR, MSP_FILE_ID_DIAG_BUF_CTRL_C, __LINE__, VOS_NULL, 0);*//*lint !e569*/ } /* 未回卷 */ if (pstBufCtrl->lAlloc >= pstBufCtrl->lRelease) { lUsedSize = pstBufCtrl->lAlloc - pstBufCtrl->lRelease; /* 长度错误 */ if (lUsedSize < lLen) { diag_printf("diag_ReleaseLogMem:使用长度小于待释放长度!lAlloc=0x%x,lRelease=0x%x,lLen=%d!\n", pstBufCtrl->lAlloc,pstBufCtrl->lRelease,lLen); return ERR_MSP_FAILURE; } pstBufCtrl->lRelease = pAddr + lLen - pstBufCtrl->pucBuf; return ERR_MSP_SUCCESS; } if ((pAddr - pstBufCtrl->pucBuf + lLen) > pstBufCtrl->lBufSize) { lTmpRls = ((pAddr - pstBufCtrl->pucBuf + lLen) + pstBufCtrl->lPadding) % pstBufCtrl->lBufSize; } else { lTmpRls = (pAddr - pstBufCtrl->pucBuf + lLen) % pstBufCtrl->lBufSize; } /* 输入ulLen不正确 */ if ((lTmpRls > pstBufCtrl->lAlloc) && (lTmpRls < pstBufCtrl->lRelease)) { diag_printf("diag_ReleaseLogMem:有回卷情况,待释放地址不对!\n"); return ERR_MSP_FAILURE; } /* 如果发生回卷则将Padding值归0 */ if (lTmpRls <= pstBufCtrl->lAlloc) { pstBufCtrl->lPadding = 0; } pstBufCtrl->lRelease = lTmpRls; return ERR_MSP_SUCCESS; }
VOS_UINT32 OM_ComRx_ICC_Init(VOS_VOID) { VOS_INT32 i; VOS_MemSet(g_astOMComRxCBTable, 0 ,sizeof(g_astOMComRxCBTable)); VOS_MemSet(g_astOMCCPUIccCtrlTable, 0, sizeof(g_astOMCCPUIccCtrlTable)); for (i = 0; i < OM_ICC_CHANNEL_BUTT; i++) { g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr = (ICC_CHAN_ATTR_S*)VOS_MemAlloc(WUEPS_PID_OM, STATIC_MEM_PT, sizeof(ICC_CHAN_ATTR_S)); if(VOS_NULL_PTR == g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr) { LogPrint1("OM_ComRx_ICC_Init: VOS_MemAlloc Failed, Index is %d.\n", i); return VOS_ERR; } } g_astOMCCPUIccCtrlTable[OM_OM_ICC_CHANNEL].stUDICtrl.enICCId = UDI_ICC_GUOM0_ID; g_astOMCCPUIccCtrlTable[OM_OM_ICC_CHANNEL].stUDICtrl.pstICCAttr->read_cb = OM_ComRx_ICC_OM_CB; g_astOMCCPUIccCtrlTable[OM_OSA_MSG_ICC_CHANNEL].stUDICtrl.enICCId = UDI_ICC_GUOM4_ID; g_astOMCCPUIccCtrlTable[OM_OSA_MSG_ICC_CHANNEL].stUDICtrl.pstICCAttr->read_cb = V_ICC_OSAMsg_CB; for(i=0; i<OM_ICC_CHANNEL_BUTT; i++) { g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr->u32Priority = OM_ICC_CHANNEL_PRIORITY; /* 统一使用最高优先级 */ g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr->u32TimeOut = OM_ICC_HANDSHAKE_TIME_MAX; if( i == OM_OSA_MSG_ICC_CHANNEL) { g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr->u32FIFOInSize = OSA_ICC_BUFFER_SIZE; g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr->u32FIFOOutSize = OSA_ICC_BUFFER_SIZE; } else { g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr->u32FIFOInSize = OM_ICC_BUFFER_SIZE; g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr->u32FIFOOutSize = OM_ICC_BUFFER_SIZE; } g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr->enChanMode = ICC_CHAN_MODE_PACKET; g_astOMCCPUIccCtrlTable[i].stUDICtrl.pstICCAttr->event_cb = OM_ComRx_ICCError_CB; g_astOMCCPUIccCtrlTable[i].UDIHdle = DRV_UDI_OPEN((UDI_OPEN_PARAM *)&(g_astOMCCPUIccCtrlTable[i].stUDICtrl)); if (VOS_ERROR == g_astOMCCPUIccCtrlTable[i].UDIHdle) { /* 打开失败时记录当前ICC通道信息 */ DRV_SYSTEM_ERROR(OM_APP_ICC_INIT_ERROR, THIS_FILE_ID, __LINE__, (VOS_CHAR*)&i, sizeof(VOS_INT32)); return VOS_ERR; } } g_OSAIccUDIHandle = g_astOMCCPUIccCtrlTable[OM_OSA_MSG_ICC_CHANNEL].UDIHdle; return VOS_OK; }
VOS_UINT32 GU_OamPortSend(OM_PROT_HANDLE_ENUM_UINT32 enHandle, VOS_UINT8 *pucData, VOS_UINT32 ulDataLen) { VOS_INT32 lRet; ACM_WR_ASYNC_INFO stVcom; VOS_UINT32 ulInSlice; VOS_UINT32 ulOutSlice; VOS_UINT32 ulWriteSlice; VOS_CHAR aucUsbLog[100]; stVcom.pBuffer = (VOS_CHAR*)pucData; stVcom.u32Size = ulDataLen; stVcom.pDrvPriv= VOS_NULL_PTR; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBWriteNum1++; if (VOS_ERROR == g_astOMPortUDIHandle[enHandle]) { LogPrint("\r\nGU_OamPortSend: USB HANDLE is err. \n"); return CPM_SEND_ERR; } ulInSlice = OM_GetSlice(); /* 返回写入数据长度代表写操作成功 */ lRet = DRV_UDI_IOCTL(g_astOMPortUDIHandle[enHandle], ACM_IOCTL_WRITE_ASYNC, &stVcom); g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBWriteNum2++; ulOutSlice = OM_GetSlice(); if(ulInSlice > ulOutSlice) { ulWriteSlice = ulInSlice - ulOutSlice; } else { ulWriteSlice = ulOutSlice - ulInSlice; } if(ulWriteSlice > g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBWriteMaxTime) { g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBWriteMaxTime = ulWriteSlice; } if (BSP_OK == lRet) /*当前发送成功*/ { return CPM_SEND_OK; } else if(BSP_OK > lRet) /*临时错误*/ { /*打印信息,调用UDI接口的错误信息*/ LogPrint1("\r\nGU_OamPortSend: DRV_UDI_IOCTL Send Data return Error %d\n", lRet); g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBWriteErrNum++; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBWriteErrLen += ulDataLen; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBWriteErrValue = (VOS_UINT32)lRet; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBWriteErrTime = OM_GetSlice(); if (VOS_OK != OM_AcpuGetLogPath(aucUsbLog, OM_USB_LOG_FILE, OM_USB_UNITARY_LOG_FILE)) { return CPM_SEND_FUNC_NULL; } if( 0 == (g_ulUSBSendErrCnt%USB_SEND_DATA_ERROR_MAX)) /*累计丢包超过限制需要记录到log文件中*/ { OM_Acpu_WriteLogFile(aucUsbLog, (VOS_CHAR *)&g_stAcpuDebugInfo, sizeof(OM_ACPU_DEBUG_INFO)); } g_ulUSBSendErrCnt++; return CPM_SEND_FUNC_NULL; /*对于临时错误,需要返回NULL丢弃数据*/ } else /*其他错误需要复位单板*/ { /*打印信息,调用UDI接口*/ LogPrint1("\r\nGU_OamPortSend: DRV_UDI_IOCTL Send Data return Error %d\n", lRet); DRV_SYSTEM_ERROR(OAM_USB_SEND_ERROR, lRet, (VOS_INT)enHandle, (VOS_CHAR *)&g_stAcpuDebugInfo, sizeof(OM_ACPU_DEBUG_INFO)); return CPM_SEND_ERR; } }
/***************************************************************************** Function : VOS_CreateTask Description: create task with default task mode: VOS_T_PREEMPT | VOS_T_NO_TSLICE | VOS_T_SUPV Input : puchName -- name identify task pfnFunc -- task entry function ulPriority -- task priority ulStackSize -- task stack size aulArgs[VOS_TARG_NUM] -- arguments for task Output : pulTaskID -- task id allocated by dopra Return : result of VOS_CreateTaskEx *****************************************************************************/ VOS_UINT32 VOS_CreateTask( VOS_CHAR * puchName, VOS_UINT32 * pulTaskID, VOS_TASK_ENTRY_TYPE pfnFunc, VOS_UINT32 ulPriority, VOS_UINT32 ulStackSize, VOS_UINT32 aulArgs[VOS_TARG_NUM] ) { int i; VOS_UINT32 iTid; pid_t ThreadID; VOS_CHAR default_name[8] = {0}; VOS_UCHAR value; struct task_struct *tsk; struct sched_param param; iTid = VOS_TaskCtrlBlkGet(); if( iTid == (VOS_UINT32)VOS_TASK_CTRL_BLK_NULL ) { VOS_TaskPrintCtrlBlkInfo(); DRV_SYSTEM_ERROR(OSA_ALLOC_TASK_CONTROL_ERROR, (VOS_INT)vos_TaskCtrlBlkNumber, (VOS_INT)pfnFunc, VOS_NULL_PTR, 0); VOS_SetErrorNo(VOS_ERRNO_TASK_CREATE_NOFREETCB); return( VOS_ERRNO_TASK_CREATE_NOFREETCB ); } /* caller not use name asign a default name */ if ( VOS_NULL_PTR == puchName ) { default_name[0]= 't'; default_name[1]= 'i'; default_name[2]= 'd'; default_name[3] = (VOS_CHAR)(48 + iTid/100); value = (VOS_UCHAR)(iTid%100); default_name[4] = (VOS_CHAR)(48 + value/10); default_name[5] = (VOS_CHAR)(48 + value%10); default_name[6]= '\0'; } *pulTaskID = iTid; if ( VOS_NULL_PTR != puchName ) { for(i=0; i<VOS_MAX_LENGTH_TASK_NAME; i++) { vos_TaskCtrlBlk[iTid].Name[i]= puchName[i]; } vos_TaskCtrlBlk[iTid].Name[i-1] = '\0'; } else { vos_TaskCtrlBlk[iTid].Name[0] = default_name[0]; vos_TaskCtrlBlk[iTid].Name[1] = default_name[1]; vos_TaskCtrlBlk[iTid].Name[2] = default_name[2]; vos_TaskCtrlBlk[iTid].Name[3] = default_name[3]; vos_TaskCtrlBlk[iTid].Name[4] = default_name[4]; vos_TaskCtrlBlk[iTid].Name[5] = default_name[5]; vos_TaskCtrlBlk[iTid].Name[6] = default_name[6]; } vos_TaskCtrlBlk[iTid].Function = pfnFunc; vos_TaskCtrlBlk[iTid].Priority = ulPriority; vos_TaskCtrlBlk[iTid].StackSize = ulStackSize; for ( i=0; i<VOS_TARG_NUM; i++ ) { vos_TaskCtrlBlk[iTid].Args[i] = aulArgs[i]; } ThreadID = kernel_thread( (LINUX_START_ROUTINE)VOS_LinuxTaskEntry, ( VOS_VOID * )&(vos_TaskCtrlBlk[iTid]), CLONE_KERNEL); if (ThreadID < VOS_NULL) { VOS_TaskPrintCtrlBlkInfo(); DRV_SYSTEM_ERROR(OSA_CREATE_TASK_ERROR, (VOS_INT)ThreadID, (VOS_INT)iTid, VOS_NULL_PTR, 0); VOS_TaskCtrlBlkFree(iTid); VOS_SetErrorNo(VOS_ERRNO_TASK_CREATE_OSALCREATEFAIL); return( VOS_ERRNO_TASK_CREATE_OSALCREATEFAIL ); } vos_TaskCtrlBlk[iTid].ulLinuxThreadId = ThreadID; tsk = pid_task(find_vpid(ThreadID), PIDTYPE_PID); if ( VOS_NULL_PTR == tsk ) { VOS_TaskPrintCtrlBlkInfo(); DRV_SYSTEM_ERROR(OSA_FIND_TASK_ERROR, (VOS_INT)ThreadID, (VOS_INT)iTid, VOS_NULL_PTR, 0); return VOS_ERR; } if ( tsk->pid != ThreadID ) { vos_printf("find task to set pri fail.\r\n"); VOS_TaskPrintCtrlBlkInfo(); DRV_SYSTEM_ERROR(OSA_FIND_TASK_PARA_ERROR, (VOS_INT)ThreadID, (VOS_INT)iTid, (VOS_CHAR *)tsk, sizeof(struct task_struct)); return VOS_ERR; } param.sched_priority = ulPriority; if (VOS_NULL != sched_setscheduler(tsk, SCHED_FIFO, ¶m)) { vos_printf("\r\nVOS_CreateTask: Creat Task %s ID %d sched_setscheduler Error", puchName, iTid); VOS_TaskPrintCtrlBlkInfo(); DRV_SYSTEM_ERROR(OSA_SET_TASK_PRI_ERROR, (VOS_INT)ulPriority, (VOS_INT)iTid, (VOS_CHAR *)tsk, sizeof(struct task_struct)); return VOS_ERR; } return VOS_OK; }
VOS_UINT32 CBTPPM_OamUsbCbtSendData(VOS_UINT8 *pucVirAddr, VOS_UINT8 *pucPhyAddr, VOS_UINT32 ulDataLen) { VOS_INT32 lRet; ACM_WR_ASYNC_INFO stVcom; VOS_UINT32 ulInSlice; VOS_UINT32 ulOutSlice; VOS_UINT32 ulWriteSlice; if ((VOS_NULL_PTR == pucVirAddr) || (VOS_NULL_PTR == pucPhyAddr)) { /* 打印错误 */ LogPrint("\r\n CBTPPM_OamUsbCbtSendData: Vir or Phy Addr is Null \n"); return CPM_SEND_PARA_ERR; } stVcom.pVirAddr = (VOS_CHAR*)pucVirAddr; stVcom.pPhyAddr = (VOS_CHAR*)pucPhyAddr; stVcom.u32Size = ulDataLen; stVcom.pDrvPriv = VOS_NULL_PTR; g_stAcpuDebugInfo.astPortInfo[OM_USB_CBT_PORT_HANDLE].ulUSBWriteNum1++; ulInSlice = OM_GetSlice(); lRet = DRV_UDI_IOCTL(g_ulCbtPortUDIHandle, ACM_IOCTL_WRITE_ASYNC, &stVcom); g_stAcpuDebugInfo.astPortInfo[OM_USB_CBT_PORT_HANDLE].ulUSBWriteNum2++; ulOutSlice = OM_GetSlice(); if(ulInSlice > ulOutSlice) { ulWriteSlice = ulInSlice - ulOutSlice; } else { ulWriteSlice = ulOutSlice - ulInSlice; } if(ulWriteSlice > g_stAcpuDebugInfo.astPortInfo[OM_USB_CBT_PORT_HANDLE].ulUSBWriteMaxTime) { g_stAcpuDebugInfo.astPortInfo[OM_USB_CBT_PORT_HANDLE].ulUSBWriteMaxTime = ulWriteSlice; } if (BSP_OK == lRet) /*当前发送成功*/ { if (VOS_OK != VOS_SmP(g_ulCbtUsbPseudoSyncSemId, 0)) { LogPrint1("\r\n CBTPPM_OamUsbCbtSendData: DRV_UDI_IOCTL Send Data return Error %d\n", lRet); return VOS_ERR; } return VOS_OK; } else if (BSP_OK > lRet) /*临时错误*/ { /*打印信息,调用UDI接口的错误信息*/ LogPrint1("\r\n CBTPPM_OamUsbCbtSendData: DRV_UDI_IOCTL Send Data return Error %d\n", lRet); g_stAcpuDebugInfo.astPortInfo[OM_USB_CBT_PORT_HANDLE].ulUSBWriteErrNum++; g_stAcpuDebugInfo.astPortInfo[OM_USB_CBT_PORT_HANDLE].ulUSBWriteErrLen += ulDataLen; g_stAcpuDebugInfo.astPortInfo[OM_USB_CBT_PORT_HANDLE].ulUSBWriteErrValue = (VOS_UINT32)lRet; g_stAcpuDebugInfo.astPortInfo[OM_USB_CBT_PORT_HANDLE].ulUSBWriteErrTime = OM_GetSlice(); return VOS_ERR; /*对于临时错误,需要返回NULL丢弃数据*/ } else /*其他错误需要复位单板*/ { /*打印信息,调用UDI接口*/ LogPrint1("\r\n CBTPPM_OamUsbCbtSendData: DRV_UDI_IOCTL Send Data return Error %d\n", lRet); DRV_SYSTEM_ERROR(OAM_USB_SEND_ERROR, (VOS_INT)THIS_FILE_ID, (VOS_INT)__LINE__, (VOS_CHAR *)&lRet, sizeof(VOS_INT32)); return VOS_ERR; } }