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.

TDA4VM: How to modify the frame rate of EDP interface

Part Number: TDA4VM

I tried the following modification (APP_DCTRL_VID_STD_CUSTOM->APP_DCTRL_VID_STD_1080P_30), but it didn't work!

{
    int32_t retVal = 0;
    uint32_t cpuId = APP_IPC_CPU_MCU2_0;
    bool doAdvVpSetup = false;
    bool doHpd = false;
    app_dctrl_path_info_t pathInfo;
    app_dctrl_vp_params_t vpParams;
    app_dctrl_adv_vp_params_t advVpParams;
    app_dctrl_overlay_params_t overlayParams;
    app_dctrl_layer_params_t layerParams;
    app_dctrl_dsi_params_t dsiParams;

    appDctrlPathInfoInit(&pathInfo);
    appDctrlVpParamsInit(&vpParams);
    appDctrlOverlayParamsInit(&overlayParams);
    appDctrlLayerParamsInit(&layerParams);
    if(obj->initPrm.display_type==APP_DSS_DEFAULT_DISPLAY_TYPE_EDP)
    {
        appDctrlAdvVpParamsInit(&advVpParams);
        doAdvVpSetup = true;
        doHpd = true;
    }
    if(obj->initPrm.display_type==APP_DSS_DEFAULT_DISPLAY_TYPE_DSI)
    {
        appDctrlAdvVpParamsInit(&advVpParams);
        advVpParams.vpId = obj->vpId;
        doAdvVpSetup = true;
    }

    pathInfo.edgeInfo[pathInfo.numEdges].startNode = APP_DCTRL_NODE_VID1;
    pathInfo.edgeInfo[pathInfo.numEdges].endNode   = obj->nodeOverlayId;
    pathInfo.numEdges++;
    pathInfo.edgeInfo[pathInfo.numEdges].startNode = APP_DCTRL_NODE_VID2;
    pathInfo.edgeInfo[pathInfo.numEdges].endNode   = obj->nodeOverlayId;
    pathInfo.numEdges++;
    pathInfo.edgeInfo[pathInfo.numEdges].startNode = APP_DCTRL_NODE_VIDL1;
    pathInfo.edgeInfo[pathInfo.numEdges].endNode   = obj->nodeOverlayId;
    pathInfo.numEdges++;
    pathInfo.edgeInfo[pathInfo.numEdges].startNode = obj->nodeOverlayId;
    pathInfo.edgeInfo[pathInfo.numEdges].endNode   = obj->nodeVpId;
    pathInfo.numEdges++;
    pathInfo.edgeInfo[pathInfo.numEdges].startNode = obj->nodeVpId;
    pathInfo.edgeInfo[pathInfo.numEdges].endNode   = obj->nodeDpiId;
    pathInfo.numEdges++;

    vpParams.vpId             = obj->vpId;

    /* Always expect the app to provide a custom resolution */
    vpParams.standard     = APP_DCTRL_VID_STD_1080P_30//APP_DCTRL_VID_STD_CUSTOM;

    vpParams.width        = obj->initPrm.timings.width;
    vpParams.height       = obj->initPrm.timings.height;
    vpParams.hFrontPorch  = obj->initPrm.timings.hFrontPorch;
    vpParams.hBackPorch   = obj->initPrm.timings.hBackPorch;
    vpParams.hSyncLen     = obj->initPrm.timings.hSyncLen;
    vpParams.vFrontPorch  = obj->initPrm.timings.vFrontPorch;
    vpParams.vBackPorch   = obj->initPrm.timings.vBackPorch;
    vpParams.vSyncLen     = obj->initPrm.timings.vSyncLen;
    vpParams.pixelClock   = (uint32_t)(obj->initPrm.timings.pixelClock / 1000ULL);

    vpParams.videoIfWidth     = obj->videoIfWidth;
    if(obj->initPrm.display_type==APP_DSS_DEFAULT_DISPLAY_TYPE_EDP)
    {
        advVpParams.hVAlign = APP_DCTRL_HVSYNC_ALIGN_ON;
        advVpParams.hVClkControl = APP_DCTRL_HVCLK_CTRL_ON;
        advVpParams.hVClkRiseFall = APP_DCTRL_EDGE_POL_RISING;

        vpParams.actVidPolarity = APP_DCTRL_POL_HIGH;
        vpParams.pixelClkPolarity = APP_DCTRL_EDGE_POL_RISING;
        vpParams.hsPolarity = APP_DCTRL_POL_HIGH;
        vpParams.vsPolarity = APP_DCTRL_POL_HIGH;
    }
    else if(obj->initPrm.display_type==APP_DSS_DEFAULT_DISPLAY_TYPE_DSI)
    {
        advVpParams.hVAlign = APP_DCTRL_HVSYNC_ALIGN_ON;

        vpParams.actVidPolarity = APP_DCTRL_POL_HIGH;
        vpParams.pixelClkPolarity = APP_DCTRL_EDGE_POL_RISING;
        vpParams.hsPolarity = APP_DCTRL_POL_LOW;
        vpParams.vsPolarity = APP_DCTRL_POL_LOW;
    }
    else
    {
        vpParams.pixelClkPolarity = APP_DCTRL_EDGE_POL_FALLING;
    }

    overlayParams.overlayId = obj->overlayId;
    overlayParams.colorKeyEnable = 1;
    overlayParams.colorKeySel = APP_DCTRL_OVERLAY_TRANS_COLOR_SRC;
    overlayParams.transColorKeyMin = 0x0u;
    overlayParams.transColorKeyMax = 0x0u;
    overlayParams.backGroundColor = 0x0u;

    layerParams.overlayId = obj->overlayId;
    layerParams.pipeLayerNum[APP_DSS_VID_PIPE_ID_VID1] = APP_DCTRL_OVERLAY_LAYER_NUM_0;
    layerParams.pipeLayerNum[APP_DSS_VID_PIPE_ID_VID2] = APP_DCTRL_OVERLAY_LAYER_NUM_1;
    /* VIDL1 this is graphics overlay layer and it MUST be top most layer, i.e layer num 4 in j721e */
    layerParams.pipeLayerNum[APP_DSS_VID_PIPE_ID_VIDL1] = APP_DCTRL_OVERLAY_LAYER_NUM_4;
    /* this is used by Linux on A72 so should be kept as disabled or invalid here */
    layerParams.pipeLayerNum[APP_DSS_VID_PIPE_ID_VIDL2] = APP_DCTRL_OVERLAY_LAYER_INVALID;

    retVal = appRemoteServiceRun(cpuId, APP_DCTRL_REMOTE_SERVICE_NAME, APP_DCTRL_CMD_REGISTER_HANDLE, &doHpd, sizeof(doHpd), 0U);
    if(obj->initPrm.display_type==APP_DSS_DEFAULT_DISPLAY_TYPE_DSI)
    {
        /* Only two lanes output supported for AOU LCD */
        dsiParams.num_lanes = 2u;
        retVal+= appRemoteServiceRun(cpuId, APP_DCTRL_REMOTE_SERVICE_NAME, APP_DCTRL_CMD_SET_DSI_PARAMS, &dsiParams, sizeof(app_dctrl_dsi_params_t), 0U);
    }

    retVal+= appRemoteServiceRun(cpuId, APP_DCTRL_REMOTE_SERVICE_NAME, APP_DCTRL_CMD_SET_PATH, &pathInfo, sizeof(pathInfo), 0U);
    retVal+= appRemoteServiceRun(cpuId, APP_DCTRL_REMOTE_SERVICE_NAME, APP_DCTRL_CMD_SET_VP_PARAMS, &vpParams, sizeof(vpParams), 0U);
    if(true == doAdvVpSetup)
    {
        retVal+= appRemoteServiceRun(cpuId, APP_DCTRL_REMOTE_SERVICE_NAME, APP_DCTRL_CMD_SET_ADV_VP_PARAMS, &advVpParams, sizeof(advVpParams), 0U);
    }
    retVal+= appRemoteServiceRun(cpuId, APP_DCTRL_REMOTE_SERVICE_NAME, APP_DCTRL_CMD_SET_OVERLAY_PARAMS, &overlayParams, sizeof(overlayParams), 0U);
    retVal+= appRemoteServiceRun(cpuId, APP_DCTRL_REMOTE_SERVICE_NAME, APP_DCTRL_CMD_SET_LAYER_PARAMS, &layerParams, sizeof(layerParams), 0U);

    return retVal;
}