📄 dpx_api.c
字号:
sysDuplexRawRead(pBaseAddr + DPX_REG_RXD1_HSS_CFG, u1TestValue );
if((u1TestValue&0xDF) != (DPX_REGISTER_TEST_VALUE&0xDF))
{
#if DPX_DEBUG_MSG_ON
printf("dpxRegisterTest: DPX_REG_RXD1_HSS_CFG, 0x%x\n", u1TestValue);
#endif
return DPX_ERR_FAILURE;
}
sysDuplexRawRead(pBaseAddr + DPX_REG_RXD2_HSS_CFG, u1TestValue);
if((u1TestValue&0xDF) != (DPX_REGISTER_TEST_VALUE&0xDF))
{
#if DPX_DEBUG_MSG_ON
printf("dpxRegisterTest: DPX_REG_RXD2_HSS_CFG, 0x%x\n", u1TestValue);
#endif
return DPX_ERR_FAILURE;
}
sysDuplexRawRead(pBaseAddr + DPX_REG_RXD1_HSS_INT_EN, u1TestValue);
if((u1TestValue&0x7F) != (DPX_REGISTER_TEST_VALUE&0x7F))
{
#if DPX_DEBUG_MSG_ON
printf("dpxRegisterTest: DPX_REG_RXD1_HSS_INT_EN, 0x%x\n", u1TestValue);
#endif
return DPX_ERR_FAILURE;
}
sysDuplexRawRead(pBaseAddr + DPX_REG_RXD2_HSS_INT_EN, u1TestValue);
if((u1TestValue&0x7F) != (DPX_REGISTER_TEST_VALUE&0x7F))
{
#if DPX_DEBUG_MSG_ON
printf("dpxRegisterTest: DPX_REG_RXD2_HSS_INT_EN, 0x%x\n", u1TestValue);
#endif
return DPX_ERR_FAILURE;
}
sysDuplexRawRead(pBaseAddr + DPX_REG_TX_LC_FIFO_CTL, u1TestValue);
if((u1TestValue&0x03) != (DPX_REGISTER_TEST_VALUE&0x03))
{
#if DPX_DEBUG_MSG_ON
printf("dpxRegisterTest: DPX_REG_TX_LC_FIFO_CTL, 0x%x\n", u1TestValue);
#endif
return DPX_ERR_FAILURE;
}
sysDuplexRawRead(pBaseAddr + DPX_REG_TX_LC_FIFO_DEPTH, u1TestValue);
if((u1TestValue&0x3F) != (DPX_REGISTER_TEST_VALUE&0x3F))
{
#if DPX_DEBUG_MSG_ON
printf("dpxRegisterTest: DPX_REG_TX_LC_FIFO_DEPTH, 0x%x\n", u1TestValue);
#endif
return DPX_ERR_FAILURE;
}
sysDuplexRawRead(pBaseAddr + DPX_REG_TX_LC_FIFO_READY, u1TestValue);
if((u1TestValue&0x3F) != (DPX_REGISTER_TEST_VALUE&0x3F))
{
#if DPX_DEBUG_MSG_ON
printf("dpxRegisterTest: DPX_REG_TX_LC_FIFO_READY, 0x%x\n", u1TestValue);
#endif
return DPX_ERR_FAILURE;
}
sysDuplexRawRead(pBaseAddr + DPX_REG_TX_HSS_CFG, u1TestValue);
if((u1TestValue&0xDF) != (DPX_REGISTER_TEST_VALUE&0xDF))
{
#if DPX_DEBUG_MSG_ON
printf("dpxRegisterTest: DPX_REG_TX_HSS_CFG, 0x%x\n", u1TestValue);
#endif
return DPX_ERR_FAILURE;
}
/* set the Device state to DPX_PRESENT by duplexReset */
duplexReset(duplex);
psDpxDdb->eDevState = DPX_PRESENT;
}
return (ErrorCode);
}
/*******************************************************************************
**
** duplexLoopback
** ___________________________________________________________________________
**
** DESCRIPTION: Enable/disable a diagnostic or line loopback of
** the specified high-speed serial link.
**
** VALID STATES: DPX_ACTIVE or DPX_INIT or DPX_PRESENT
**
** SIDE EFFECTS: None
**
** INPUTS: duplex - device handler
** u1HssLnkId - serial link identifier: DPX_RXD1 or DPX_RXD2
** u1LpbType - type of loop back; can be one of -
** DPX_DIAG_LPBK
** DPX_LINE_LPBK
** u1Enable - loopback operation requested; can be one of -
** DPX_LPBK_SET
** DPX_LPBK_RESET
**
** OUTPUTS: None
**
** RETURN CODES:
** DPX_SUCCESS
** DPX_ERR_INVALID_DEVICE (invalid device handle)
** DPX_ERR_INVALID_LPBK_TYPE
** DPX_ERR_INVALID_LNK_ID
** DPX_ERR_INVALID_FLAG (invalid loopback flag)
**
*******************************************************************************/
INT4 duplexLoopback(DUPLEX duplex, UINT1 u1HssLnkId, UINT1 u1LpbkType,
UINT1 u1Enable)
{
UINT1 u1DdbIdx;
INT4 ErrorCode;
sDPX_DDB *psDpxDdb;
UINT1 u1Mask = 0;
/* validate the passing parameters */
if(u1HssLnkId == DPX_RXD1)
{
if(u1LpbkType == DPX_DIAG_LPBK)
{
u1Mask = DPX_MASK_SER_LNK_MNT_DLB1;
}
else if (u1LpbkType == DPX_LINE_LPBK)
{
u1Mask = DPX_MASK_SER_LNK_MNT_MLB1;
}
else
return(DPX_ERR_INVALID_LPBK_TYPE);
}
else if (u1HssLnkId == DPX_RXD2)
{
if(u1LpbkType == DPX_DIAG_LPBK)
{
u1Mask = DPX_MASK_SER_LNK_MNT_DLB2;
}
else if (u1LpbkType == DPX_LINE_LPBK)
{
u1Mask = DPX_MASK_SER_LNK_MNT_MLB2;
}
else
return(DPX_ERR_INVALID_LPBK_TYPE);
}
else
return(DPX_ERR_INVALID_LNK_ID);
psDpxDdb = (sDPX_DDB *)duplex;
/* validating the device handler */
ErrorCode = duplexFindDev(psDpxDdb, (UINT1*)&u1DdbIdx);
if(ErrorCode == DPX_SUCCESS)
{
if(u1Enable == DPX_LPBK_RESET)
{
duplexClearRegBits(psDpxDdb->u4BaseAddr, DPX_REG_SER_LNK_MNT,
u1Mask);
}
else if(u1Enable == DPX_LPBK_SET)
{
duplexSetRegBits(psDpxDdb->u4BaseAddr, DPX_REG_SER_LNK_MNT, u1Mask);
}
else
return(DPX_ERR_INVALID_FLAG);
}
return(ErrorCode);
}
/*******************************************************************************
**
** duplexRemoteReset
** ___________________________________________________________________________
**
** DESCRIPTION: used to reset other devices by driving the RSTOB output pin of
** DUPLEX device low and then back to high impedance state.
**
** VALID STATES: All states except DPX_EMPTY
**
** SIDE EFFECTS: None
**
** INPUTS: duplex - pointer to DDB, or device handler
**
** OUTPUTS: None
**
** RETURN CODES:
** DPX_SUCCESS
** DPX_ERR_INVALID_DEVICE (invalid device handle)
**
*******************************************************************************/
INT4 duplexRemoteReset(DUPLEX duplex)
{
UINT1 u1DdbIdx;
INT4 ErrorCode;
sDPX_DDB *psDpxDdb;
UINT u1Value = 0;
psDpxDdb = (sDPX_DDB *)duplex;
/* validating the device handler */
ErrorCode = duplexFindDev(psDpxDdb, (UINT1*)&u1DdbIdx);
if(ErrorCode == DPX_SUCCESS)
{
/* toggle the RESETO bit of Master Config register */
/* peek */
sysDuplexRawRead((INT1 *)(psDpxDdb->u4BaseAddr+DPX_REG_MASTER_CFG),
u1Value);
/* set the RESETO bit */
u1Value |= (DPX_MASK_MASTER_CFG_RESETO);
sysDuplexRawWrite((INT1 *)(psDpxDdb->u4BaseAddr+DPX_REG_MASTER_CFG),
u1Value);
/* clear the RESETO bit */
u1Value &= (~DPX_MASK_MASTER_CFG_RESETO);
sysDuplexRawWrite((INT1 *)(psDpxDdb->u4BaseAddr+DPX_REG_MASTER_CFG),
u1Value);
}
return(ErrorCode);
}
/*******************************************************************************
**
** duplexHssActiveLnkGetCfg
** ___________________________________________________________________________
**
** DESCRIPTION: used to obtain information about the active link selection
** method configured in the Master Configuration register.
**
** VALID STATES: DPX_INIT, DPX_ACTIVE
**
** SIDE EFFECTS: None
**
** INPUTS: duplex - pointer to DDB, or device handler
**
** OUTPUTS: peLnkSel - specifies the HSS link selection; can be one of
** DPX_RX_HSS_LNK_SELECT_AUTO
** DPX_RX_HSS_LNK_SELECT_RXD1
** DPX_RX_HSS_LNK_SELECT_RXD2
**
** RETURN CODES:
** DPX_SUCCESS
** DPX_ERR_INVALID_DEVICE (invalid device handle)
** DPX_ERR_INVALID_STATE (invalid state)
**
*******************************************************************************/
INT4 duplexHssActiveLnkGetCfg(DUPLEX duplex, eHSS_LNK_SEL *peLnkSel)
{
UINT1 u1DdbIdx;
INT4 ErrorCode;
sDPX_DDB *psDpxDdb;
UINT u1Value = 0;
eHSS_LNK_SEL eLnkSel;
psDpxDdb = (sDPX_DDB *)duplex;
/* validating the device handler */
ErrorCode = duplexFindDev(psDpxDdb, (UINT1*)&u1DdbIdx);
if(ErrorCode == DPX_SUCCESS)
{
if((psDpxDdb->eDevState == DPX_INIT) ||
( psDpxDdb->eDevState == DPX_ACTIVE))
{
sysDuplexRawRead((INT1 *)(psDpxDdb->u4BaseAddr+DPX_REG_MASTER_CFG),
u1Value);
if(u1Value & DPX_MASK_MASTER_CFG_RXAUTOSEL)
eLnkSel = DPX_RX_HSS_LNK_SELECT_AUTO;
else
{
if(u1Value & DPX_MASK_MASTER_CFG_ACTIVE)
eLnkSel = DPX_RX_HSS_LNK_SELECT_RXD2;
else
eLnkSel = DPX_RX_HSS_LNK_SELECT_RXD1;
}
*peLnkSel = eLnkSel;
}
else
return(DPX_ERR_INVALID_STATE);
}
return(ErrorCode);
}
/*******************************************************************************
**
** duplexHssActiveLnkSetCfg
** ___________________________________________________________________________
**
** DESCRIPTION: used to select the active link selection of the DUPLEX device.
** The selection can be automatically by the device or specified
** explicitly by the microprocessor.
**
** VALID STATES: DPX_INIT, DPX_ACTIVE
**
** SIDE EFFECTS: None
**
** INPUTS: duplex - pointer to DDB, or device handler
**
** OUTPUTS: eLnkSel - specifies the HSS link selection; can be one of
** DPX_RX_HSS_LNK_SELECT_AUTO
** DPX_RX_HSS_LNK_SELECT_RXD1
** DPX_RX_HSS_LNK_SELECT_RXD2
**
** RETURN CODES:
** DPX_SUCCESS
** DPX_ERR_INVALID_DEVICE (invalid device handle)
** DPX_ERR_INVALID_STATE (invalid state)
**
*******************************************************************************/
INT4 duplexHssActiveLnkSetCfg(DUPLEX duplex, eHSS_LNK_SEL eLnkSel)
{
UINT1 u1DdbIdx;
INT4 ErrorCode;
sDPX_DDB *psDpxDdb;
UINT u1Value = 0;
psDpxDdb = (sDPX_DDB *)duplex;
/* validating the device handler */
ErrorCode = duplexFindDev(psDpxDdb, (UINT1*)&u1DdbIdx);
if(ErrorCode == DPX_SUCCESS)
{
if((psDpxDdb->eDevState == DPX_INIT) ||
( psDpxDdb->eDevState == DPX_ACTIVE))
{
/* peek */
sysDuplexRawRead((INT1 *)(psDpxDdb->u4BaseAddr+DPX_REG_MASTER_CFG),
u1Value);
i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -