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;
}
请相关高手帮忙解答一下,感激不尽!
由于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能分享一下吗?
问题解决了吗?我也是这个问题
