From 47fe2ff165e72fa11b1bc92761fd53ba21a6cdd2 Mon Sep 17 00:00:00 2001 From: Shadul Shaikh Date: Wed, 14 Oct 2015 17:20:53 +0530 Subject: [PATCH] dptxss: Integrated HDCP, Timer in DisplayPort Transmitter Subsystem This patch integrates HDCP, Timer in DisplayPort TX Subsystem. Signed-off-by: Shadul Shaikh Acked-by: Andrei Simion --- .../drivers/dptxss/data/dptxss.mdd | 2 +- .../drivers/dptxss/data/dptxss.tcl | 2 + .../drivers/dptxss/src/dp/xdptxss_dptx.c | 18 +- .../dptxss/src/hdcp1x/xdptxss_hdcp1x.h | 4 + .../drivers/dptxss/src/xdptxss.c | 736 +++++++++++++++++- .../drivers/dptxss/src/xdptxss.h | 56 +- .../drivers/dptxss/src/xdptxss_dbg.c | 36 +- .../drivers/dptxss/src/xdptxss_g.c | 9 + .../drivers/dptxss/src/xdptxss_hw.h | 2 +- .../drivers/dptxss/src/xdptxss_intr.c | 61 +- .../drivers/dptxss/src/xdptxss_selftest.c | 20 +- .../drivers/dptxss/src/xdptxss_sinit.c | 2 +- 12 files changed, 919 insertions(+), 29 deletions(-) diff --git a/XilinxProcessorIPLib/drivers/dptxss/data/dptxss.mdd b/XilinxProcessorIPLib/drivers/dptxss/data/dptxss.mdd index face2905..66b49e2f 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/data/dptxss.mdd +++ b/XilinxProcessorIPLib/drivers/dptxss/data/dptxss.mdd @@ -36,6 +36,6 @@ BEGIN driver dptxss OPTION driver_state = ACTIVE; OPTION depends = (dual_splitter_v1_0); OPTION copyfiles = all; - OPTION VERSION = 1.0; + OPTION VERSION = 2.0; OPTION NAME = dptxss; END driver diff --git a/XilinxProcessorIPLib/drivers/dptxss/data/dptxss.tcl b/XilinxProcessorIPLib/drivers/dptxss/data/dptxss.tcl index 612511b3..e9f4123e 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/data/dptxss.tcl +++ b/XilinxProcessorIPLib/drivers/dptxss/data/dptxss.tcl @@ -32,6 +32,7 @@ # Ver Who Date Changes # ---- --- -------- ----------------------------------------------------------- # 1.00 sha 08/07/15 Added HDCP support to work with DP pass-through. +# 2.00 sha 09/28/15 Added Timer Counter support to work with DP pass-through. ############################################################################### proc generate {drv_handle} { @@ -54,6 +55,7 @@ proc hier_ip_define_config_file {drv_handle file_name drv_string args} { set sub_core_params(v_tc) "BASEADDR" set sub_core_params(v_dual_splitter) "BASEADDR ACTIVE_COLS ACTIVE_ROWS MAX_SEGMENTS AXIS_VIDEO_MAX_TDATA_WIDTH AXIS_VIDEO_MAX_ITDATASMPLS_PER_CLK AXIS_VIDEO_MAX_OTDATASMPLS_PER_CLK MAX_OVRLAP MAX_SMPL_WIDTH HAS_AXI4_LITE HAS_IRQ" set sub_core_params(hdcp) "BASEADDR S_AXI_FREQUENCY IS_RX IS_HDMI" + set sub_core_params(axi_timer) "BASEADDR CLOCK_FREQ_HZ" set filename [file join "src" $file_name] set config_file [open $filename w] diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/dp/xdptxss_dptx.c b/XilinxProcessorIPLib/drivers/dptxss/src/dp/xdptxss_dptx.c index 338a3e0f..6db1f6fa 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/dp/xdptxss_dptx.c +++ b/XilinxProcessorIPLib/drivers/dptxss/src/dp/xdptxss_dptx.c @@ -47,6 +47,7 @@ * names with prefix XDpTxSs_*. * 1.00 sha 08/07/15 Added support for customized main stream attributes for * Single Steam Transport and Multi-Stream Transport. +* 2.00 sha 09/28/15 Removed cross checking user set resolution with RX EDID. * * ******************************************************************************/ @@ -120,8 +121,9 @@ u32 XDpTxSs_DpTxStart(XDp *InstancePtr, u8 TransportMode, u8 Bpc, Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid((TransportMode == XDPTXSS_DPTX_MST) || (TransportMode == XDPTXSS_DPTX_SST)); - Xil_AssertNonvoid((Bpc == XVIDC_BPC_8) || (Bpc == XVIDC_BPC_10) || - (Bpc == XVIDC_BPC_12) || (Bpc == XVIDC_BPC_16)); + Xil_AssertNonvoid((Bpc == XVIDC_BPC_6) || (Bpc == XVIDC_BPC_8) || + (Bpc == XVIDC_BPC_10) || (Bpc == XVIDC_BPC_12) || + (Bpc == XVIDC_BPC_16)); Xil_AssertNonvoid((VidMode < XVIDC_VM_NUM_SUPPORTED) || (VidMode == XVIDC_VM_USE_EDID_PREFERRED) || (VidMode == XVIDC_VM_CUSTOM)); @@ -527,18 +529,6 @@ u32 XDpTxSs_DpTxStart(XDp *InstancePtr, u8 TransportMode, u8 Bpc, else if (VidMode != XVIDC_VM_CUSTOM) { xdbg_printf(XDBG_DEBUG_GENERAL,"SS INFO:SST:Using " "user set resolution.\n\r"); - - /* Check whether VidMode ID is supported */ - Status = XVidC_EdidIsVideoTimingSupported(Edid, - (XVidC_VideoTimingMode *)XVidC_GetVideoModeData( - VidMode)); - if (Status != XST_SUCCESS) { - xdbg_printf(XDBG_DEBUG_GENERAL,"SS INFO:SST:" - "%s is not supported.\n\rSetting to " - "640x480 resolution.\n\r", - XVidC_GetVideoModeStr(VidMode)); - VidMode = XVIDC_VM_640x480_60_P; - } } else { xdbg_printf(XDBG_DEBUG_GENERAL,"SS INFO:SST:Using " diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/hdcp1x/xdptxss_hdcp1x.h b/XilinxProcessorIPLib/drivers/dptxss/src/hdcp1x/xdptxss_hdcp1x.h index 61028553..8a0ecf15 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/hdcp1x/xdptxss_hdcp1x.h +++ b/XilinxProcessorIPLib/drivers/dptxss/src/hdcp1x/xdptxss_hdcp1x.h @@ -43,6 +43,8 @@ * Ver Who Date Changes * ---- --- -------- ----------------------------------------------------- * 1.00 sha 08/07/15 Initial release. +* 2.00 sha 09/28/15 Included Timer Counter core header file. +* Included HDCP port header file. * * ******************************************************************************/ @@ -59,6 +61,8 @@ extern "C" { #include "xparameters.h" #if (XPAR_XHDCP_NUM_INSTANCES > 0) #include "xhdcp1x.h" +#include "xhdcp1x_port.h" +#include "xtmrctr.h" #endif /************************** Constant Definitions *****************************/ diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss.c b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss.c index 2b05573d..5e702721 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss.c +++ b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss.c @@ -33,7 +33,7 @@ /** * * @file xdptxss.c -* @addtogroup dptxss_v1_0 +* @addtogroup dptxss_v2_0 * @{ * * This is the main file for Xilinx DisplayPort Transmitter Subsystem driver. @@ -50,6 +50,7 @@ * 1.00 sha 07/21/15 Renamed sub-cores functions with prefix XDpTxSs_* * 1.00 sha 08/07/15 Added support for customized main stream attributes. * Added HDCP instance into global sub-cores structure. +* 2.00 sha 09/28/15 Added HDCP and Timer Counter support. * * ******************************************************************************/ @@ -75,6 +76,7 @@ typedef struct { #endif #if (XPAR_XHDCP_NUM_INSTANCES > 0) XHdcp1x Hdcp1xInst; + XTmrCtr TmrCtrInst; #endif XDp DpInst; XVtc VtcInst[XDPTXSS_NUM_STREAMS]; @@ -87,6 +89,14 @@ static void DpTxSs_CalculateMsa(XDpTxSs *InstancePtr, u8 Stream); static u32 DpTxSs_CheckRxDeviceMode(XDpTxSs *InstancePtr); static u32 DpTxSs_SetupSubCores(XDpTxSs *InstancePtr); +#if (XPAR_XHDCP_NUM_INSTANCES > 0) +static int DpTxSs_HdcpStartTimer(const XHdcp1x *InstancePtr, u16 TimeoutInMs); +static int DpTxSs_HdcpStopTimer(const XHdcp1x *InstancePtr); +static int DpTxSs_HdcpBusyDelay(const XHdcp1x *InstancePtr, u16 DelayInMs); +static u32 DpTxSs_ConvertUsToTicks(u32 TimeoutInUs, u32 ClkFreq); +static void DpTxSs_TimerCallback(void *InstancePtr, u8 TmrCtrNumber); +#endif + /************************** Variable Definitions *****************************/ XDpTxSs_SubCores DpTxSsSubCores; @@ -122,6 +132,9 @@ u32 XDpTxSs_CfgInitialize(XDpTxSs *InstancePtr, XDpTxSs_Config *CfgPtr, { #if (XPAR_XDUALSPLITTER_NUM_INSTANCES > 0) XDualSplitter_Config DualConfig; +#endif +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + XHdcp1x_Config Hdcp1xConfig; #endif XDp_Config DpConfig; XVtc_Config VtcConfig; @@ -204,6 +217,64 @@ u32 XDpTxSs_CfgInitialize(XDpTxSs *InstancePtr, XDpTxSs_Config *CfgPtr, } } #endif +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + /* Check for Timer Counter availability */ + if (InstancePtr->TmrCtrPtr != NULL) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS INFO: Initializing Timer " + "Counter IP \n\r"); + + /* Calculate absolute base address of Timer Counter sub-core */ + InstancePtr->Config.TmrCtrSubCore.TmrCtrConfig.BaseAddress += + InstancePtr->Config.BaseAddress; + + /* Timer Counter config initialize */ + Status = XTmrCtr_Initialize(InstancePtr->TmrCtrPtr, + InstancePtr->Config.TmrCtrSubCore.TmrCtrConfig.DeviceId); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS ERR:: Timer " + "Counter initialization failed\n\r"); + return XST_FAILURE; + } + + /* Calculate absolute base address of Timer Counter sub-core */ + InstancePtr->TmrCtrPtr->Config.BaseAddress += + InstancePtr->Config.BaseAddress; + InstancePtr->TmrCtrPtr->BaseAddress += + InstancePtr->Config.BaseAddress; + + /* Initialize the HDCP timer functions */ + XHdcp1x_SetTimerStart(&DpTxSs_HdcpStartTimer); + XHdcp1x_SetTimerStop(&DpTxSs_HdcpStopTimer); + XHdcp1x_SetTimerDelay(&DpTxSs_HdcpBusyDelay); + } + + /* Check for HDCP availability */ + if (InstancePtr->Hdcp1xPtr != NULL) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS INFO: Initializing HDCP IP " + "\n\r"); + + /* Calculate absolute base address of HDCP sub-core */ + InstancePtr->Config.Hdcp1xSubCore.Hdcp1xConfig.BaseAddress += + InstancePtr->Config.BaseAddress; + (void)memcpy((void *)&(Hdcp1xConfig), + (const void *)&CfgPtr->Hdcp1xSubCore.Hdcp1xConfig, + sizeof(XHdcp1x_Config)); + + /* HDCP config initialize */ + Hdcp1xConfig.BaseAddress += InstancePtr->Config.BaseAddress; + Status = XHdcp1x_CfgInitialize(InstancePtr->Hdcp1xPtr, + &Hdcp1xConfig, (void *)InstancePtr->DpPtr, + Hdcp1xConfig.BaseAddress); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS ERR:: HDCP " + "initialization failed\n\r"); + return XST_FAILURE; + } + + /* Set key selection value for TX */ + XHdcp1x_SetKeySelect(InstancePtr->Hdcp1xPtr, 0x0); + } +#endif /* Initialize VTC equal to number of streams */ for (Index = 0; Index < InstancePtr->Config.NumMstStreams; Index++) { @@ -281,6 +352,17 @@ void XDpTxSs_Reset(XDpTxSs *InstancePtr) } #endif +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + /* Reset HDCP interface */ + if (InstancePtr->Hdcp1xPtr) { + XHdcp1x_Reset(InstancePtr->Hdcp1xPtr); + } + + /* Reset Timer Counter zero */ + if (InstancePtr->TmrCtrPtr) { + XTmrCtr_Reset(InstancePtr->TmrCtrPtr, 0); + } +#endif for (Index = 0; Index < InstancePtr->Config.NumMstStreams; Index++) { /* Reset VTC's */ if (InstancePtr->VtcPtr[Index]) { @@ -320,6 +402,15 @@ u32 XDpTxSs_Start(XDpTxSs *InstancePtr) return Status; } +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + /* Set physical interface (DisplayPort) down */ + Status = XHdcp1x_SetPhysicalState(InstancePtr->Hdcp1xPtr, 0); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS ERR: Setting PHY down " + "failed.\n\r"); + return Status; + } +#endif /* Start DisplayPort sub-core configuration */ Status = XDpTxSs_DpTxStart(InstancePtr->DpPtr, InstancePtr->UsrOpt.MstSupport, @@ -332,6 +423,24 @@ u32 XDpTxSs_Start(XDpTxSs *InstancePtr) return Status; } +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + /* Set lane count in HDCP */ + Status = XHdcp1x_SetLaneCount(InstancePtr->Hdcp1xPtr, + InstancePtr->DpPtr->TxInstance.LinkConfig.LaneCount); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS ERR: Setting HDCP lane " + "count failed.\n\r"); + return Status; + } + + /* Set physical interface (DisplayPort) up */ + Status = XHdcp1x_SetPhysicalState(InstancePtr->Hdcp1xPtr, 1); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS ERR: Setting PHY up failed." + "\n\r"); + return Status; + } +#endif /* Align video mode being set in DisplayPort */ InstancePtr->UsrOpt.VmId = InstancePtr->DpPtr->TxInstance.MsaConfig[0].Vtm.VmId; @@ -398,6 +507,16 @@ u32 XDpTxSs_StartCustomMsa(XDpTxSs *InstancePtr, DpTxSs_CalculateMsa(InstancePtr, Index); } +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + /* Set physical interface (DisplayPort) down */ + Status = XHdcp1x_SetPhysicalState(InstancePtr->Hdcp1xPtr, 0); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS ERR: Setting PHY down " + "failed.\n\r"); + return Status; + } +#endif + /* Start DisplayPort sub-core configuration */ Status = XDpTxSs_DpTxStart(InstancePtr->DpPtr, InstancePtr->UsrOpt.MstSupport, @@ -410,6 +529,25 @@ u32 XDpTxSs_StartCustomMsa(XDpTxSs *InstancePtr, return Status; } +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + /* Set lane count in HDCP */ + Status = XHdcp1x_SetLaneCount(InstancePtr->Hdcp1xPtr, + InstancePtr->DpPtr->TxInstance.LinkConfig.LaneCount); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS ERR: Setting HDCP lane " + "count failed.\n\r"); + return Status; + } + + /* Set physical interface (DisplayPort) up */ + Status = XHdcp1x_SetPhysicalState(InstancePtr->Hdcp1xPtr, 1); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"SS ERR: Setting PHY up failed." + "\n\r"); + return Status; + } +#endif + /* Setup subsystem sub-cores */ Status = DpTxSs_SetupSubCores(InstancePtr); if (Status != XST_SUCCESS) { @@ -450,6 +588,12 @@ void XDpTxSs_Stop(XDpTxSs *InstancePtr) } #endif +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + if (InstancePtr->Hdcp1xPtr) { + /* Disable HDCP */ + XHdcp1x_Disable(InstancePtr->Hdcp1xPtr); + } +#endif for (Index = 0; Index < InstancePtr->Config.NumMstStreams; Index++) { if (InstancePtr->VtcPtr[Index]) { /* Disable all the VTC sub-cores */ @@ -465,6 +609,7 @@ void XDpTxSs_Stop(XDpTxSs *InstancePtr) * * @param InstancePtr is a pointer to the XDpTxSs instance. * @param Bpc is the new number of bits per color that needs to be set. +* - 6 = XVIDC_BPC_6, * - 8 = XVIDC_BPC_8, * - 10 = XVIDC_BPC_10, * - 12 = XVIDC_BPC_12, @@ -481,8 +626,9 @@ u32 XDpTxSs_SetBpc(XDpTxSs *InstancePtr, u8 Bpc) { /* Verify arguments. */ Xil_AssertNonvoid(InstancePtr != NULL); - Xil_AssertNonvoid((Bpc == XVIDC_BPC_8) || (Bpc == XVIDC_BPC_10) || - (Bpc == XVIDC_BPC_12) || (Bpc == XVIDC_BPC_16)); + Xil_AssertNonvoid((Bpc == XVIDC_BPC_6) || (Bpc == XVIDC_BPC_8) || + (Bpc == XVIDC_BPC_10) || (Bpc == XVIDC_BPC_12) || + (Bpc == XVIDC_BPC_16)); /* Set bits per color */ InstancePtr->UsrOpt.Bpc = Bpc; @@ -914,6 +1060,578 @@ void XDpTxSs_SetHasRedriverInPath(XDpTxSs *InstancePtr, u8 Set) XDp_TxSetHasRedriverInPath(InstancePtr->DpPtr, Set); } +#if (XPAR_XHDCP_NUM_INSTANCES > 0) +/*****************************************************************************/ +/** +* +* This function enables High-Bandwidth Content Protection (HDCP) interface. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* +* @return +* - XST_SUCCESS, if HDCP i/f enabled successfully. +* - XST_FAILURE, otherwise. +* +* @note None. +* +******************************************************************************/ +u32 XDpTxSs_HdcpEnable(XDpTxSs *InstancePtr) +{ + u32 Status; + + /* Verify arguments.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + + /* Enable HDCP interface */ + Status = XHdcp1x_Enable(InstancePtr->Hdcp1xPtr); + + return Status; +} + +/*****************************************************************************/ +/** +* +* This function disables High-Bandwidth Content Protection (HDCP) interface. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* +* @return +* - XST_SUCCESS, if HDCP i/f disabled successfully. +* - XST_FAILURE, otherwise. +* +* @note None. +* +******************************************************************************/ +u32 XDpTxSs_HdcpDisable(XDpTxSs *InstancePtr) +{ + u32 Status; + + /* Verify arguments.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + + /* Enable HDCP interface */ + Status = XHdcp1x_Disable(InstancePtr->Hdcp1xPtr); + + return Status; +} + +/*****************************************************************************/ +/** +* +* This function polls the HDCP interface, process events and sets transmit +* state machine accordingly. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* +* @return +* - XST_SUCCESS, if polling the HDCP interface was successful. +* - XST_FAILURE, if polling the HDCP interface failed. +* +* @note None. +* +******************************************************************************/ +u32 XDpTxSs_Poll(XDpTxSs *InstancePtr) +{ + u32 Status; + + /* Verify arguments.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + + /* Poll the HDCP interface */ + Status = XHdcp1x_Poll(InstancePtr->Hdcp1xPtr); + + return Status; +} + +/*****************************************************************************/ +/** +* +* This function determines whether downstream/remote RX device is HDCP capable. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* +* @return +* - TRUE, if remote RX device is HDCP capable. +* - FALSE, if remote RX device is not HDCP capable. +* +* @note None. +* +******************************************************************************/ +u32 XDpTxSs_IsHdcpCapable(XDpTxSs *InstancePtr) +{ + u32 HdcpCapable; + + /* Verify arguments.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + + /* Query a port device HDCP capability */ + HdcpCapable = XHdcp1x_PortIsCapable(InstancePtr->Hdcp1xPtr); + + return HdcpCapable; +} + +/*****************************************************************************/ +/** +* +* This function initiates authentication process. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* +* @return +* - XST_SUCCESS, if authentication initiated successfully. +* - XST_FAILURE, if authentication initiated failed. +* +* @note The transmitter initiates authentication by first sending its +* An and Aksv value to the HDCP Receiver. +* +******************************************************************************/ +u32 XDpTxSs_Authenticate(XDpTxSs *InstancePtr) +{ + u32 Status; + + /* Verify arguments.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + + /* Initiate authentication process */ + Status = XHdcp1x_Authenticate(InstancePtr->Hdcp1xPtr); + + return Status; +} + +/*****************************************************************************/ +/** +* +* This function checks whether HDCP Transmitter authenticated the HDCP +* Receiver. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* +* @return +* - TRUE, if HDCP Transmitter authenticated the HDCP Receiver. +* - FALSE, if HDCP Transmitter not authenticated the HDCP +* Receiver. +* +* @note None. +* +******************************************************************************/ +u32 XDpTxSs_IsAuthenticated(XDpTxSs *InstancePtr) +{ + u32 Authenticate; + + /* Verify arguments.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + + /* Check authentication has completed successfully */ + Authenticate = XHdcp1x_IsAuthenticated(InstancePtr->Hdcp1xPtr); + + return Authenticate; +} + +/*****************************************************************************/ +/** +* +* This function enables encryption on series of streams within an HDCP +* interface. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* @param StreamMap is the bit map of streams to enable encryption on. +* +* @return +* - XST_SUCCESS, if encryption enabled successfully. +* - XST_FAILURE, if encryption enabled failed. +* +* @note None. +* +******************************************************************************/ +u32 XDpTxSs_EnableEncryption(XDpTxSs *InstancePtr, u64 StreamMap) +{ + u32 Status; + + /* Verify arguments.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + + /* Enable encryption on stream(s) */ + Status = XHdcp1x_EnableEncryption(InstancePtr->Hdcp1xPtr, StreamMap); + + return Status; +} + +/*****************************************************************************/ +/** +* +* This function disables encryption on series of streams within an HDCP +* interface. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* @param StreamMap is the bit map of streams to disable encryption on. +* +* @return +* - XST_SUCCESS, if encryption disabled successfully. +* - XST_FAILURE, if encryption disabled failed. +* +* @note None. +* +******************************************************************************/ +u32 XDpTxSs_DisableEncryption(XDpTxSs *InstancePtr, u64 StreamMap) +{ + u32 Status; + + /* Verify arguments.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + + /* Disable encryption on stream(s) */ + Status = XHdcp1x_DisableEncryption(InstancePtr->Hdcp1xPtr, StreamMap); + + return Status; +} + +/*****************************************************************************/ +/** +* +* This function retrieves the current encryption map. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* +* @return +* - The current encryption map. +* - Otherwise zero. +* +* @note None. +* +******************************************************************************/ +u64 XDpTxSs_GetEncryption(XDpTxSs *InstancePtr) +{ + u64 StreamMap; + + /* Verify arguments.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + + /* Get stream map of the stream(s) */ + StreamMap = XHdcp1x_GetEncryption(InstancePtr->Hdcp1xPtr); + + return StreamMap; +} + +/*****************************************************************************/ +/** +* +* This function enables/disables the underlying physical interface. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* @param PhyState indicates TRUE/FALSE value to enable/disable the +* underlying physical interface. +* +* @return +* - XST_SUCCESS, if the underlying physical interface enabled +* successfully. +* - XST_FAILURE, if the underlying physical interface failed to +* enable. +* +* @note None. +* +******************************************************************************/ +u32 XDpTxSs_SetPhysicalState(XDpTxSs *InstancePtr, u32 PhyState) +{ + u32 Status; + + /* Verify argument.*/ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + Xil_AssertNonvoid((PhyState == TRUE) || (PhyState == FALSE)); + + /* Enable underlying physical interface */ + Status = XHdcp1x_SetPhysicalState(InstancePtr->Hdcp1xPtr, PhyState); + + return Status; +} + +/*****************************************************************************/ +/** +* +* This function sets lane(s) of the HDCP interface. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* @param Lane is the number of lanes to be used. +* - 1 = XDPTXSS_LANE_COUNT_SET_1 +* - 2 = XDPTXSS_LANE_COUNT_SET_2 +* - 4 = XDPTXSS_LANE_COUNT_SET_4 +* +* @return +* - XST_SUCCESS, if lane(s) into the HDCP i/f set successfully. +* - XST_FAILURE, if failed to set lane(s) into the HDCP i/f. +* +* @note None. +* +******************************************************************************/ +u32 XDpTxSs_SetLane(XDpTxSs *InstancePtr, u32 Lane) +{ + u32 Status; + + /* Verify arguments. */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->Config.HdcpEnable == 0x1); + Xil_AssertNonvoid((Lane == XDPTXSS_LANE_COUNT_SET_1) || + (Lane == XDPTXSS_LANE_COUNT_SET_2) || + (Lane == XDPTXSS_LANE_COUNT_SET_4)); + + /* Set lanes into the HDCP interface */ + Status = XHdcp1x_SetLaneCount(InstancePtr->Hdcp1xPtr, Lane); + + return Status; +} + +/*****************************************************************************/ +/** +* +* This function sets the debug printf function. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* @param PrintfFunc is the printf function. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDpTxSs_SetDebugPrintf(XDpTxSs *InstancePtr, XDpTxSs_Printf PrintfFunc) +{ + /* Verify arguments.*/ + Xil_AssertVoid(InstancePtr->Config.HdcpEnable == 0x1); + Xil_AssertVoid(PrintfFunc != NULL); + + /* Set debug printf function */ + XHdcp1x_SetDebugPrintf(PrintfFunc); +} + +/*****************************************************************************/ +/** +* +* This function sets the debug log message function. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* @param LogFunc is the debug logging function. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDpTxSs_SetDebugLogMsg(XDpTxSs *InstancePtr, XDpTxSs_LogMsg LogFunc) +{ + /* Verify arguments.*/ + Xil_AssertVoid(InstancePtr->Config.HdcpEnable == 0x1); + Xil_AssertVoid(LogFunc != NULL); + + /* Set debug log message function */ + XHdcp1x_SetDebugLogMsg(LogFunc); +} + +/*****************************************************************************/ +/** +* +* This function starts a timer on behalf of an HDCP interface. +* +* @param InstancePtr is a pointer to the XHdcp1x core instance. +* @param TimeoutInMs the timer duration in milliseconds. +* +* @return +* - XST_SUCCESS if Timer Counter started successfully. +* +* @note None. +* +******************************************************************************/ +static int DpTxSs_HdcpStartTimer(const XHdcp1x *InstancePtr, u16 TimeoutInMs) +{ + XTmrCtr *TmrCtrPtr = &DpTxSsSubCores.TmrCtrInst; + u8 TimerChannel; + u32 TimerOptions; + u32 NumTicks; + + /* Verify argument. */ + Xil_AssertNonvoid(InstancePtr != NULL); + + /* Determine NumTicks */ + NumTicks = DpTxSs_ConvertUsToTicks((TimeoutInMs * 1000), + TmrCtrPtr->Config.SysClockFreqHz); + + /* Stop Timer Counter */ + TimerChannel = 0; + XTmrCtr_Stop(TmrCtrPtr, TimerChannel); + + /* Configure the callback */ + XTmrCtr_SetHandler(TmrCtrPtr, &DpTxSs_TimerCallback, + &DpTxSsSubCores.Hdcp1xInst); + + /* Configure the timer options */ + TimerOptions = XTmrCtr_GetOptions(TmrCtrPtr, TimerChannel); + TimerOptions |= XTC_DOWN_COUNT_OPTION; + TimerOptions |= XTC_INT_MODE_OPTION; + TimerOptions &= ~XTC_AUTO_RELOAD_OPTION; + XTmrCtr_SetOptions(TmrCtrPtr, TimerChannel, TimerOptions); + + /* Set the timeout and start */ + XTmrCtr_SetResetValue(TmrCtrPtr, TimerChannel, NumTicks); + XTmrCtr_Start(TmrCtrPtr, TimerChannel); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function stops a timer on behalf of an HDCP interface +* +* @param InstancePtr is a pointer to the XHdcp1x core instance. +* +* @return +* - XST_SUCCESS if Timer Counter stopped successfully. +* +* @note None. +* +******************************************************************************/ +static int DpTxSs_HdcpStopTimer(const XHdcp1x *InstancePtr) +{ + XTmrCtr *TmrCtrPtr = &DpTxSsSubCores.TmrCtrInst; + u8 TimerChannel; + + /* Verify argument. */ + Xil_AssertNonvoid(InstancePtr != NULL); + + /* Stop Timer Counter */ + TimerChannel = 0; + XTmrCtr_Stop(TmrCtrPtr, TimerChannel); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function busy waits for an interval on behalf of an HDCP interface. +* +* @param InstancePtr is a pointer to the XHdcp1x core instance. +* @param DelayInMs the delay duration in milliseconds. +* +* @return +* - XST_SUCCESS if Timer Counter busy wait successfully. +* +* @note None. +* +******************************************************************************/ +static int DpTxSs_HdcpBusyDelay(const XHdcp1x *InstancePtr, u16 DelayInMs) +{ + XTmrCtr *TmrCtrPtr = &DpTxSsSubCores.TmrCtrInst; + u8 TimerChannel; + u32 TimerOptions; + u32 NumTicks; + + /* Verify argument. */ + Xil_AssertNonvoid(InstancePtr != NULL); + + /* Determine number of timer ticks */ + NumTicks = DpTxSs_ConvertUsToTicks((DelayInMs * 1000), + TmrCtrPtr->Config.SysClockFreqHz); + + /* Stop it */ + TimerChannel = 0; + XTmrCtr_Stop(TmrCtrPtr, TimerChannel); + + /* Configure the timer options */ + TimerOptions = XTmrCtr_GetOptions(TmrCtrPtr, TimerChannel); + TimerOptions |= XTC_DOWN_COUNT_OPTION; + TimerOptions &= ~XTC_INT_MODE_OPTION; + TimerOptions &= ~XTC_AUTO_RELOAD_OPTION; + XTmrCtr_SetOptions(TmrCtrPtr, TimerChannel, TimerOptions); + + /* Set the timeout and start */ + XTmrCtr_SetResetValue(TmrCtrPtr, TimerChannel, NumTicks); + XTmrCtr_Start(TmrCtrPtr, TimerChannel); + + /* Wait until done */ + while (!XTmrCtr_IsExpired(TmrCtrPtr, TimerChannel)); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function serves as the timer callback. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* @param TmrCtrNumber is the number of the timer/counter within the +* device. The device typically contains at least two +* timer/counters. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +static void DpTxSs_TimerCallback(void *InstancePtr, u8 TmrCtrNumber) +{ + XHdcp1x *Hdcp1xPtr = (XHdcp1x *)InstancePtr; + + /* Verify arguments. */ + Xil_AssertVoid(Hdcp1xPtr != NULL); + Xil_AssertVoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + + /* Handle timeout */ + XHdcp1x_HandleTimeout(Hdcp1xPtr); +} + +/*****************************************************************************/ +/** +* +* This function converts from microseconds to timer ticks. +* +* @param TimeoutInUs is the timeout value to convert into timer ticks. +* @param ClkFreq the clock frequency to use in the conversion. +* +* @return The number of timer ticks. +* +* @note None. +* +******************************************************************************/ +static u32 DpTxSs_ConvertUsToTicks(u32 TimeoutInUs, u32 ClkFreq) +{ + u32 TimeoutFreq; + u32 NumSeconds; + u32 NumTicks = 0; + + /* Check for greater than one second */ + if (TimeoutInUs > 1000000) { + /* Determine the number of seconds */ + NumSeconds = (TimeoutInUs / 1000000); + + /* Update theNumTicks */ + NumTicks = (NumSeconds * ClkFreq); + + /* Adjust the TimeoutInUs */ + TimeoutInUs -= (NumSeconds * 1000000); + } + + /* Convert TimeoutFreq to a frequency */ + TimeoutFreq = 1000; + TimeoutFreq *= 1000; + TimeoutFreq /= TimeoutInUs; + + /* Update NumTicks */ + NumTicks += ((ClkFreq / TimeoutFreq) + 1); + + return NumTicks; +} +#endif + /*****************************************************************************/ /** * @@ -936,6 +1654,18 @@ static void DpTxSs_GetIncludedSubCores(XDpTxSs *InstancePtr) (&DpTxSsSubCores.DsInst): NULL); #endif +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + /* Assign instance of HDCP core */ + InstancePtr->Hdcp1xPtr = + ((InstancePtr->Config.Hdcp1xSubCore.IsPresent)? + (&DpTxSsSubCores.Hdcp1xInst): NULL); + + /* Assign instance of Timer Counter core */ + InstancePtr->TmrCtrPtr = + ((InstancePtr->Config.TmrCtrSubCore.IsPresent)? + (&DpTxSsSubCores.TmrCtrInst): NULL); +#endif + /* Assign instance of DisplayPort core */ InstancePtr->DpPtr = ((InstancePtr->Config.DpSubCore.IsPresent)? (&DpTxSsSubCores.DpInst): NULL); diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss.h b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss.h index 4b03f0ae..87e4c350 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss.h +++ b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss.h @@ -33,7 +33,7 @@ /** * * @file xdptxss.h -* @addtogroup dptxss_v1_0 +* @addtogroup dptxss_v2_0 * @{ * @details * @@ -58,11 +58,13 @@ * * Interrupts * -* The DisplayPort TX Subsystem driver provides an interrupt handler -* XDpTxSs_DpIntrHandler for handling the interrupt from the DisplayPort -* sub-core. The users of this driver have to register this handler with -* the interrupt system and provide the callback functions by using -* XDpTxSs_SetCallBack API. +* The DisplayPort TX Subsystem driver provides the interrupt handlers +* - XDpTxSs_DpIntrHandler +* - XDpTxSs_HdcpIntrHandler +* - XDpTxSs_TmrCtrIntrHandler, for handling the interrupt from the DisplayPort, +* optional HDCP and Timer Counter sub-cores respectively. The users of this +* driver have to register this handler with the interrupt system and provide +* the callback functions by using XDpTxSs_SetCallBack API. * * Virtual Memory * @@ -99,6 +101,7 @@ * Added support for customized main stream attributes. * Added function: XDpTxSs_SetHasRedriverInPath. * Added HDCP support data structure. +* 2.00 sha 09/28/15 Added HDCP and Timer Counter functions. * * ******************************************************************************/ @@ -205,6 +208,16 @@ typedef struct { XHdcp1x_Config Hdcp1xConfig; /**< HDCP core configuration * information */ } XDpTxSs_Hdcp1xSubCore; + +/** +* Timer Counter Sub-core structure. +*/ +typedef struct { + u16 IsPresent; /**< Flag to hold the presence of Timer + * Counter core */ + XTmrCtr_Config TmrCtrConfig; /**< Timer Counter core + * configuration information */ +} XDpTxSs_TmrCtrSubCore; #endif /** @@ -232,6 +245,9 @@ typedef struct { XDpTxSs_DpSubCore DpSubCore; /**< DisplayPort Configuration */ #if (XPAR_XHDCP_NUM_INSTANCES > 0) XDpTxSs_Hdcp1xSubCore Hdcp1xSubCore; /**< HDCP Configuration */ + XDpTxSs_TmrCtrSubCore TmrCtrSubCore; /**< Timer Counter + * Configuration */ + #endif #if (XPAR_XDUALSPLITTER_NUM_INSTANCES > 0) XDpTxSs_DsSubCore DsSubCore; /**< Dual Splitter Configuration */ @@ -255,6 +271,7 @@ typedef struct { #endif #if (XPAR_XHDCP_NUM_INSTANCES > 0) XHdcp1x *Hdcp1xPtr; /**< HDCP sub-core instance */ + XTmrCtr *TmrCtrPtr; /**< Timer Counter sub-core instance */ #endif XDp *DpPtr; /**< DisplayPort sub-core instance */ XVtc *VtcPtr[XDPTXSS_NUM_STREAMS];/**< Maximum number of VTC sub-core @@ -275,6 +292,11 @@ typedef struct { */ #define XDpTxSs_MainStreamAttributes XDp_TxMainStreamAttributes +#if (XPAR_XHDCP_NUM_INSTANCES > 0) +#define XDpTxSs_Printf XHdcp1x_Printf /**< Debug printf */ +#define XDpTxSs_LogMsg XHdcp1x_LogMsg /**< Debug log message */ +#endif + /************************** Function Prototypes ******************************/ /* Initialization function in xdptxss_sinit.c */ @@ -301,17 +323,39 @@ u32 XDpTxSs_GetEdid(XDpTxSs *InstancePtr, u8 *Edid); u32 XDpTxSs_GetRemoteEdid(XDpTxSs *InstancePtr, u8 SinkNum, u8 *Edid); void XDpTxSs_SetHasRedriverInPath(XDpTxSs *InstancePtr, u8 Set); +#if (XPAR_XHDCP_NUM_INSTANCES > 0) +/* Optional HDCP related functions */ +u32 XDpTxSs_HdcpEnable(XDpTxSs *InstancePtr); +u32 XDpTxSs_HdcpDisable(XDpTxSs *InstancePtr); +u32 XDpTxSs_Poll(XDpTxSs *InstancePtr); +u32 XDpTxSs_IsHdcpCapable(XDpTxSs *InstancePtr); +u32 XDpTxSs_Authenticate(XDpTxSs *InstancePtr); +u32 XDpTxSs_IsAuthenticated(XDpTxSs *InstancePtr); +u32 XDpTxSs_EnableEncryption(XDpTxSs *InstancePtr, u64 StreamMap); +u32 XDpTxSs_DisableEncryption(XDpTxSs *InstancePtr, u64 StreamMap); +u64 XDpTxSs_GetEncryption(XDpTxSs *InstancePtr); +u32 XDpTxSs_SetPhysicalState(XDpTxSs *InstancePtr, u32 PhyState); +u32 XDpTxSs_SetLane(XDpTxSs *InstancePtr, u32 Lane); +void XDpTxSs_SetDebugPrintf(XDpTxSs *InstancePtr, XDpTxSs_Printf PrintfFunc); +void XDpTxSs_SetDebugLogMsg(XDpTxSs *InstancePtr, XDpTxSs_LogMsg LogFunc); +#endif + void XDpTxSs_ReportCoreInfo(XDpTxSs *InstancePtr); void XDpTxSs_ReportLinkInfo(XDpTxSs *InstancePtr); void XDpTxSs_ReportMsaInfo(XDpTxSs *InstancePtr); void XDpTxSs_ReportSinkCapInfo(XDpTxSs *InstancePtr); void XDpTxSs_ReportSplitterInfo(XDpTxSs *InstancePtr); void XDpTxSs_ReportVtcInfo(XDpTxSs *InstancePtr); +void XDpTxSs_ReportHdcpInfo(XDpTxSs *InstancePtr); /* Self test function in xdptxss_selftest.c */ u32 XDpTxSs_SelfTest(XDpTxSs *InstancePtr); /* Interrupt functions in xdptxss_intr.c */ +#if (XPAR_XHDCP_NUM_INSTANCES > 0) +void XDpTxSs_HdcpIntrHandler(void *InstancePtr); +void XDpTxSs_TmrCtrIntrHandler(void *InstancePtr); +#endif void XDpTxSs_DpIntrHandler(void *InstancePtr); u32 XDpTxSs_SetCallBack(XDpTxSs *InstancePtr, u32 HandlerType, void *CallbackFunc, void *CallbackRef); diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_dbg.c b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_dbg.c index a91714d0..732e4c66 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_dbg.c +++ b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_dbg.c @@ -33,7 +33,7 @@ /** * * @file xdptxss_dbg.c -* @addtogroup dptxss_v1_0 +* @addtogroup dptxss_v2_0 * @{ * * This file contains functions to report debug information of DisplayPort TX @@ -46,6 +46,7 @@ * ---- --- -------- -------------------------------------------------- * 1.00 sha 01/29/15 Initial release. * 1.00 sha 08/07/15 Updated register offsets in debug MSA info. +* 2.00 sha 09/28/15 Added HDCP debug function. * * ******************************************************************************/ @@ -275,6 +276,15 @@ void XDpTxSs_ReportCoreInfo(XDpTxSs *InstancePtr) } #endif +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + if (InstancePtr->Hdcp1xPtr) { + xil_printf("High-Bandwidth Content protection (HDCP):Yes\n\r"); + } + if (InstancePtr->TmrCtrPtr) { + xil_printf("Timer Counter(0):Yes\n\r"); + } +#endif + if (InstancePtr->DpPtr) { xil_printf("DisplayPort Transmitter(TX):Yes\n\r"); } @@ -535,4 +545,28 @@ void XDpTxSs_ReportMsaInfo(XDpTxSs *InstancePtr) xil_printf("\n\r"); } + +/*****************************************************************************/ +/** +* +* This function prints the debug display info of the HDCP interface. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDpTxSs_ReportHdcpInfo(XDpTxSs *InstancePtr) +{ + /* Verify argument. */ + Xil_AssertVoid(InstancePtr != NULL); + +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + XHdcp1x_Info(InstancePtr->Hdcp1xPtr); +#else + xil_printf("HDCP is not supported in this design.\n\r"); +#endif +} /** @} */ diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_g.c b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_g.c index d9c0bcd4..be308cc8 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_g.c +++ b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_g.c @@ -46,6 +46,7 @@ #define XPAR_DP_TX_SUBSYSTEM_0_DP_PRESENT 1 #define XPAR_DP_TX_SUBSYSTEM_0_DP_TX_HDCP_PRESENT 1 +#define XPAR_DP_TX_SUBSYSTEM_0_TIMER_PRESENT 1 #define XPAR_DP_TX_SUBSYSTEM_0_VTC1_PRESENT 1 @@ -93,6 +94,14 @@ XDpTxSs_Config XDpTxSs_ConfigTable[] = XPAR_DP_TX_SUBSYSTEM_0_DP_TX_HDCP_IS_HDMI } }, + { + XPAR_DP_TX_SUBSYSTEM_0_TIMER_PRESENT, + { + XPAR_DP_TX_SUBSYSTEM_0_TIMER_DEVICE_ID, + XPAR_DP_TX_SUBSYSTEM_0_TIMER_BASEADDR, + XPAR_DP_TX_SUBSYSTEM_0_TIMER_CLOCK_FREQ_HZ + } + }, { { XPAR_DP_TX_SUBSYSTEM_0_VTC1_PRESENT, diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_hw.h b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_hw.h index 74b4a91a..6d3155bc 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_hw.h +++ b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_hw.h @@ -33,7 +33,7 @@ /** * * @file xdptxss_hw.h -* @addtogroup dptxss_v1_0 +* @addtogroup dptxss_v2_0 * @{ * * This header file contains identifiers and register-level core functions (or diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_intr.c b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_intr.c index e1c44e54..39404cdd 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_intr.c +++ b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_intr.c @@ -33,7 +33,7 @@ /** * * @file xdptxss_intr.c -* @addtogroup dptxss_v1_0 +* @addtogroup dptxss_v2_0 * @{ * * This file contains interrupt related functions of Xilinx DisplayPort TX @@ -47,6 +47,7 @@ * 1.00 sha 01/29/15 Initial release. * 1.00 sha 08/07/15 Added new handler types: lane count, link rate, * Pre-emphasis voltage swing adjust and Set MSA. +* 2.00 sha 09/28/15 Added HDCP and Timer Counter interrupt handlers. * * ******************************************************************************/ @@ -103,6 +104,64 @@ void XDpTxSs_DpIntrHandler(void *InstancePtr) XDp_InterruptHandler(XDpTxSsPtr->DpPtr); } +#if (XPAR_XHDCP_NUM_INSTANCES > 0) +/*****************************************************************************/ +/** +* +* This function is the interrupt handler for the HDCP Cipher core. +* +* The application is responsible for connecting this function to the interrupt +* system. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance that +* just interrupted. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDpTxSs_HdcpIntrHandler(void *InstancePtr) +{ + XDpTxSs *XDpTxSsPtr = (XDpTxSs *)InstancePtr; + + /* Verify arguments. */ + Xil_AssertVoid(XDpTxSsPtr != NULL); + Xil_AssertVoid(XDpTxSsPtr->IsReady == XIL_COMPONENT_IS_READY); + + /* HDCP Cipher interrupt handler */ + XHdcp1x_CipherIntrHandler(XDpTxSsPtr->Hdcp1xPtr); +} + +/*****************************************************************************/ +/** +* +* This function is the interrupt handler for the Timer Counter core. +* +* The application is responsible for connecting this function to the interrupt +* system. +* +* @param InstancePtr is a pointer to the XDpTxSs core instance that +* just interrupted. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDpTxSs_TmrCtrIntrHandler(void *InstancePtr) +{ + XDpTxSs *XDpTxSsPtr = (XDpTxSs *)InstancePtr; + + /* Verify arguments. */ + Xil_AssertVoid(XDpTxSsPtr != NULL); + Xil_AssertVoid(XDpTxSsPtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Timer Counter interrupt handler */ + XTmrCtr_InterruptHandler(XDpTxSsPtr->TmrCtrPtr); +} +#endif + /*****************************************************************************/ /** * diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_selftest.c b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_selftest.c index 9e59e13e..5b85c8e4 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_selftest.c +++ b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_selftest.c @@ -33,7 +33,7 @@ /** * * @file xdptxss_selftest.c -* @addtogroup dptxss_v1_0 +* @addtogroup dptxss_v2_0 * @{ * * This file contains self test function for the DisplayPort Transmitter @@ -45,6 +45,7 @@ * Ver Who Date Changes * ---- --- -------- -------------------------------------------------- * 1.00 sha 01/29/15 Initial release. +* 2.00 sha 09/28/15 Added HDCP and Timer Counter self test. * * ******************************************************************************/ @@ -111,6 +112,23 @@ u32 XDpTxSs_SelfTest(XDpTxSs *InstancePtr) } #endif +#if (XPAR_XHDCP_NUM_INSTANCES > 0) + if ((InstancePtr->Hdcp1xPtr) && (InstancePtr->Config.HdcpEnable)) { + Status = XHdcp1x_SelfTest(InstancePtr->Hdcp1xPtr); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"ERR::HDCP Self test " + "failed\r\n"); + } + } + if (InstancePtr->TmrCtrPtr) { + Status = XTmrCtr_SelfTest(InstancePtr->TmrCtrPtr, 0); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_GENERAL,"ERR::Timer Counter " + "Self test failed\r\n"); + } + } +#endif + for (Index = 0; Index < InstancePtr->Config.NumMstStreams; Index++) { if (InstancePtr->VtcPtr[Index]) { Status = XVtc_SelfTest(InstancePtr->VtcPtr[Index]); diff --git a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_sinit.c b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_sinit.c index 72f476a1..e10316a7 100644 --- a/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_sinit.c +++ b/XilinxProcessorIPLib/drivers/dptxss/src/xdptxss_sinit.c @@ -33,7 +33,7 @@ /** * * @file xdptxss_sinit.c -* @addtogroup dptxss_v1_0 +* @addtogroup dptxss_v2_0 * @{ * * This file contains static initialization method for Xilinx DisplayPort