/***************************************************************************** 函 数 名 : 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 ; }
/***************************************************************************** 函 数 名 : 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_VOID GU_OamDisconnectPorts(CPM_PHY_PORT_ENUM_UINT32 enPhyPort) { VOS_UINT8 aucBytes[] = {0x0a,0x00,0x08,0x00,0xb3,0x80,0x00,0x00,0x01,0x00,0x00,0x00}; /* 断开连接 */ CPM_DisconnectPorts(enPhyPort, CPM_OM_COMM); #if (FEATURE_ON == FEATURE_CBT_LOG) if (OM_CBT_LOG_ENABLE_FLAG == g_ulCBTLogEnable) { return; } #endif /* 关闭ACPU OM发送 */ g_ulAcpuOMSwitchOnOff = OM_STATE_IDLE; OM_SendAcpuSocpVote(SOCP_VOTE_FOR_SLEEP); (VOS_VOID)GU_OamSndPcMsgToCcpu(aucBytes, sizeof(aucBytes)); OM_NotifyOtherCpuReleaseLink(); }
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; }