Earlier related tickets :https://e2e.ti.com/support/processors/f/791/t/889397
In the above ticket for 2 separate variants with single display, the LCD2 output is using HDMI clock source
But now we have a different variant that requires 2 displays on LCD2 and LCD3. Both are currently configured for same type of display(800*480) with the same pixel clock.
Usecase file path: vision_sdk/apps/src/rtos/usecases/weston_coach_display
UseCase: weston_coach_display
Capture -> Display_Video
DispDistSrc_weston -> Display_m4
DispDistSrc_vid2 -> Display_vid2
DispDistSrc_vid3 -> Display_vid3
Capture_dsswb -> Alg_SwCrc
Chains common looks like this:
Int32 ChainsCommon_DualDisplay_StartDisplayCtrl(
Chains_DisplayType lcdType, UInt32 displayLCDWidth, UInt32 displayLCDHeight)
{
Int32 status;
DisplayCtrlLink_ConfigParams *pPrm = &gChains_commonObj.dctrlCfgPrms;
DisplayCtrlLink_VencInfo *pVInfo;
DisplayCtrlLink_OvlyParams *pOvlyPrms;
// DisplayCtrlLink_OvlyPipeParams *pPipeOvlyPrms;
DisplayCtrlLink_OvlyPipeParams *pPipeOvlyPrms;
//pipeOvlyPrms
DisplayCtrlLink_OvlyParams ovlyPrms[2];
/* Set the link id */
gChains_commonObj.displayCtrlLinkId = SYSTEM_LINK_ID_DISPLAYCTRL;
/* Number of valid entries in vencInfo array */
pPrm->numVencs = 2;
/* 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;
/* Ist Display */
if(lcdType == CHAINS_DISPLAY_TYPE_LCD_7_INCH)
{
pPrm->deviceId = DISPLAYCTRL_LINK_USE_LCD;
pVInfo = &pPrm->vencInfo[0];
pVInfo->vencId = SYSTEM_DCTRL_DSS_VENC_LCD3;
pVInfo->outputPort = SYSTEM_DCTRL_DSS_DPI3_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_HIGH;
pVInfo->vencOutputInfo.actVidPolarity = SYSTEM_DCTRL_POLARITY_ACT_HIGH;
pVInfo->mInfo.standard = SYSTEM_STD_CUSTOM;
pVInfo->mInfo.width = displayLCDWidth;
pVInfo->mInfo.height = displayLCDHeight;
pVInfo->mInfo.scanFormat = SYSTEM_SF_PROGRESSIVE;
pOvlyPrms = &ovlyPrms[0];
pOvlyPrms->vencId = pVInfo->vencId;
pOvlyPrms->deltaLinesPerPanel = 0;
pOvlyPrms->alphaBlenderEnable = 0;
pOvlyPrms->backGroundColor = 0x10;
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;
pVInfo->mInfo.pixelClock = 25400u;
pVInfo->mInfo.fps = 60U;
pVInfo->mInfo.hFrontPorch = 32u;
pVInfo->mInfo.hBackPorch = 32u;
pVInfo->mInfo.hSyncLen = 7u; /* 2u */
pVInfo->mInfo.vFrontPorch = 5u;
pVInfo->mInfo.vBackPorch = 5u;
pVInfo->mInfo.vSyncLen = 2u;
pVInfo->vencDivisorInfo.divisorLCD = 1;
pVInfo->vencDivisorInfo.divisorPCD = 1;
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;
................
/* 2nd Display settings */
pVInfo = &pPrm->vencInfo[1];
/* In case of TDA2EX and Package is 17 X 17, LCD is on DPI 3 */
pVInfo->vencId = SYSTEM_DCTRL_DSS_VENC_LCD2;
pVInfo->outputPort = SYSTEM_DCTRL_DSS_DPI2_OUTPUT;
.........
Remaining values are same as 1st display.
The display-Ctrl looks as given below where both LCD2 & LCD3 displays are using PLL_VIDEO1 & BSP_PLATFORM_CLKSRC_DPLL_VIDEO1_CLKOUT3 :
/**
*******************************************************************************
*
* \brief Configures the clock source and Video PLL
*
* \param vencId [IN] Venc ID.
* \param pixelClock [IN] Pixel CLock Value.
* \param divisorPCD [IN] Pixel clock divisor value.
*
*******************************************************************************
*/
void DisplayCtrlLink_configureVideoPllAndClkSrcForLCD(
UInt32 vencId, UInt32 pixelClock,UInt32 divisorPCD)
{
Bsp_PlatformSetPllFreq vPllCfg;
Bsp_PlatformVencSrc vencClkCfg;
Int32 status = SYSTEM_LINK_STATUS_SOK;
/*
* For LCD resolution 800x480@60fps pixelClock = 29.232Mhz
* PixelCLock is computed as follows -
* No. of pixels per frame = (800 + H blanking) * (480 + Vertical blanking
* = 928*525 = 487200
*For 60fps i.e 60 * 487200 = 29232000. i.e 29232 KHz.
*/
vPllCfg.videoPll = BSP_PLATFORM_PLL_VIDEO1;
if(Bsp_platformIsTda3xxFamilyBuild())
{
vPllCfg.videoPll = BSP_PLATFORM_PLL_EVE_VID_DSP;
}
/*
* HPixel clock to be configured. based on the PCD divisor.
* This is the value for which the VideoPLL can lock.
* TODO: Currently from usecase divisor is being set as 4. This is due to a
* defect in BSP - PLL not locking for 29232 * 1. Once this issue is
* resolved divisorPCD can be set to 1
*/
vPllCfg.pixelClk = pixelClock * divisorPCD;
vPllCfg.chooseMaxorMinMN = (UInt32) BSP_PLATFORM_VIDEO_PLL_CALC_MAX_MN;
status = Bsp_platformSetPllFreq(&vPllCfg);
UTILS_assert (status == SYSTEM_LINK_STATUS_SOK);
switch(vencId)
{
case SYSTEM_DCTRL_DSS_VENC_LCD1:
case SYSTEM_DCTRL_DSS_VENC_SDTV:
vencClkCfg.outputVenc = BSP_PLATFORM_VENC_LCD1;
vencClkCfg.vencClkSrc = BSP_PLATFORM_CLKSRC_DPLL_VIDEO1_CLKOUT1;
if(Bsp_platformIsTda3xxFamilyBuild())
{
vencClkCfg.vencClkSrc = BSP_PLATFORM_CLKSRC_DPLL_EVE_VID_DSP;
}
break;
case SYSTEM_DCTRL_DSS_VENC_LCD2:
vencClkCfg.outputVenc = BSP_PLATFORM_VENC_LCD2;
vencClkCfg.vencClkSrc = BSP_PLATFORM_CLKSRC_DPLL_VIDEO1_CLKOUT3;
break;
case SYSTEM_DCTRL_DSS_VENC_LCD3:
vencClkCfg.outputVenc = BSP_PLATFORM_VENC_LCD3;
vencClkCfg.vencClkSrc = BSP_PLATFORM_CLKSRC_DPLL_VIDEO1_CLKOUT3;
break;
default:
UTILS_assert((Bool)0U);
break;
}
status = Bsp_platformSetVencClkSrc(&vencClkCfg);
UTILS_assert (status == SYSTEM_LINK_STATUS_SOK);
}
NEW REQUIREMENT: Now we want to configure LCD3 with different values like pixel-clock as shown below:
Chains_common.c:
Int32 ChainsCommon_DualDisplay_StartDisplayCtrl(
Chains_DisplayType lcdType, UInt32 displayLCDWidth, UInt32 displayLCDHeight)
{
Int32 status;
DisplayCtrlLink_ConfigParams *pPrm = &gChains_commonObj.dctrlCfgPrms;
DisplayCtrlLink_VencInfo *pVInfo;
DisplayCtrlLink_OvlyParams *pOvlyPrms;
// DisplayCtrlLink_OvlyPipeParams *pPipeOvlyPrms;
DisplayCtrlLink_OvlyPipeParams *pPipeOvlyPrms;
//pipeOvlyPrms
DisplayCtrlLink_OvlyParams ovlyPrms[2];
/* Set the link id */
gChains_commonObj.displayCtrlLinkId = SYSTEM_LINK_ID_DISPLAYCTRL;
/* Number of valid entries in vencInfo array */
pPrm->numVencs = 2;
/* 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;
UInt32 passengerDisplayWidth = 1280u;
UInt32 passengerDisplayHeight = 720u;
.......
/* Ist Display */
pPrm->deviceId = DISPLAYCTRL_LINK_USE_LCD;
pVInfo = &pPrm->vencInfo[0];
pVInfo->vencId = SYSTEM_DCTRL_DSS_VENC_LCD3;
pVInfo->outputPort = SYSTEM_DCTRL_DSS_DPI3_OUTPUT;
Vps_printf("ChainsCommon_DualDisplay_StartDisplayCtrl(): Passenger-Display 1280*720 Passenger-Display Specs used\n");
pVInfo->mInfo.pixelClock = 74250u;
pVInfo->mInfo.fps = 60U;
pVInfo->mInfo.hFrontPorch = 110u;
pVInfo->mInfo.hBackPorch = 220u;
pVInfo->mInfo.hSyncLen = 40u;
pVInfo->mInfo.vFrontPorch = 5u;
pVInfo->mInfo.vBackPorch = 20u;
pVInfo->mInfo.vSyncLen = 5u;
....................
/* 2nd Display settings */
pVInfo = &pPrm->vencInfo[1];
/* In case of TDA2EX and Package is 17 X 17, LCD is on DPI 3 */
pVInfo->vencId = SYSTEM_DCTRL_DSS_VENC_LCD2;
pVInfo->outputPort = SYSTEM_DCTRL_DSS_DPI2_OUTPUT;
......// Second display LCD2 specs remain as earlier.
Logs:
Vps_printf("\nDISPLAYCTRL: vencId=%u, pixelClock=%u !!!\n",pVencInfo->vencId, pixelClock);
DisplayCtrlLink_configureVideoPllAndClkSrcForLCD(vencDivisors.vencId,
pixelClock, vencDivisors.divisorPCD);
[0][ 0.648] DISPLAYCTRL: vencId=4, pixelClock=89400 !!!
[0][ 0.648] 5.860428 s:
[0][ 0.648] DISPLAYCTRL: DisplayCtrlLink_configureVideoPllAndClkSrcForLCD vencId=4, pixelClock=89400, divisorPCD=1 !!! /// LCD3
[0][ 0.651] 5.863325 s:
[0][ 0.651] DISPLAYCTRL: vencId=2, pixelClock=25400 !!!
[0][ 0.651] 5.863569 s:
[0][ 0.651] DISPLAYCTRL: DisplayCtrlLink_configureVideoPllAndClkSrcForLCD vencId=2, pixelClock=25400, divisorPCD=1 !!! /// LCD2
PROBLEM: We measured using oscilloscope that the pixel-clock on LCD3 is still set same value as LCD2 i.e. 25400u.
QUERIES:
1. Why is the pixel-clock of LCD3 is still set same value as LCD2 i.e. 25400u?
2. Is the Bitmask of tied vencs being set to 0 correct?
3. Like earlier variants in ticket https://e2e.ti.com/support/processors/f/791/t/889397, will it help if we use HDMI clock source for both LCD2 & LCD3 instead of currently used PLL_VIDEO1 & BSP_PLATFORM_CLKSRC_DPLL_VIDEO1_CLKOUT3?