VOS_VOID DMS_UsbPortReadCB(DMS_PHY_BEAR_ENUM enPhyBear) { DMS_PHY_BEAR_PROPERTY_STRU *pstPhyBearProp = NULL; DMS_READ_DATA_PFN pRdDataFun = NULL; ACM_WR_ASYNC_INFO stAcmInfo; UDI_HANDLE lHandle = UDI_INVALID_HANDLE; DMS_LOG_INFO("DMS_UsbPortReadCB[%d]: Read begin.\n", enPhyBear); VOS_MemSet(&stAcmInfo, 0x0, sizeof(stAcmInfo)); pstPhyBearProp = DMS_GetPhyBearProperty(enPhyBear); lHandle = pstPhyBearProp->lPortHandle; if (UDI_INVALID_HANDLE == lHandle) { DMS_LOG_ERROR("DMS_UsbPortReadCB[%d]: UDI_INVALID_HANDLE.\n", enPhyBear); return; } DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_RD_CB_BEGIN + (VOS_UINT32)enPhyBear),\ 0, 0, 0); if (BSP_OK != DRV_UDI_IOCTL(lHandle, ACM_IOCTL_GET_RD_BUFF, &stAcmInfo)) { DMS_LOG_ERROR("DMS_UsbPortReadCB[%d]: ACM_IOCTL_GET_RD_BUFF fail.\n", enPhyBear); DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_RD_CB_ERR_BEGIN + (VOS_UINT32)enPhyBear),\ (VOS_UINT32)lHandle, 0, 0); return; } pstPhyBearProp->ucChanStat = ACM_EVT_DEV_READY; pRdDataFun = DMS_GetDataReadFun(); if (NULL != pRdDataFun) { #ifdef FEATURE_USB_ZERO_COPY (VOS_VOID)pRdDataFun(enPhyBear, (VOS_UINT8 *)stAcmInfo.pVirAddr, stAcmInfo.u32Size); #else (VOS_VOID)pRdDataFun(enPhyBear, (VOS_UINT8 *)stAcmInfo.pBuffer, stAcmInfo.u32Size); #endif } if (BSP_OK != DRV_UDI_IOCTL(lHandle, ACM_IOCTL_RETURN_BUFF, &stAcmInfo)) { DMS_LOG_INFO("DMS_UsbPortReadCB[%d]: ACM_IOCTL_RETURN_BUFF fail.\n", enPhyBear); } return; }
VOS_INT32 PPM_ReadPortData(CPM_PHY_PORT_ENUM_UINT32 enPhyPort, UDI_HANDLE UdiHandle, OM_PROT_HANDLE_ENUM_UINT32 enHandle) { ACM_WR_ASYNC_INFO stInfo; if (VOS_ERROR == UdiHandle) { LogPrint("\r\n PPM_PortCloseProc: Input HANDLE is err. \n"); g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBUdiHandleErr++; return VOS_ERR; } VOS_MemSet(&stInfo, 0, sizeof(stInfo)); /* 获取USB的IO CTRL口的读缓存 */ if (VOS_OK != DRV_UDI_IOCTL(UdiHandle, UDI_ACM_IOCTL_GET_READ_BUFFER_CB, &stInfo)) { LogPrint("\r\n PPM_ReadPortData:Call DRV_UDI_IOCTL is Failed\n"); g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBUdiHandleReadGetBufferErr++; return VOS_ERR; } /*lint -e40*/ OM_ACPU_DEBUG_CHANNEL_TRACE(enPhyPort, (VOS_UINT8*)stInfo.pVirAddr, stInfo.u32Size, OM_ACPU_USB_CB); /*lint +e40*/ if(VOS_OK != CPM_ComRcv(enPhyPort, (VOS_UINT8*)stInfo.pVirAddr, stInfo.u32Size)) { LogPrint1("\r\n Info: PPM_ReadPortData:Call CPM_ComRcv is NULL, PhyPort is %d\n", (VOS_INT)enPhyPort); g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBUdiCommRcvNullPtrErr++; } g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBRcvPktNum++; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBRcvPktByte += stInfo.u32Size; if(VOS_OK != DRV_UDI_IOCTL(UdiHandle, UDI_ACM_IOCTL_RETUR_BUFFER_CB, &stInfo)) { LogPrint("\r\n PPM_ReadPortData:Call DRV_UDI_IOCTL UDI_ACM_IOCTL_RETUR_BUFFER_CB is Failed\n"); g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBUdiHandleReadBufferFreeErr++; } return VOS_OK; }
/***************************************************************************** 函 数 名 : GU_OamUSBReadData 功能描述 : 用于ACPU上面底软把数据通过ICC发送给OM模块 输入参数 : enPhyPort: 物理端口 UdiHandle:设备句柄 输出参数 : 无 返 回 值 : VOS_ERR/VOS_OK 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年2月2日 作 者 : zhuli 修改内容 : Creat Function *****************************************************************************/ VOS_INT32 GU_OamReadPortData(CPM_PHY_PORT_ENUM_UINT32 enPhyPort, UDI_HANDLE UdiHandle) { ACM_WR_ASYNC_INFO stInfo; CPM_PHY_PORT_ENUM_UINT32 enPcvoiceRet; CPM_PHY_PORT_ENUM_UINT32 enDiagRet; if (VOS_ERROR == UdiHandle) { LogPrint("\r\nGU_OamReadPortData: Input HANDLE is err. \n"); return VOS_ERR; } VOS_MemSet(&stInfo, 0, sizeof(stInfo)); /* 获取USB的IO CTRL口的读缓存 */ if (VOS_OK != DRV_UDI_IOCTL(UdiHandle, UDI_ACM_IOCTL_GET_READ_BUFFER_CB, &stInfo)) { LogPrint("\r\nGU_OamReadPortData:Call DRV_UDI_IOCTL is Failed\n"); return VOS_ERR; } /*lint -e40*/ OM_ACPU_DEBUG_TRACE((VOS_UINT8*)stInfo.pBuffer, stInfo.u32Size, OM_ACPU_USB_CB); /*lint +e40*/ /*判断当前是否承载的是Pcvoice*/ enPcvoiceRet = CPM_QueryPhyPort(CPM_PCVOICE_COMM); enDiagRet = CPM_QueryPhyPort(CPM_DIAG_COMM); if ((enPhyPort != enPcvoiceRet)&&(enPhyPort != enDiagRet)) { CPM_PnpAppPortCB(enPhyPort, VOS_TRUE); /*需要重新链接物理和逻辑端口关系*/ } if(VOS_OK != CPM_ComRcv(enPhyPort, (VOS_UINT8*)stInfo.pBuffer, stInfo.u32Size)) { LogPrint1("\r\n Info: GU_OamReadPortData:Call CPM_ComRcv is NULL, PhyPort is %d\n", (VOS_INT)enPhyPort); } if(VOS_OK != DRV_UDI_IOCTL(UdiHandle, UDI_ACM_IOCTL_RETUR_BUFFER_CB, &stInfo)) { LogPrint("\r\nGU_OamReadPortData:Call DRV_UDI_IOCTL UDI_ACM_IOCTL_RETUR_BUFFER_CB is Failed\n"); } return VOS_OK; }
VOS_INT32 CBTPPM_OamUsbCbtReadDataCB(VOS_VOID) { ACM_WR_ASYNC_INFO stInfo; CBTCPM_RCV_FUNC pFunc; if (VOS_ERROR == g_ulCbtPortUDIHandle) { LogPrint("\r\n CBTPPM_OamUsbCbtReadDataCB: Input HANDLE is err. \n"); return VOS_ERR; } VOS_MemSet(&stInfo, 0, sizeof(stInfo)); /* 获取USB的IO CTRL口的读缓存 */ if (VOS_OK != DRV_UDI_IOCTL(g_ulCbtPortUDIHandle, UDI_ACM_IOCTL_GET_READ_BUFFER_CB, &stInfo)) { LogPrint("\r\n CBTPPM_OamUsbCbtReadDataCB:Call DRV_UDI_IOCTL is Failed\n"); return VOS_ERR; } /*lint -e40*/ OM_ACPU_DEBUG_TRACE((VOS_UINT8*)stInfo.pVirAddr, stInfo.u32Size, OM_ACPU_USB_CB); /*lint +e40*/ /* 数据接收函数 */ pFunc = CBTCPM_GetRcvFunc(); if (VOS_NULL_PTR != pFunc) { if (VOS_OK != pFunc((VOS_UINT8 *)stInfo.pVirAddr, stInfo.u32Size)) { /* 增加可维可测计数 */ } } if(VOS_OK != DRV_UDI_IOCTL(g_ulCbtPortUDIHandle, UDI_ACM_IOCTL_RETUR_BUFFER_CB, &stInfo)) { LogPrint("\r\n CBTPPM_OamUsbCbtReadDataCB:Call DRV_UDI_IOCTL UDI_ACM_IOCTL_RETUR_BUFFER_CB is Failed\n"); return VOS_ERR; } return VOS_OK; }
VOS_UINT32 PPM_UdiRegCallBackFun(UDI_HANDLE enHandle, VOS_UINT32 ulCmdType, VOS_VOID* pFunc) { if (VOS_NULL_PTR == pFunc) { return VOS_OK; } if (VOS_OK != DRV_UDI_IOCTL(enHandle, ulCmdType, pFunc)) { LogPrint("\r\n PPM_UdiRegCallBackFun, DRV_UDI_IOCTL Failed\r\n"); return VOS_ERR; } return VOS_OK; }
/***************************************************************************** 函 数 名 : GU_OamReadPortDataInit 功能描述 : 用于初始化OM使用的设备 输入参数 : enPhyPort: 物理端口号 enHandle: 端口的句柄 pReadCB: 该端口上面的读取回调函数 pWriteCB: 该端口上面的异步写回调函数 pStateCB: 该端口上面的状态回调函数 输出参数 : pUdiHandle: 端口的句柄 返 回 值 : VOS_OK/VOS_ERR 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年2月2日 作 者 : zhuli 修改内容 : Creat Function *****************************************************************************/ VOS_VOID GU_OamReadPortDataInit(CPM_PHY_PORT_ENUM_UINT32 enPhyPort, OM_PROT_HANDLE_ENUM_UINT32 enHandle, VOS_VOID *pReadCB, VOS_VOID *pWriteCB, VOS_VOID *pStateCB) { UDI_OPEN_PARAM stUdiPara; ACM_READ_BUFF_INFO stReadBuffInfo; /*初始化当前使用的USB通道*/ if(CPM_APP_PORT == enPhyPort) { stUdiPara.devid = UDI_ACM_OM_ID; } else if(CPM_CTRL_PORT == enPhyPort) { stUdiPara.devid = UDI_ACM_CTRL_ID; } else if(CPM_HSIC_PORT == enPhyPort) { stUdiPara.devid = UDI_ACM_HSIC_ACM6_ID; } else { LogPrint1("\r\nGU_OamReadPortDataInit: Open Wrong Port %d!", (VOS_INT)enPhyPort); return; } stReadBuffInfo.u32BuffSize = OM_ICC_BUFFER_SIZE; stReadBuffInfo.u32BuffNum = OM_DRV_MAX_IO_COUNT; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenNum++; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenSlice = OM_GetSlice(); if (VOS_ERROR != g_astOMPortUDIHandle[enHandle]) { LogPrint("\r\nGU_OamReadPortDataInit: The UDI Handle is not Null !"); return; } /* 打开OM使用的USB通道 */ g_astOMPortUDIHandle[enHandle] = DRV_UDI_OPEN(&stUdiPara); if (VOS_ERROR == g_astOMPortUDIHandle[enHandle]) { LogPrint("\r\nGU_OamReadPortDataInit: Open UDI ACM failed!"); return; } g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenOkNum++; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenOkSlice = OM_GetSlice(); /* 配置OM使用的USB通道缓存 */ if (VOS_OK != DRV_UDI_IOCTL(g_astOMPortUDIHandle[enHandle], ACM_IOCTL_RELLOC_READ_BUFF, &stReadBuffInfo)) { LogPrint("\r\nGU_OamReadPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_RELLOC_READ_BUFF Failed\r\n"); return; } /* 获取USB的IO CTRL口的读缓存 */ if (VOS_OK != DRV_UDI_IOCTL(g_astOMPortUDIHandle[enHandle], ACM_IOCTL_SEND_BUFF_CAN_DMA, &stReadBuffInfo)) { LogPrint("\r\nGU_OamReadPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_SEND_BUFF_CAN_DMA Failed\r\n"); return; } /* 注册OM使用的USB读数据回调函数 */ if (VOS_OK != DRV_UDI_IOCTL(g_astOMPortUDIHandle[enHandle], UDI_ACM_IOCTL_SET_READ_CB, pReadCB)) { LogPrint("\r\nGU_OamReadPortDataInit, DRV_UDI_IOCTL UDI_ACM_IOCTL_SET_READ_CB Failed\r\n"); return; } if(VOS_OK != DRV_UDI_IOCTL(g_astOMPortUDIHandle[enHandle], ACM_IOCTL_SET_WRITE_CB, pWriteCB)) { LogPrint("\r\nGU_OamReadPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_SET_WRITE_CB Failed\r\n"); return; } if(VOS_OK != DRV_UDI_IOCTL(g_astOMPortUDIHandle[enHandle], ACM_IOCTL_SET_EVT_CB, pStateCB)) { LogPrint("\r\nGU_OamReadPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_SET_WRITE_CB Failed\r\n"); return; } /* 设置通道 0 copy */ if(VOS_OK != DRV_UDI_IOCTL(g_astOMPortUDIHandle[enHandle], ACM_IOCTL_WRITE_DO_COPY, VOS_NULL_PTR)) { LogPrint("\r\nGU_OamReadPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_WRITE_DO_COPY Failed\r\n"); return; } g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenOk2Num++; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenOk2Slice = OM_GetSlice(); return; }
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; } }
VOS_UINT32 DMS_UsbPortOpen( DMS_PHY_BEAR_ENUM enPhyBear, UDI_DEVICE_ID enDeviceId, VOS_VOID *pReadCB, VOS_VOID *pWriteCB, VOS_VOID *pStateCB ) { DMS_PHY_BEAR_PROPERTY_STRU *pstPhyBearProp = NULL; UDI_OPEN_PARAM stOpenParam; ACM_READ_BUFF_INFO stReadBuffInfo; UDI_HANDLE lHandle = UDI_INVALID_HANDLE; DMS_LOG_INFO("DMS_UsbPortOpen[%d]: Open Enter.\n", enPhyBear); pstPhyBearProp = DMS_GetPhyBearProperty(enPhyBear); if (UDI_INVALID_HANDLE != pstPhyBearProp->lPortHandle) { DMS_LOG_WARNING("DMS_UsbPortOpen[%d]: Already open.\n", enPhyBear); return ERR_MSP_SUCCESS; } DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_OPEN_BEGIN + (VOS_UINT32)enPhyBear),\ 0, 0, 0); stOpenParam.devid = enDeviceId; stReadBuffInfo.u32BuffSize = DMS_UL_DATA_BUFF_SIZE; stReadBuffInfo.u32BuffNum = DMS_UL_DATA_BUFF_NUM; lHandle = DRV_UDI_OPEN(&stOpenParam); if (UDI_INVALID_HANDLE != lHandle) { if (BSP_OK != DRV_UDI_IOCTL(lHandle, ACM_IOCTL_RELLOC_READ_BUFF, &stReadBuffInfo)) { DMS_LOG_ERROR("DMS_UsbPortOpen[%d]: ACM_IOCTL_RELLOC_READ_BUFF fail.\n", enPhyBear); DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_OPEN_ERR_BEGIN + (VOS_UINT32)enPhyBear),\ (VOS_UINT32)lHandle, 0, 0); } if (BSP_OK != DRV_UDI_IOCTL(lHandle, ACM_IOCTL_SEND_BUFF_CAN_DMA, &stReadBuffInfo)) { DMS_LOG_ERROR("DMS_UsbPortOpen[%d]: ACM_IOCTL_SEND_BUFF_CAN_DMA fail.\n", enPhyBear); DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_OPEN_ERR_BEGIN + (VOS_UINT32)enPhyBear),\ (VOS_UINT32)lHandle, 0, 1); } if (BSP_OK != DRV_UDI_IOCTL(lHandle, ACM_IOCTL_SET_READ_CB, pReadCB)) { DMS_LOG_ERROR("DMS_UsbPortOpen[%d]: ACM_IOCTL_SET_READ_CB fail.\n", enPhyBear); DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_OPEN_ERR_BEGIN + (VOS_UINT32)enPhyBear),\ (VOS_UINT32)lHandle, 0, 2); } if (BSP_OK != DRV_UDI_IOCTL(lHandle, ACM_IOCTL_SET_WRITE_CB, pWriteCB)) { DMS_LOG_ERROR("DMS_UsbPortOpen[%d]: ACM_IOCTL_SET_WRITE_CB fail.\n", enPhyBear); DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_OPEN_ERR_BEGIN + (VOS_UINT32)enPhyBear),\ (VOS_UINT32)lHandle, 0, 3); } if (BSP_OK != DRV_UDI_IOCTL(lHandle, ACM_IOCTL_WRITE_DO_COPY, (BSP_VOID *)0)) { DMS_LOG_ERROR("DMS_UsbPortOpen[%d]: ACM_IOCTL_WRITE_DO_COPY fail.\n", enPhyBear); DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_OPEN_ERR_BEGIN + (VOS_UINT32)enPhyBear),\ (VOS_UINT32)lHandle, 0, 4); } if (BSP_OK != DRV_UDI_IOCTL(lHandle, ACM_IOCTL_SET_EVT_CB, pStateCB)) { DMS_LOG_ERROR("DMS_UsbPortOpen[%d]: ACM_IOCTL_SET_EVT_CB fail.\n", enPhyBear); DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_OPEN_ERR_BEGIN + (VOS_UINT32)enPhyBear),\ (VOS_UINT32)lHandle, 0, 5); } DMS_LOG_INFO("DMS_UsbPortOpen[%d]: Open success.\n", enPhyBear); pstPhyBearProp->lPortHandle = lHandle; return ERR_MSP_SUCCESS; } DMS_LOG_INFO("DMS_UsbPortOpen[%d]: Open fail.\n", enPhyBear); DMS_DBG_SDM_FUN((DMS_SDM_MSG_ID_ENUM)(DMS_SDM_VCOM_OPEN_ERR_BEGIN + (VOS_UINT32)enPhyBear),\ (VOS_UINT32)lHandle, 0, 6); return ERR_MSP_FAILURE; }
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; } }
VOS_VOID CBTPPM_OamCbtPortDataInit(OM_PROT_HANDLE_ENUM_UINT32 enHandle, VOS_VOID *pReadCB, VOS_VOID *pWriteCB, VOS_VOID *pStateCB) { UDI_OPEN_PARAM stUdiPara; ACM_READ_BUFF_INFO stReadBuffInfo; stUdiPara.devid = UDI_ACM_OM_ID; stReadBuffInfo.u32BuffSize = OM_ICC_BUFFER_SIZE; stReadBuffInfo.u32BuffNum = OM_DRV_MAX_IO_COUNT; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenNum++; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenSlice = OM_GetSlice(); if (VOS_ERROR != g_ulCbtPortUDIHandle) { LogPrint("\r\n CBTPPM_OamCbtPortDataInit: The UDI Handle is not Null !"); return; } /* 打开CBT使用的USB通道 */ g_ulCbtPortUDIHandle = DRV_UDI_OPEN(&stUdiPara); if (VOS_ERROR == g_ulCbtPortUDIHandle) { LogPrint("\r\n CBTPPM_OamCbtPortDataInit: Open UDI ACM failed!"); return; } g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenOkNum++; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenOkSlice = OM_GetSlice(); /* 配置CBT使用的USB通道缓存 */ if (VOS_OK != DRV_UDI_IOCTL(g_ulCbtPortUDIHandle, ACM_IOCTL_RELLOC_READ_BUFF, &stReadBuffInfo)) { LogPrint("\r\n CBTPPM_OamCbtPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_RELLOC_READ_BUFF Failed\r\n"); return; } /* 获取USB的IO CTRL口的读缓存 */ if (VOS_OK != DRV_UDI_IOCTL(g_ulCbtPortUDIHandle, ACM_IOCTL_SEND_BUFF_CAN_DMA, &stReadBuffInfo)) { LogPrint("\r\n CBTPPM_OamCbtPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_SEND_BUFF_CAN_DMA Failed\r\n"); return; } /* 注册OM使用的USB读数据回调函数 */ if (VOS_OK != DRV_UDI_IOCTL(g_ulCbtPortUDIHandle, UDI_ACM_IOCTL_SET_READ_CB, pReadCB)) { LogPrint("\r\n CBTPPM_OamCbtPortDataInit, DRV_UDI_IOCTL UDI_ACM_IOCTL_SET_READ_CB Failed\r\n"); return; } if(VOS_OK != DRV_UDI_IOCTL(g_ulCbtPortUDIHandle, ACM_IOCTL_SET_WRITE_CB, pWriteCB)) { LogPrint("\r\n CBTPPM_OamCbtPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_SET_WRITE_CB Failed\r\n"); return; } if(VOS_OK != DRV_UDI_IOCTL(g_ulCbtPortUDIHandle, ACM_IOCTL_SET_EVT_CB, pStateCB)) { LogPrint("\r\n CBTPPM_OamCbtPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_SET_EVT_CB Failed\r\n"); return; } if (VOS_OK != DRV_UDI_IOCTL(g_ulCbtPortUDIHandle, ACM_IOCTL_WRITE_DO_COPY, VOS_NULL_PTR)) { LogPrint("\r\n CBTPPM_OamCbtPortDataInit, DRV_UDI_IOCTL ACM_IOCTL_WRITE_DO_COPY Failed\r\n"); return; } g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenOk2Num++; g_stAcpuDebugInfo.astPortInfo[enHandle].ulUSBOpenOk2Slice = OM_GetSlice(); return; }