微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > MT6572 DPI屏打上patch后重启

MT6572 DPI屏打上patch后重启

时间:10-02 整理:3721RD 点击:
详细情况如下:
由于lk logo到 kernel logo之间有闪屏,按mtk的要求打上patch,之后发现重启。具体重启的位置在disp_drv_dpi.c的dpi_init函数。
打patch重启前的代码:
static DISP_STATUS dpi_init(UINT32 fbVA, UINT32 fbPA, BOOL isLCMInited)
{
    if (!disp_drv_dpi_init_context())
        return DISP_STATUS_NOT_IMPLEMENTED;
#ifndef MT65XX_NEW_DISP
    init_intermediate_buffers(fbPA);
#else
    {
        struct disp_path_config_struct config = {0};
        
        config.srcModule = DISP_MODULE_OVL;
        config.bgROI.x = 0;
        config.bgROI.y = 0;
        config.bgROI.width = DISP_GetScreenWidth();
        config.bgROI.height = DISP_GetScreenHeight();
        config.bgColor = 0x0;  // background color
        config.pitch = DISP_GetScreenWidth()*2;
        config.srcROI.x = 0;config.srcROI.y = 0;
        config.srcROI.height= DISP_GetScreenHeight();config.srcROI.width= DISP_GetScreenWidth();
        config.ovl_config.source = OVL_LAYER_SOURCE_MEM;
   
        // Disable FB layer (Layer3)
        {
            config.ovl_config.layer = FB_LAYER;
            config.ovl_config.layer_en = 0;
            disp_path_get_mutex();
            disp_path_config_layer(&config.ovl_config);
            disp_path_release_mutex();
            disp_path_wait_reg_update();
        }
        // Disable LK UI layer (Layer2)
        {
            config.ovl_config.layer = FB_LAYER-1;
            config.ovl_config.layer_en = 0;
            disp_path_get_mutex();
            disp_path_config_layer(&config.ovl_config);
            disp_path_release_mutex();
            disp_path_wait_reg_update();
        }
#if 1  // defined(MTK_M4U_SUPPORT)
        // Config FB_Layer port to be physical.
        {
            M4U_PORT_STRUCT portStruct;
            portStruct.ePortID = M4U_PORT_LCD_OVL;     //hardware port ID, defined in M4U_PORT_ID_ENUM
            portStruct.Virtuality = 1;
            portStruct.Security = 0;
            portStruct.domain = 3;     //domain : 0 1 2 3
            portStruct.Distance = 1;
            portStruct.Direction = 0;
            m4u_config_port(&portStruct);
        }
        // Reconfig FB_Layer and enable it.
#endif
        config.ovl_config.layer = FB_LAYER;
        config.ovl_config.layer_en = 1;
        config.ovl_config.fmt = OVL_INPUT_FORMAT_RGB565;
        config.ovl_config.addr = fbPA;
        config.ovl_config.source = OVL_LAYER_SOURCE_MEM;
        config.ovl_config.src_x = 0;
        config.ovl_config.src_y = 0;
        config.ovl_config.src_w = DISP_GetScreenWidth();
        config.ovl_config.src_h = DISP_GetScreenHeight();
        config.ovl_config.dst_x = 0;    // ROI
        config.ovl_config.dst_y = 0;
        config.ovl_config.dst_w = DISP_GetScreenWidth();
        config.ovl_config.dst_h = DISP_GetScreenHeight();
        config.ovl_config.src_pitch = ALIGN_TO(DISP_GetScreenWidth(),32)*2; //pixel number
        config.ovl_config.keyEn = 0;
        config.ovl_config.key = 0xFF;    // color key
        config.ovl_config.aen = 0;     // alpha enable
        config.ovl_config.alpha = 0;
        LCD_LayerSetAddress(FB_LAYER, fbPA);
        LCD_LayerSetFormat(FB_LAYER, LCD_LAYER_FORMAT_RGB565);
        LCD_LayerSetOffset(FB_LAYER, 0, 0);
        LCD_LayerSetSize(FB_LAYER,DISP_GetScreenWidth(),DISP_GetScreenHeight());
        LCD_LayerSetPitch(FB_LAYER, ALIGN_TO(DISP_GetScreenWidth(),32) * 2);
        LCD_LayerEnable(FB_LAYER, TRUE);
        config.dstModule = DISP_MODULE_DPI0;// DISP_MODULE_WDMA1
        config.outFormat = RDMA_OUTPUT_FORMAT_ARGB;
        disp_path_get_mutex();
        disp_path_config(&config);
        disp_bls_config();
        disp_path_release_mutex();
    }
#endif
    init_mipi_pll();
    init_io_pad();
    init_io_driving_current();
    init_lcd();
    if (isLcmInited)
    {
        is_video_mode_running = true;
    }
    init_dpi(isLcmInited);
    if (NULL != lcm_drv->init && !isLcmInited) {
        lcm_drv->init();
    }
    return DISP_STATUS_OK;
}
打patch后重启的代码:
static DISP_STATUS dpi_init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited)
{
    if (!disp_drv_dpi_init_context())
        return DISP_STATUS_NOT_IMPLEMENTED;
    init_mipi_pll();
    init_io_pad();
    init_io_driving_current();
    init_lcd();
    if (isLcmInited)
    {
        is_video_mode_running = true;
    }
    init_dpi(isLcmInited);
    if (NULL != lcm_drv->init && !isLcmInited) {
        lcm_drv->init();
    }
#ifndef MT65XX_NEW_DISP
    init_intermediate_buffers(fbPA);
#else
    {
        struct disp_path_config_struct config = {0};
        
        config.srcModule = DISP_MODULE_OVL;
        config.bgROI.x = 0;
        config.bgROI.y = 0;
        config.bgROI.width = DISP_GetScreenWidth();
        config.bgROI.height = DISP_GetScreenHeight();
        config.bgColor = 0x0;  // background color
        config.pitch = DISP_GetScreenWidth()*2;
        config.srcROI.x = 0;config.srcROI.y = 0;
        config.srcROI.height= DISP_GetScreenHeight();config.srcROI.width= DISP_GetScreenWidth();
        config.ovl_config.source = OVL_LAYER_SOURCE_MEM;
        config.ovl_config.layer = FB_LAYER;
        config.ovl_config.layer_en = 1;
        config.ovl_config.fmt = OVL_INPUT_FORMAT_RGB565;
        config.ovl_config.addr = fbPA;
        config.ovl_config.source = OVL_LAYER_SOURCE_MEM;
        config.ovl_config.src_x = 0;
        config.ovl_config.src_y = 0;
        config.ovl_config.src_w = DISP_GetScreenWidth();
        config.ovl_config.src_h = DISP_GetScreenHeight();
        config.ovl_config.dst_x = 0;    // ROI
        config.ovl_config.dst_y = 0;
        config.ovl_config.dst_w = DISP_GetScreenWidth();
        config.ovl_config.dst_h = DISP_GetScreenHeight();
        config.ovl_config.src_pitch = ALIGN_TO(DISP_GetScreenWidth(),32)*2; //pixel number
        config.ovl_config.keyEn = 0;
        config.ovl_config.key = 0xFF;    // color key
        config.ovl_config.aen = 0;     // alpha enable
        config.ovl_config.alpha = 0;
        config.dstModule = DISP_MODULE_DPI0;
        config.outFormat = RDMA_OUTPUT_FORMAT_ARGB;
        LCD_LayerSetAddress(FB_LAYER, fbPA);
        LCD_LayerSetFormat(FB_LAYER, LCD_LAYER_FORMAT_RGB565);
        LCD_LayerSetOffset(FB_LAYER, 0, 0);
        LCD_LayerSetSize(FB_LAYER,DISP_GetScreenWidth(),DISP_GetScreenHeight());
        LCD_LayerSetPitch(FB_LAYER, ALIGN_TO(DISP_GetScreenWidth(),32) * 2);
        LCD_LayerEnable(FB_LAYER, TRUE);
        {
            #define TIMECNT  1000000
            unsigned int reg1 = 0, reg2 = 0, reg3 = 0;
            unsigned int timeout_cnt = 0;
            unsigned int irq_mask;
            // dump before modification
            printk("[DISP] pa:0x%x, va:0x%x \n", fbPA, fbVA);  
            
            // enable frame done interrupt
            disp_path_get_mutex();
            OVLEnableIrq(0x2);
            disp_path_release_mutex();
            
            while (timeout_cnt < TIMECNT)
            {
                reg1 = DISP_REG_GET(DISP_REG_OVL_INTSTA);
                reg2 = DISP_REG_GET(DISP_REG_OVL_STA);
                // frame done interrupt
                if (((reg1 & 0x2) == 0x2) && ((reg2 & 0x1) == 0x0))
                {
                    DISP_REG_SET(DISP_REG_OVL_INTSTA, ~reg1);     
                    local_irq_save(irq_mask);
                    disp_path_get_mutex();
                    disp_path_config(&config);
                    disp_path_release_mutex();
                    #if 1  // defined(MTK_M4U_SUPPORT)
                    {
                        M4U_PORT_STRUCT portStruct;
                        
                        portStruct.ePortID = M4U_PORT_LCD_OVL;     //hardware port ID, defined in M4U_PORT_ID_ENUM
                        portStruct.Virtuality = 1;
                        portStruct.Security = 0;
                        portStruct.domain = 3;     //domain : 0 1 2 3
                        portStruct.Distance = 1;
                        portStruct.Direction = 0;
                        m4u_config_port(&portStruct);
                    }
                    // hook m4u debug callback function
                    m4u_set_tf_callback(M4U_CLNTMOD_DISP, &disp_m4u_dump_reg);
                    #endif
                    local_irq_restore(irq_mask);
                    break;
                }
                timeout_cnt++;
            }
            // sw timeout
            if (timeout_cnt >= TIMECNT)
            {
                printk("[DISP] timeout:%d \n", timeout_cnt);  
                ASSERT(0);
            }
            // dump after modification
            printk("[DISP] cnt:%d \n", timeout_cnt);  
        }
    }
#endif
    return DISP_STATUS_OK;
}
请相关高手帮忙解答一下,感激不尽!

你是怎么编译的?
其他地方还改了啥?

我也遇到同样问题。重启原因是(reg1 & 0x2) == 0x2 一直没有这个状态,  导致后面ASSERT(0);
但是还不知道怎么解决DISP_REG_OVL_INTSTA获取寄存器数值的问题。

是的,我现在也是找到这里的问题。

DISP_REG_OVL_INTSTA这个值我现在获取出来是21.。
不知道正确的获取到的是多少。

兄弟,PATCH能分享一下吗?

问题解决了吗?我也是这个问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top