Tool/software: Linux
could you please help me out about maximum number of lcd supported by tda2xx?
I have seen lcd.h which stat that max is supported is 2 so would it still support if i change and try to connect 3 lcd altogether?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Tool/software: Linux
could you please help me out about maximum number of lcd supported by tda2xx?
I have seen lcd.h which stat that max is supported is 2 so would it still support if i change and try to connect 3 lcd altogether?
Thanks for your quick response
my usecase flow is
UseCase: chains_lvdsVipDualCam_DualDisplay
Capture -> Select_Capture
Select_Capture -> Display_LCD1
Select_Capture -> Display_LCD2
GrpxSrc -> Display_Grpx
i take reference of dual cam dual display what i want to do is display on lcd instand of hdmi i have seen chains_comman.c file and i have configured parameter for lcd instand of hdmi how can i make this work
Brijesh,
I have already done the above change. Please refer the following lines :
Int32 status;
DisplayCtrlLink_ConfigParams *pPrm = &gChains_commonObj.dctrlCfgPrms;
DisplayCtrlLink_VencInfo *pVInfo;
DisplayCtrlLink_OvlyParams *pOvlyPrms;
DisplayCtrlLink_OvlyPipeParams *pPipeOvlyPrms;
DisplayCtrlLink_OvlyParams ovlyPrms[3];
/* Set the link id */
gChains_commonObj.displayCtrlLinkId = SYSTEM_LINK_ID_DISPLAYCTRL;
/* Number of valid entries in vencInfo array */
pPrm->numVencs = 3;
/* Bitmask of tied vencs. Two vencs, which uses same pixel clock and whose vsync are synchronized, can be tied together. */
pPrm->tiedVencs = 0;
--> Are the above changes okay ?
--> Please also tell me the changes to be done in "displayLinkCtrl_drv.c" file, if there are any.
--> I am attaching the entire function with the thread (the use case is made such that we get one output on HDMI as well as on 2 LCD's)
Below is the file containing the function:
/** ******************************************************************************* * * \brief Setups Display Controller to triplr display on On-chip HDMI, * LCD1 and LCD2 * * Configure such that VID2 pipe goes to LCD1 and VID3 pipe to LCD2 * And VID1 and GRPX pipe goes to HDMI * * HDMI is hardcoded to 1080p60 resolution * LCD is hardcoded to 800x480 resolution * * NOTE, this is just a sample config use by example use-cases * User's can configure it different in their use-case * ******************************************************************************* */ Int32 ChainsCommon_TripleDisplay_StartDisplayCtrl( Chains_DisplayType lcdType, UInt32 displayLCD1Width, UInt32 displayLCD1Height, UInt32 displayLCD2Width, UInt32 displayLCD2Height ) { Int32 status; DisplayCtrlLink_ConfigParams *pPrm = &gChains_commonObj.dctrlCfgPrms; DisplayCtrlLink_VencInfo *pVInfo; DisplayCtrlLink_OvlyParams *pOvlyPrms; DisplayCtrlLink_OvlyPipeParams *pPipeOvlyPrms; DisplayCtrlLink_OvlyParams ovlyPrms[3]; /* Set the link id */ gChains_commonObj.displayCtrlLinkId = SYSTEM_LINK_ID_DISPLAYCTRL; /* Number of valid entries in vencInfo array */ pPrm->numVencs = 3; /* Bitmask of tied vencs. Two vencs, which uses same pixel clock and whose vsync are synchronized, can be tied together. */ pPrm->tiedVencs = 0; /* Activate the HDMI BSP layer in the Dctrl link. This is not required if there is no HDMI display in use. */ pPrm->deviceId = DISPLAYCTRL_LINK_USE_HDMI; /* Configure HDMI display */ pVInfo = &pPrm->vencInfo[0]; pVInfo->vencId = SYSTEM_DCTRL_DSS_VENC_HDMI; pVInfo->outputPort = SYSTEM_DCTRL_DSS_HDMI_OUTPUT; pVInfo->vencOutputInfo.vsPolarity = SYSTEM_DCTRL_POLARITY_ACT_HIGH; pVInfo->vencOutputInfo.hsPolarity = SYSTEM_DCTRL_POLARITY_ACT_HIGH; /* Below are of dont care for EVM LCD */ pVInfo->vencOutputInfo.fidPolarity = SYSTEM_DCTRL_POLARITY_ACT_LOW; pVInfo->vencOutputInfo.actVidPolarity = SYSTEM_DCTRL_POLARITY_ACT_HIGH; /* We use 1080p60 - set to SYSTEM_STD_720P_60 for 720p! */ pVInfo->mInfo.standard = SYSTEM_STD_1080P_60; /* Configure HDMI overlay parameters */ pVInfo->mode = 0; pVInfo->isInputPipeConnected[0] = TRUE; pVInfo->isInputPipeConnected[1] = FALSE; pVInfo->isInputPipeConnected[2] = FALSE; pVInfo->isInputPipeConnected[3] = TRUE; pVInfo->writeBackEnabledFlag = FALSE; pVInfo->vencOutputInfo.dataFormat = SYSTEM_DF_RGB24_888; pVInfo->vencOutputInfo.dvoFormat = SYSTEM_DCTRL_DVOFMT_GENERIC_DISCSYNC; pVInfo->vencOutputInfo.videoIfWidth = SYSTEM_VIFW_24BIT; pVInfo->vencOutputInfo.pixelClkPolarity = SYSTEM_DCTRL_POLARITY_ACT_HIGH; pVInfo->vencOutputInfo.aFmt = SYSTEM_DCTRL_A_OUTPUT_MAX; pOvlyPrms = &ovlyPrms[0]; pOvlyPrms->vencId = pVInfo->vencId; pOvlyPrms->deltaLinesPerPanel = 0; pOvlyPrms->alphaBlenderEnable = 0; pOvlyPrms->backGroundColor = 0x0; pOvlyPrms->colorKeyEnable = 1; pOvlyPrms->colorKeySel = SYSTEM_DSS_DISPC_TRANS_COLOR_KEY_SRC; pOvlyPrms->ovlyOptimization = SYSTEM_DSS_DISPC_OVLY_FETCH_ALLDATA; pOvlyPrms->transColorKey = DRAW2D_TRANSPARENT_COLOR; /* Configure LCD - 1 */ pVInfo = &pPrm->vencInfo[1]; pVInfo->vencId = SYSTEM_DCTRL_DSS_VENC_LCD1; pVInfo->outputPort = SYSTEM_DCTRL_DSS_DPI1_OUTPUT; if ((BSP_PLATFORM_SOC_ID_TDA2EX == Bsp_platformGetSocId()) && (BSP_PLATFORM_PACKAGE_TYPE_17x17 == Bsp_platformGetPackageType())) { /* In case of TDA2EX and Package is 17 X 17, LCD is on DPI 3 */ pVInfo->vencId = SYSTEM_DCTRL_DSS_VENC_LCD3; pVInfo->outputPort = SYSTEM_DCTRL_DSS_DPI3_OUTPUT; } pVInfo->vencOutputInfo.vsPolarity = SYSTEM_DCTRL_POLARITY_ACT_LOW; pVInfo->vencOutputInfo.hsPolarity = SYSTEM_DCTRL_POLARITY_ACT_LOW; /* Below are of dont care for EVM LCD */ pVInfo->vencOutputInfo.fidPolarity = SYSTEM_DCTRL_POLARITY_ACT_HIGH; pVInfo->vencOutputInfo.actVidPolarity = SYSTEM_DCTRL_POLARITY_ACT_HIGH; pVInfo->mInfo.standard = SYSTEM_STD_CUSTOM; pVInfo->mInfo.scanFormat = SYSTEM_SF_PROGRESSIVE; pVInfo->mInfo.width = displayLCD1Width; pVInfo->mInfo.height = displayLCD1Height; if(lcdType == CHAINS_DISPLAY_TYPE_LCD_7_INCH) { pVInfo->mInfo.pixelClock = 29232u; pVInfo->mInfo.fps = 60U; pVInfo->mInfo.hFrontPorch = 40u; pVInfo->mInfo.hBackPorch = 40u; pVInfo->mInfo.hSyncLen = 48u; pVInfo->mInfo.vFrontPorch = 13u; pVInfo->mInfo.vBackPorch = 29u; pVInfo->mInfo.vSyncLen = 3u; pVInfo->vencDivisorInfo.divisorLCD = 1; pVInfo->vencDivisorInfo.divisorPCD = 4; } else if(lcdType == CHAINS_DISPLAY_TYPE_LCD_10_INCH) { pVInfo->mInfo.pixelClock = 74500U; pVInfo->mInfo.fps = 60U; pVInfo->mInfo.hBackPorch = 80U; pVInfo->mInfo.hSyncLen = 62U; pVInfo->mInfo.hFrontPorch = 48U; pVInfo->mInfo.vBackPorch = 12U; pVInfo->mInfo.vSyncLen = 35U; pVInfo->mInfo.vFrontPorch = 6U; pVInfo->vencDivisorInfo.divisorLCD = 1; pVInfo->vencDivisorInfo.divisorPCD = 1; } else if (lcdType == CHAINS_DISPLAY_TYPE_LDC_10_INCH_LCDCTRL_TC358778_MIPI_DSI_1920_1200) { pVInfo->mInfo.pixelClock = 147000U; pVInfo->mInfo.fps = 60U; pVInfo->mInfo.hBackPorch = 30U; pVInfo->mInfo.hSyncLen = 16U; pVInfo->mInfo.hFrontPorch = 32U; pVInfo->mInfo.vBackPorch = 16U; pVInfo->mInfo.vSyncLen = 2U; pVInfo->mInfo.vFrontPorch = 7U; pVInfo->vencDivisorInfo.divisorLCD = 1; pVInfo->vencDivisorInfo.divisorPCD = 1; } else UTILS_assert(NULL); /* Configure LCD - 1 overlay params */ pVInfo->mode = 0; pVInfo->isInputPipeConnected[0] = FALSE; pVInfo->isInputPipeConnected[1] = TRUE; pVInfo->isInputPipeConnected[2] = FALSE; pVInfo->isInputPipeConnected[3] = FALSE; pVInfo->writeBackEnabledFlag = FALSE; pVInfo->vencOutputInfo.dataFormat = SYSTEM_DF_RGB16_565; pVInfo->vencOutputInfo.dvoFormat = SYSTEM_DCTRL_DVOFMT_GENERIC_DISCSYNC; pVInfo->vencOutputInfo.videoIfWidth = SYSTEM_VIFW_16BIT; pVInfo->vencOutputInfo.pixelClkPolarity = SYSTEM_DCTRL_POLARITY_ACT_LOW; pVInfo->vencOutputInfo.aFmt = SYSTEM_DCTRL_A_OUTPUT_MAX; pOvlyPrms = &ovlyPrms[1]; pOvlyPrms->vencId = pVInfo->vencId; pOvlyPrms->deltaLinesPerPanel = 0; pOvlyPrms->alphaBlenderEnable = 0; pOvlyPrms->backGroundColor = 0x0; pOvlyPrms->colorKeyEnable = 1; pOvlyPrms->colorKeySel = SYSTEM_DSS_DISPC_TRANS_COLOR_KEY_SRC; pOvlyPrms->ovlyOptimization = SYSTEM_DSS_DISPC_OVLY_FETCH_ALLDATA; pOvlyPrms->transColorKey = DRAW2D_TRANSPARENT_COLOR; /* Configure LCD - 2 */ pVInfo = &pPrm->vencInfo[2]; pVInfo->vencId = SYSTEM_DCTRL_DSS_VENC_LCD2; pVInfo->outputPort = SYSTEM_DCTRL_DSS_DPI2_OUTPUT; if ((BSP_PLATFORM_SOC_ID_TDA2EX == Bsp_platformGetSocId()) && (BSP_PLATFORM_PACKAGE_TYPE_17x17 == Bsp_platformGetPackageType())) { /* In case of TDA2EX and Package is 17 X 17, LCD is on DPI 3 */ pVInfo->vencId = SYSTEM_DCTRL_DSS_VENC_LCD3; pVInfo->outputPort = SYSTEM_DCTRL_DSS_DPI3_OUTPUT; } pVInfo->vencOutputInfo.vsPolarity = SYSTEM_DCTRL_POLARITY_ACT_LOW; pVInfo->vencOutputInfo.hsPolarity = SYSTEM_DCTRL_POLARITY_ACT_LOW; /* Below are of dont care for EVM LCD */ pVInfo->vencOutputInfo.fidPolarity = SYSTEM_DCTRL_POLARITY_ACT_HIGH; pVInfo->vencOutputInfo.actVidPolarity = SYSTEM_DCTRL_POLARITY_ACT_HIGH; pVInfo->mInfo.standard = SYSTEM_STD_CUSTOM; pVInfo->mInfo.scanFormat = SYSTEM_SF_PROGRESSIVE; pVInfo->mInfo.width = displayLCD2Width; pVInfo->mInfo.height = displayLCD2Height; if(lcdType == CHAINS_DISPLAY_TYPE_LCD_7_INCH) { pVInfo->mInfo.pixelClock = 29232u; pVInfo->mInfo.fps = 60U; pVInfo->mInfo.hFrontPorch = 40u; pVInfo->mInfo.hBackPorch = 40u; pVInfo->mInfo.hSyncLen = 48u; pVInfo->mInfo.vFrontPorch = 13u; pVInfo->mInfo.vBackPorch = 29u; pVInfo->mInfo.vSyncLen = 3u; pVInfo->vencDivisorInfo.divisorLCD = 1; pVInfo->vencDivisorInfo.divisorPCD = 4; } else if(lcdType == CHAINS_DISPLAY_TYPE_LCD_10_INCH) { pVInfo->mInfo.pixelClock = 74500U; pVInfo->mInfo.fps = 60U; pVInfo->mInfo.hBackPorch = 80U; pVInfo->mInfo.hSyncLen = 62U; pVInfo->mInfo.hFrontPorch = 48U; pVInfo->mInfo.vBackPorch = 12U; pVInfo->mInfo.vSyncLen = 35U; pVInfo->mInfo.vFrontPorch = 6U; pVInfo->vencDivisorInfo.divisorLCD = 1; pVInfo->vencDivisorInfo.divisorPCD = 1; } else if (lcdType == CHAINS_DISPLAY_TYPE_LDC_10_INCH_LCDCTRL_TC358778_MIPI_DSI_1920_1200) { pVInfo->mInfo.pixelClock = 147000U; pVInfo->mInfo.fps = 60U; pVInfo->mInfo.hBackPorch = 30U; pVInfo->mInfo.hSyncLen = 16U; pVInfo->mInfo.hFrontPorch = 32U; pVInfo->mInfo.vBackPorch = 16U; pVInfo->mInfo.vSyncLen = 2U; pVInfo->mInfo.vFrontPorch = 7U; pVInfo->vencDivisorInfo.divisorLCD = 1; pVInfo->vencDivisorInfo.divisorPCD = 1; } else UTILS_assert(NULL); /* Configure LCD - 2 overlay params */ pVInfo->mode = 0; pVInfo->isInputPipeConnected[0] = FALSE; pVInfo->isInputPipeConnected[1] = FALSE; pVInfo->isInputPipeConnected[2] = TRUE; pVInfo->isInputPipeConnected[3] = FALSE; pVInfo->writeBackEnabledFlag = FALSE; pVInfo->vencOutputInfo.dataFormat = SYSTEM_DF_RGB16_565; pVInfo->vencOutputInfo.dvoFormat = SYSTEM_DCTRL_DVOFMT_GENERIC_DISCSYNC; pVInfo->vencOutputInfo.videoIfWidth = SYSTEM_VIFW_16BIT; pVInfo->vencOutputInfo.pixelClkPolarity = SYSTEM_DCTRL_POLARITY_ACT_LOW; pVInfo->vencOutputInfo.aFmt = SYSTEM_DCTRL_A_OUTPUT_MAX; pOvlyPrms = &ovlyPrms[2]; pOvlyPrms->vencId = pVInfo->vencId; pOvlyPrms->deltaLinesPerPanel = 0; pOvlyPrms->alphaBlenderEnable = 0; pOvlyPrms->backGroundColor = 0x0; pOvlyPrms->colorKeyEnable = 1; pOvlyPrms->colorKeySel = SYSTEM_DSS_DISPC_TRANS_COLOR_KEY_SRC; pOvlyPrms->ovlyOptimization = SYSTEM_DSS_DISPC_OVLY_FETCH_ALLDATA; pOvlyPrms->transColorKey = DRAW2D_TRANSPARENT_COLOR; /* Setting HDMI overlay pipe parameters */ pPipeOvlyPrms = &gChains_commonObj.pipeParams[0]; pPipeOvlyPrms->pipeLine = SYSTEM_DSS_DISPC_PIPE_VID1; pPipeOvlyPrms->globalAlpha = 0xFF; pPipeOvlyPrms->preMultiplyAlpha = 0; pPipeOvlyPrms->zorderEnable = TRUE; pPipeOvlyPrms->zorder = SYSTEM_DSS_DISPC_ZORDER0; /* Setting LCD - 1 overlay pipe parameters */ pPipeOvlyPrms = &gChains_commonObj.pipeParams[1]; pPipeOvlyPrms->pipeLine = SYSTEM_DSS_DISPC_PIPE_VID2; pPipeOvlyPrms->globalAlpha = 0xFF; pPipeOvlyPrms->preMultiplyAlpha = 0; pPipeOvlyPrms->zorderEnable = TRUE; pPipeOvlyPrms->zorder = SYSTEM_DSS_DISPC_ZORDER0; /* Setting LCD - 2 overlay pipe parameters */ pPipeOvlyPrms = &gChains_commonObj.pipeParams[2]; pPipeOvlyPrms->pipeLine = SYSTEM_DSS_DISPC_PIPE_VID3; pPipeOvlyPrms->globalAlpha = 0xFF; pPipeOvlyPrms->preMultiplyAlpha = 0; pPipeOvlyPrms->zorderEnable = TRUE; pPipeOvlyPrms->zorder = SYSTEM_DSS_DISPC_ZORDER0; /* Configure graphics overlay for HDMI */ pPipeOvlyPrms = &gChains_commonObj.pipeParams[3]; pPipeOvlyPrms->pipeLine = SYSTEM_DSS_DISPC_PIPE_GFX1; pPipeOvlyPrms->globalAlpha = 0xFF; pPipeOvlyPrms->preMultiplyAlpha = 0; pPipeOvlyPrms->zorderEnable = TRUE; pPipeOvlyPrms->zorder = SYSTEM_DSS_DISPC_ZORDER3; /* Create, configure and start the Display Ctrl link */ status = System_linkCreate(gChains_commonObj.displayCtrlLinkId, NULL, 0); UTILS_assert(status == SYSTEM_LINK_STATUS_SOK); status = System_linkControl(gChains_commonObj.displayCtrlLinkId, DISPLAYCTRL_LINK_CMD_SET_CONFIG, &gChains_commonObj.dctrlCfgPrms, sizeof(DisplayCtrlLink_ConfigParams), TRUE); UTILS_assert(status == SYSTEM_LINK_STATUS_SOK); status = System_linkControl(gChains_commonObj.displayCtrlLinkId, DISPLAYCTRL_LINK_CMD_SET_OVLY_PARAMS, &ovlyPrms[0], sizeof(DisplayCtrlLink_OvlyParams), TRUE); UTILS_assert(status == SYSTEM_LINK_STATUS_SOK); status = System_linkControl(gChains_commonObj.displayCtrlLinkId, DISPLAYCTRL_LINK_CMD_SET_OVLY_PARAMS, &ovlyPrms[1], sizeof(DisplayCtrlLink_OvlyParams), TRUE); UTILS_assert(status == SYSTEM_LINK_STATUS_SOK); status = System_linkControl(gChains_commonObj.displayCtrlLinkId, DISPLAYCTRL_LINK_CMD_SET_OVLY_PARAMS, &ovlyPrms[2], sizeof(DisplayCtrlLink_OvlyParams), TRUE); UTILS_assert(status == SYSTEM_LINK_STATUS_SOK); status = System_linkControl(gChains_commonObj.displayCtrlLinkId, DISPLAYCTRL_LINK_CMD_SET_OVLY_PIPELINE_PARAMS, &gChains_commonObj.pipeParams[0], sizeof(DisplayCtrlLink_OvlyPipeParams), TRUE); UTILS_assert(status == SYSTEM_LINK_STATUS_SOK); status = System_linkControl(gChains_commonObj.displayCtrlLinkId, DISPLAYCTRL_LINK_CMD_SET_OVLY_PIPELINE_PARAMS, &gChains_commonObj.pipeParams[1], sizeof(DisplayCtrlLink_OvlyPipeParams), TRUE); UTILS_assert(status == SYSTEM_LINK_STATUS_SOK); status = System_linkControl(gChains_commonObj.displayCtrlLinkId, DISPLAYCTRL_LINK_CMD_SET_OVLY_PIPELINE_PARAMS, &gChains_commonObj.pipeParams[2], sizeof(DisplayCtrlLink_OvlyPipeParams), TRUE); UTILS_assert(status == SYSTEM_LINK_STATUS_SOK); status = System_linkControl(gChains_commonObj.displayCtrlLinkId, DISPLAYCTRL_LINK_CMD_SET_OVLY_PIPELINE_PARAMS, &gChains_commonObj.pipeParams[3], sizeof(DisplayCtrlLink_OvlyPipeParams), TRUE); UTILS_assert(status == SYSTEM_LINK_STATUS_SOK); return status; }
pinmux_details.zipHi Brijesh,
As per our discussion over the call, we have configured the pinmux for the DPI2 and DPI3. Below is some explanation for your reference.
We have run the "lvdsVipDualCam_DualDisplay" use case for checking the pinmux for DPI1, DPI2 and DPI3.
First we check the Individual LCD by connecting it First at DPI1 then DPI2 and last DPI3.
In this use case, we get the proper output on the LCD.
Also we print the register value as per your susggestion.
(Attached File for your reference DPI1_pinmux.txt, DPI2_pinmux.txt, DPI3_pinmux.txt)
Then second we run the "lvdsVipDualCam_DualDisplay" use case with the connecting all LCD at DP1,DPI2 and DPI3.
This time we have configured the pinmux for all and also print the register value to check it.
But we do not get the output on all LCD Display. Output come only on one LCD Display.
In this case also we print the register value to compare it with previous case.
(Attached File for your reference DPI1_DPI2_DPI3_pinmux_multiple.txt)
we have found that register value for Indivudal and multipal LCD aree same.
There is not change in any register value but LCD Output not come when we connect all LCD.
Please provided your inputs to resolve this issue.
Regards,
Yash