/***************************************************************************** 函 数 名 : CPM_PortAssociateInit 功能描述 : 根据端口类型关联物理端口和逻辑端口 输入参数 : VOS_VOID 输出参数 : 无 返 回 值 : VOS_OK:成功,其他为失败 *****************************************************************************/ VOS_UINT32 CPM_PortAssociateInit(VOS_VOID) { VOS_UINT32 i; for (i = 0; i < CPM_COMM_BUTT; i++) { g_astCPMLogicPortCfg[i].enPhyPort = CPM_PORT_BUTT; } #if (VOS_OS_VER == VOS_WIN32) g_stPortCfg.enPortNum = CPM_OM_PORT_TYPE_WIFI; #else /* 产品支持HSIC特性,直接返回成功,不做端口关联 */ if (BSP_MODULE_SUPPORT == mdrv_misc_support_check(BSP_MODULE_TYPE_HSIC)) { return VOS_OK; } /* 读取OM的物理输出通道 */ if (NV_OK != NV_Read(en_NV_Item_Om_Port_Type, &g_stPortCfg, sizeof(OM_CHANNLE_PORT_CFG_STRU))) { return VOS_ERR; } #endif /* 检测参数*/ if (CPM_OM_PORT_TYPE_USB == g_stPortCfg.enPortNum) { CPM_ConnectPorts(CPM_CFG_PORT, CPM_OM_CFG_COMM); CPM_ConnectPorts(CPM_IND_PORT, CPM_OM_IND_COMM); } else if (CPM_OM_PORT_TYPE_VCOM == g_stPortCfg.enPortNum) { CPM_ConnectPorts(CPM_VCOM_CFG_PORT, CPM_OM_CFG_COMM); CPM_ConnectPorts(CPM_VCOM_IND_PORT, CPM_OM_IND_COMM); } else if (CPM_OM_PORT_TYPE_WIFI == g_stPortCfg.enPortNum) { CPM_ConnectPorts(CPM_WIFI_AT_PORT, CPM_AT_COMM); CPM_ConnectPorts(CPM_WIFI_OM_IND_PORT, CPM_OM_IND_COMM); CPM_ConnectPorts(CPM_WIFI_OM_CFG_PORT, CPM_OM_CFG_COMM); } /* NV项不正确时按USB输出处理 */ else { CPM_ConnectPorts(CPM_CFG_PORT, CPM_OM_CFG_COMM); CPM_ConnectPorts(CPM_IND_PORT, CPM_OM_IND_COMM); g_stPortCfg.enPortNum = CPM_OM_PORT_TYPE_USB; } /*如果当前连接为USB输出,需要设置SOCP默认超时*/ if(g_stPortCfg.enPortNum == CPM_OM_PORT_TYPE_USB) { mdrv_socp_set_log_int_default_timeout(); } return VOS_OK; }
/***************************************************************************** 函 数 名 : CPM_PortAssociateInit 功能描述 : 根据端口类型关联物理端口和逻辑端口 输入参数 : VOS_VOID 输出参数 : 无 返 回 值 : VOS_OK:成功,其他为失败 *****************************************************************************/ VOS_UINT32 CPM_PortAssociateInit(VOS_VOID) { VOS_UINT32 i; for (i = 0; i < CPM_COMM_BUTT; i++) { g_astCPMLogicPortCfg[i].enPhyPort = CPM_PORT_BUTT; } #if (VOS_OS_VER == VOS_WIN32) g_stPortCfg.enPortNum = CPM_OM_PORT_TYPE_WIFI; #else /* Modified by h59254 for AP-Modem Personalisation Project, 2012/04/12, begin */ /* 产品支持HSIC特性,直接返回成功,不做端口关联 */ if (BSP_MODULE_SUPPORT == mdrv_misc_support_check(BSP_MODULE_TYPE_HSIC)) { return VOS_OK; } /* Modified by h59254 for AP-Modem Personalisation Project, 2012/04/12, end */ /* 读取OM的物理输出通道 */ if (NV_OK != NV_Read(en_NV_Item_Om_Port_Type, &g_stPortCfg, sizeof(OM_CHANNLE_PORT_CFG_STRU))) { return VOS_ERR; } #endif /* 检测参数*/ if (CPM_OM_PORT_TYPE_USB == g_stPortCfg.enPortNum) { CPM_ConnectPorts(CPM_CFG_PORT, CPM_OM_CFG_COMM); CPM_ConnectPorts(CPM_IND_PORT, CPM_OM_IND_COMM); } else if (CPM_OM_PORT_TYPE_VCOM == g_stPortCfg.enPortNum) { CPM_ConnectPorts(CPM_VCOM_CFG_PORT, CPM_OM_CFG_COMM); CPM_ConnectPorts(CPM_VCOM_IND_PORT, CPM_OM_IND_COMM); } else if (CPM_OM_PORT_TYPE_WIFI == g_stPortCfg.enPortNum) { CPM_ConnectPorts(CPM_WIFI_AT_PORT, CPM_AT_COMM); CPM_ConnectPorts(CPM_WIFI_OM_IND_PORT, CPM_OM_IND_COMM); CPM_ConnectPorts(CPM_WIFI_OM_CFG_PORT, CPM_OM_CFG_COMM); } /* NV项不正确时按USB输出处理 */ else { CPM_ConnectPorts(CPM_CFG_PORT, CPM_OM_CFG_COMM); CPM_ConnectPorts(CPM_IND_PORT, CPM_OM_IND_COMM); g_stPortCfg.enPortNum = CPM_OM_PORT_TYPE_USB; } return VOS_OK; }
/***************************************************************************** 函 数 名 : CPM_PnpAppPortCB 功能描述 : 注册给DRV的插拔回调函数 输入参数 : bPortState: VOS_TRUE通道已连接、VOS_FALSE通道已断开 输出参数 : 无 返 回 值 : VOS_OK:成功,其他为失败 *****************************************************************************/ VOS_VOID CPM_PnpAppPortCB(CPM_PHY_PORT_ENUM_UINT32 enPhyPort, VOS_BOOL bPortState) { CPM_PHY_PORT_ENUM_UINT32 enCurPhyPort; /* USB通道已打开 */ if (VOS_TRUE == bPortState) { enCurPhyPort = CPM_LOGIC_PHY_PORT(CPM_OM_COMM); if ((CPM_APP_PORT != enCurPhyPort) && (CPM_CTRL_PORT != enCurPhyPort)) { CPM_DisconnectPorts(enCurPhyPort, CPM_OM_COMM); /* 连接APP口和OM通道 */ CPM_ConnectPorts(enPhyPort, CPM_OM_COMM); } return ; } /* USB通道已关闭,断开APP口与OM通道 */ CPM_DisconnectPorts(CPM_APP_PORT, CPM_OM_COMM); return ; }
VOS_UINT32 GU_OamLogPortSwitch(VOS_UINT32 ulPhyPort) { CPM_PHY_PORT_ENUM_UINT32 enPhyPort; if ((CPM_VCOM_PORT != ulPhyPort) && (CPM_APP_PORT != ulPhyPort)) { vos_printf("\r\n GU_OamPortSwitch: enPhyPort is error.port %d\n", ulPhyPort); return VOS_ERR; } enPhyPort = CPM_QueryPhyPort(CPM_OM_COMM); if (ulPhyPort != enPhyPort) { /* 断开连接 */ GU_OamDisconnectPorts(enPhyPort); g_stAcpuPcToUeSucRecord.stRlsInfo.ulRlsPortSwitch++; g_stAcpuPcToUeSucRecord.stRlsInfo.ulSlice = OM_GetSlice(); CPM_ConnectPorts(ulPhyPort, CPM_OM_COMM); } return VOS_OK; }
VOS_INT GU_OamVComReadData(VOS_UINT8 ucDevIndex, VOS_UINT8 *pData, VOS_UINT32 uslength) { if(ucDevIndex != APP_VCOM_DEV_INDEX_LOG) { vos_printf("\r\n GU_OamVComReadData:PhyPort port is error: %d\n", ucDevIndex); return VOS_ERR; } #if (VOS_LINUX == VOS_OS_VER) down(&g_stVCOMRxBuffSem); #endif g_stVComDebugInfo.ulVCOMRcvNum++; g_stVComDebugInfo.ulVCOMRcvLen += uslength; if ((VOS_NULL_PTR == pData) || (0 == uslength)) { #if (VOS_LINUX == VOS_OS_VER) up(&g_stVCOMRxBuffSem); #endif vos_printf("\r\n GU_OamVComReadData:Send data is NULL\n"); return VOS_ERR; } if (CPM_PORT_BUTT == CPM_QueryPhyPort(CPM_OM_COMM)) { CPM_ConnectPorts(CPM_VCOM_PORT, CPM_OM_COMM); } /*lint -e40*/ OM_ACPU_DEBUG_TRACE((VOS_UINT8*)pData, uslength, OM_ACPU_USB_CB); /*lint +e40*/ if(VOS_OK != CPM_ComRcv(CPM_VCOM_PORT, pData, uslength)) { g_stVComDebugInfo.ulVCOMRcvErrNum++; g_stVComDebugInfo.ulVCOMRcvErrLen += uslength; vos_printf("\r\n Info: GU_OamVComReadData:Call CPM_ComRcv is fail, PhyPort is CPM_VCOM_PORT \n"); } #if (VOS_LINUX == VOS_OS_VER) up(&g_stVCOMRxBuffSem); #endif return VOS_OK; }
/***************************************************************************** 函 数 名 : CPM_NotifyChangePort 功能描述 : 提供给ACPU AT模块调用,用来通知OM进行端口切换 输入参数 : enLogicPort:逻辑通道号 enPhyPort: 物理通道号 输出参数 : 无 返 回 值 : VOS_OK:成功,其他为失败 *****************************************************************************/ VOS_UINT32 CPM_NotifyChangePort(AT_PHY_PORT_ENUM_UINT32 enPhyPort, CPM_LOGIC_PORT_ENUM_UINT32 enLogicPort) { /* 参数检测 */ if ((enPhyPort >= CPM_PORT_BUTT) || (enLogicPort>= CPM_COMM_BUTT)) { return VOS_ERR; } /* 判断当前OM通道是否为WIFI */ if (CPM_WIFI_OM_PORT == CPM_LOGIC_PHY_PORT(enLogicPort)) { /* 关闭SOCKET连接 */ } /* 断开当前通道 */ CPM_DisconnectPorts(CPM_LOGIC_PHY_PORT(enLogicPort), enLogicPort); CPM_ConnectPorts(enPhyPort, enLogicPort); return VOS_OK; }
VOS_UINT32 PPM_LogPortSwitch(VOS_UINT32 ulPhyPort, VOS_BOOL ulEffect) { CPM_PHY_PORT_ENUM_UINT32 enPhyCfgPort; CPM_PHY_PORT_ENUM_UINT32 enPhyIndPort; VOS_ULONG ulLockLevel; VOS_BOOL ulSndMsg; if ((CPM_OM_PORT_TYPE_USB != ulPhyPort) && (CPM_OM_PORT_TYPE_VCOM != ulPhyPort)) { vos_printf("\r\n PPM_LogPortSwitch: enPhyPort is error.port %d\n", ulPhyPort); g_stPpmPortSwitchInfo.ulPortTypeErr++; return VOS_ERR; } /* 切换的端口与当前端口一致不切换 */ if (ulPhyPort == g_stPortCfg.enPortNum) { DRV_SOCP_VOTE(SOCP_VOTE_PPM_RCV, SOCP_VOTE_FOR_WAKE); /* 切换到VCOM输出时在LOG延迟写入开启情况下需要重新设置SOCP的超时中断 */ if (CPM_OM_PORT_TYPE_VCOM == g_stPortCfg.enPortNum) { (VOS_VOID)DRV_SOCP_SET_TIMEOUT(SOCP_TIMEOUT_TRF, 0); } /* 为了规避USB输出时开启了延时写入无法连接工具,切换到USB输出时需要重新设置SOCP的超时中断到默认值 */ if (CPM_OM_PORT_TYPE_USB == g_stPortCfg.enPortNum) { (VOS_VOID)DRV_SOCP_SET_TIMEOUT(SOCP_TIMEOUT_TRF, 0x17); } DRV_SOCP_VOTE(SOCP_VOTE_PPM_RCV, SOCP_VOTE_FOR_SLEEP); return VOS_OK; } g_stPpmPortSwitchInfo.ulStartSlice = OM_GetSlice(); enPhyCfgPort = CPM_QueryPhyPort(CPM_OM_CFG_COMM); enPhyIndPort = CPM_QueryPhyPort(CPM_OM_IND_COMM); ulSndMsg = VOS_FALSE; VOS_SpinLockIntLock(&g_stPpmPortSwitchSpinLock, ulLockLevel); /* 切换到VCOM输出 */ if (CPM_OM_PORT_TYPE_VCOM == ulPhyPort) { /* 当前是USB输出 */ if ((CPM_CFG_PORT == enPhyCfgPort) && (CPM_IND_PORT == enPhyIndPort)) { /* 需要断开连接 */ ulSndMsg = VOS_TRUE; CPM_DisconnectPorts(CPM_CFG_PORT, CPM_OM_CFG_COMM); CPM_DisconnectPorts(CPM_IND_PORT, CPM_OM_IND_COMM); } /* 当前OM走VCOM上报 */ CPM_ConnectPorts(CPM_VCOM_CFG_PORT, CPM_OM_CFG_COMM); CPM_ConnectPorts(CPM_VCOM_IND_PORT, CPM_OM_IND_COMM); g_stPortCfg.enPortNum = CPM_OM_PORT_TYPE_VCOM; } /* 切换到USB输出 */ else { /* 当前是VCOM输出 */ if ((CPM_VCOM_CFG_PORT == enPhyCfgPort) && (CPM_VCOM_IND_PORT == enPhyIndPort)) { /* 断开连接 */ ulSndMsg = VOS_TRUE; CPM_DisconnectPorts(CPM_VCOM_CFG_PORT, CPM_OM_CFG_COMM); CPM_DisconnectPorts(CPM_VCOM_IND_PORT, CPM_OM_IND_COMM); } /* OM走USB上报 */ CPM_ConnectPorts(CPM_CFG_PORT, CPM_OM_CFG_COMM); CPM_ConnectPorts(CPM_IND_PORT, CPM_OM_IND_COMM); g_stPortCfg.enPortNum = CPM_OM_PORT_TYPE_USB; } VOS_SpinUnlockIntUnlock(&g_stPpmPortSwitchSpinLock, ulLockLevel); if (VOS_TRUE == ulSndMsg) { PPM_DisconnectAllPort(OM_LOGIC_CHANNEL_CNF); } DRV_SOCP_VOTE(SOCP_VOTE_PPM_RCV, SOCP_VOTE_FOR_WAKE); /* 切换到VCOM输出时在LOG延迟写入开启情况下需要重新设置SOCP的超时中断 */ if (CPM_OM_PORT_TYPE_VCOM == g_stPortCfg.enPortNum) { (VOS_VOID)DRV_SOCP_SET_TIMEOUT(SOCP_TIMEOUT_TRF, 0); } /* 为了规避USB输出时开启了延时写入无法连接工具,切换到USB输出时需要重新设置SOCP的超时中断到默认值 */ if (CPM_OM_PORT_TYPE_USB == g_stPortCfg.enPortNum) { (VOS_VOID)DRV_SOCP_SET_TIMEOUT(SOCP_TIMEOUT_TRF, 0x17); } DRV_SOCP_VOTE(SOCP_VOTE_PPM_RCV, SOCP_VOTE_FOR_SLEEP); g_stPpmPortSwitchInfo.ulSwitchSucc++; g_stPpmPortSwitchInfo.ulEndSlice = OM_GetSlice(); if (VOS_TRUE == ulEffect) { if (VOS_OK != NV_Write(en_NV_Item_Om_Port_Type, &g_stPortCfg, sizeof(OM_CHANNLE_PORT_CFG_STRU))) { vos_printf("\r\n PPM_LogPortSwitch: NV_Write fail\n"); } } return VOS_OK; }