static void DAL_UpdateScreen (BOOL enable, BOOL aen, UINT32 width, UINT32 height) { disp_job *job = disp_deque_job(disp_config.session_id); mutex_lock(&job->lock); job->input[ASSERT_LAYER].layer_id = ASSERT_LAYER; job->input[ASSERT_LAYER].layer_enable = enable; job->input[ASSERT_LAYER].dirty = TRUE; if (enable) { job->input[ASSERT_LAYER].src_x = DAL_WIDTH - width; job->input[ASSERT_LAYER].src_y = 0; job->input[ASSERT_LAYER].dst_x = DAL_WIDTH - width; job->input[ASSERT_LAYER].dst_y = 0; job->input[ASSERT_LAYER].width = width; job->input[ASSERT_LAYER].height = height; job->input[ASSERT_LAYER].pitch = DAL_PITCH * DAL_BPP; job->input[ASSERT_LAYER].format = DAL_FORMAT; job->input[ASSERT_LAYER].address = dal_fb_pa; job->input[ASSERT_LAYER].alpha_enable = aen; if (aen) { job->input[ASSERT_LAYER].alpha = 0x80; } } mutex_unlock(&job->lock); printk("[FB Driver] DAL_UpdateScreen(): id=%d,en=%d,aen=%d,fmt=%d,pitch=%d,w=%d,h=%d\n", ASSERT_LAYER, enable, aen, DP_COLOR_GET_UNIQUE_ID(DAL_FORMAT), (int)(DAL_PITCH * DAL_BPP), width, height); disp_enque_job(disp_config.session_id); if (DISP_IsDecoupleMode()) { DISP_StartOverlayTransfer(); } }
int RDMAConfig(unsigned idx, enum RDMA_MODE mode, DpColorFormat inFormat, unsigned address, enum RDMA_OUTPUT_FORMAT outputFormat, unsigned pitch, unsigned width, unsigned height, bool isByteSwap, /* input setting */ bool isRGBSwap) /* ourput setting */ { unsigned int bpp = 2; unsigned int rgb_swap = 0; unsigned int input_is_yuv = 0; unsigned int output_is_yuv = 0; /* Calculate fifo settings */ unsigned int fifo_pseudo_length = 256; unsigned int fifo_threashold; /* Calculate ultra settings */ unsigned int fps = 60; unsigned int blank_overhead = 115; /* it is 1.15, need to divide 100 later */ unsigned int rdma_fifo_width = 16; /* in unit of byte */ unsigned int ultra_low_time = 6; /* in unit of us */ unsigned int pre_ultra_low_time = 8; /* in unit of us */ unsigned int pre_ultra_high_time = 9; /* in unit of us */ unsigned int consume_levels_per_usec; unsigned int ultra_low_level; unsigned int pre_ultra_low_level; unsigned int pre_ultra_high_level; unsigned int ultra_high_ofs; unsigned int pre_ultra_low_ofs; unsigned int pre_ultra_high_ofs; enum RDMA_INPUT_FORMAT inputFormat; if ((DISP_IsDecoupleMode() == 0) || (gEnableUltra == 1)) { if (gUltraLevel == 0) { ultra_low_time = 4; /* in unit of us */ pre_ultra_low_time = 6; /* in unit of us */ pre_ultra_high_time = 7; /* in unit of us */ } else if (gUltraLevel == 1) { ultra_low_time = 5; /* in unit of us */ pre_ultra_low_time = 7; /* in unit of us */ pre_ultra_high_time = 8; /* in unit of us */ } else if (gUltraLevel == 2) { ultra_low_time = 6; /* in unit of us */ pre_ultra_low_time = 8; /* in unit of us */ pre_ultra_high_time = 9; /* in unit of us */ } } inputFormat = rdma_fmt_convert(inFormat); ASSERT(idx <= 2); if ((width > RDMA_MAX_WIDTH) || (height > RDMA_MAX_HEIGHT)) { DISP_ERR("DDP error, RDMA input overflow, w=%d, h=%d, max_w=%d, max_h=%d\n", width, height, RDMA_MAX_WIDTH, RDMA_MAX_HEIGHT); } if (width == 0 || height == 0) { DISP_ERR("DDP error, RDMA input error, w=%d, h=%d, pitch=%d\n", width, height, pitch); ASSERT(width > 0); ASSERT(height > 0); } if (mode == RDMA_MODE_MEMORY) { ASSERT(pitch > 0); ASSERT(address > 0); } switch (inputFormat) { case RDMA_INPUT_FORMAT_YUYV: case RDMA_INPUT_FORMAT_UYVY: case RDMA_INPUT_FORMAT_YVYU: case RDMA_INPUT_FORMAT_VYUY: case RDMA_INPUT_FORMAT_RGB565: bpp = 2; break; case RDMA_INPUT_FORMAT_RGB888: bpp = 3; break; case RDMA_INPUT_FORMAT_ARGB: bpp = 4; break; /* More color format support */ case RDMA_INPUT_FORMAT_BGR565: inputFormat -= RDMA_COLOR_BASE; bpp = 2; rgb_swap = 1; break; case RDMA_INPUT_FORMAT_BGR888: inputFormat -= RDMA_COLOR_BASE; bpp = 3; rgb_swap = 1; break; case RDMA_INPUT_FORMAT_ABGR: inputFormat -= RDMA_COLOR_BASE; bpp = 4; rgb_swap = 1; break; default: DISP_ERR("DDP error, unknown RDMA input format = %d\n", inputFormat); ASSERT(0); } /* OUTPUT_VALID_FIFO_THREASHOLD = min{(DISP_WIDTH+120)*bpp/16, FIFO_PSEUDO_LENGTH} */ fifo_threashold = (width + 120) * bpp / 16; fifo_threashold = fifo_threashold > fifo_pseudo_length ? fifo_pseudo_length : fifo_threashold; /* -------------------------------------------------------- */ /* calculate ultra/pre-ultra setting */ /* to start to issue ultra from fifo having 4us data */ /* to stop to issue ultra until fifo having 6us data */ /* to start to issue pre-ultra from fifo having 6us data */ /* to stop to issue pre-ultra until fifo having 7us data */ /* the sequence is ultra_low < pre_ultra_low < ultra_high < pre_ultra_high */ /* 4us 6us 6us+1level 7us */ /* -------------------------------------------------------- */ consume_levels_per_usec = (width * height * fps * bpp / rdma_fifo_width / 100) * blank_overhead; /* /1000000 for ultra_low_time in unit of us */ ultra_low_level = ultra_low_time * consume_levels_per_usec / 1000000; pre_ultra_low_level = pre_ultra_low_time * consume_levels_per_usec / 1000000; pre_ultra_high_level = pre_ultra_high_time * consume_levels_per_usec / 1000000; pre_ultra_low_ofs = pre_ultra_low_level - ultra_low_level; ultra_high_ofs = 1; pre_ultra_high_ofs = pre_ultra_high_level - pre_ultra_low_level - 1; if ((DISP_IsDecoupleMode() == 0) || (gEnableUltra == 1)) { if (gUltraLevel == 4) { ultra_low_level = 0x6b; pre_ultra_low_ofs = 0xa0; ultra_high_ofs = 1; pre_ultra_high_ofs = 1; } else if (gUltraLevel == 3) { ultra_low_level = 0x6b; pre_ultra_low_ofs = 0x36; ultra_high_ofs = 0x50; pre_ultra_high_ofs = 0x14; } } switch (inputFormat) { case RDMA_INPUT_FORMAT_YUYV: case RDMA_INPUT_FORMAT_UYVY: case RDMA_INPUT_FORMAT_YVYU: case RDMA_INPUT_FORMAT_VYUY: input_is_yuv = 1; break; case RDMA_INPUT_FORMAT_RGB565: case RDMA_INPUT_FORMAT_RGB888: case RDMA_INPUT_FORMAT_ARGB: input_is_yuv = 0; break; default: DISP_ERR("DDP error, unknow input format is %d\n", inputFormat); ASSERT(0); } if (outputFormat == RDMA_OUTPUT_FORMAT_ARGB) output_is_yuv = 0; else output_is_yuv = 1; if (input_is_yuv == 1 && output_is_yuv == 0) { DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_ENABLE, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 1); DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_INT_MTX_SEL, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 0x6); /* set color conversion matrix */ DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_00, coef_rdma_601_y2r[0][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_01, coef_rdma_601_y2r[0][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_02, coef_rdma_601_y2r[0][2]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_10, coef_rdma_601_y2r[1][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_11, coef_rdma_601_y2r[1][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_12, coef_rdma_601_y2r[1][2]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_20, coef_rdma_601_y2r[2][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_21, coef_rdma_601_y2r[2][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_22, coef_rdma_601_y2r[2][2]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD0, coef_rdma_601_y2r[3][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD1, coef_rdma_601_y2r[3][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD2, coef_rdma_601_y2r[3][2]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD0, coef_rdma_601_y2r[4][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD1, coef_rdma_601_y2r[4][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD2, coef_rdma_601_y2r[4][2]); } else if (input_is_yuv == 0 && output_is_yuv == 1) { DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_ENABLE, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 1); DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_INT_MTX_SEL, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 0x2); /* set color conversion matrix */ DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_00, coef_rdma_601_r2y[0][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_01, coef_rdma_601_r2y[0][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_02, coef_rdma_601_r2y[0][2]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_10, coef_rdma_601_r2y[1][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_11, coef_rdma_601_r2y[1][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_12, coef_rdma_601_r2y[1][2]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_20, coef_rdma_601_r2y[2][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_21, coef_rdma_601_r2y[2][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_22, coef_rdma_601_r2y[2][2]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD0, coef_rdma_601_r2y[3][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD1, coef_rdma_601_r2y[3][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_PRE_ADD2, coef_rdma_601_r2y[3][2]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD0, coef_rdma_601_r2y[4][0]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD1, coef_rdma_601_r2y[4][1]); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_CF_POST_ADD2, coef_rdma_601_r2y[4][2]); } else { DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_ENABLE, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 0); DISP_REG_SET_FIELD(SIZE_CON_0_FLD_MATRIX_INT_MTX_SEL, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, 0); } DISP_REG_SET_FIELD(GLOBAL_CON_FLD_MODE_SEL, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_GLOBAL_CON, mode); DISP_REG_SET_FIELD(MEM_CON_FLD_MEM_MODE_INPUT_FORMAT, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_MEM_CON, inputFormat); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_MEM_START_ADDR, address); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_MEM_SRC_PITCH, pitch); DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_INT_ENABLE, 0x3F); DISP_REG_SET_FIELD(SIZE_CON_0_FLD_INPUT_BYTE_SWAP, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, isByteSwap); DISP_REG_SET_FIELD(SIZE_CON_0_FLD_OUTPUT_FORMAT, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, outputFormat); DISP_REG_SET_FIELD(SIZE_CON_0_FLD_OUTPUT_FRAME_WIDTH, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, width); DISP_REG_SET_FIELD(SIZE_CON_0_FLD_OUTPUT_RGB_SWAP, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_0, isRGBSwap || rgb_swap); DISP_REG_SET_FIELD(SIZE_CON_1_FLD_OUTPUT_FRAME_HEIGHT, idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_SIZE_CON_1, height); /* RDMA fifo config */ DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_FIFO_CON, (1 << 31) | (fifo_pseudo_length << 16) | fifo_threashold); /* disp_rdma ultra high setting */ DISP_REG_SET(idx * DISP_INDEX_OFFSET + DISP_REG_RDMA_MEM_GMC_SETTING_0, (pre_ultra_high_ofs << 24) | (ultra_high_ofs << 16) | (pre_ultra_low_ofs << 8) | ultra_low_level); return 0; }
// --------------------------------------------------------------------------- // DBI Display Driver Public Functions // --------------------------------------------------------------------------- static DISP_STATUS dsi_config_ddp(UINT32 fbPA) { struct disp_path_config_struct config = {0}; if (DISP_IsDecoupleMode()) { config.srcModule = DISP_MODULE_RDMA; } else { config.srcModule = DISP_MODULE_OVL; } config.bgROI.x = 0; config.bgROI.y = 0; config.bgROI.width = lcm_params->width; config.bgROI.height = lcm_params->height; config.bgColor = 0x0; // background color config.pitch = lcm_params->width*2; config.srcROI.x = 0;config.srcROI.y = 0; config.srcROI.height= lcm_params->height; config.srcROI.width= lcm_params->width; config.ovl_config.source = OVL_LAYER_SOURCE_MEM; if(lcm_params->dsi.mode != CMD_MODE) { config.ovl_config.layer = DDP_OVL_LAYER_MUN-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 // Disable LK UI layer (Layer2) { config.ovl_config.layer = DDP_OVL_LAYER_MUN-1-1; config.ovl_config.layer_en = 0; // disable LK UI layer anyway //disp_path_get_mutex(); disp_path_config_layer(&config.ovl_config); //disp_path_release_mutex(); //disp_path_wait_reg_update(); } #endif config.ovl_config.layer = DDP_OVL_LAYER_MUN-1; config.ovl_config.layer_en = 1; config.ovl_config.fmt = eRGB565; 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.dst_x = 0; // ROI config.ovl_config.dst_y = 0; config.ovl_config.dst_w = lcm_params->width; config.ovl_config.dst_h = lcm_params->height; config.ovl_config.src_pitch = ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT)*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(DDP_OVL_LAYER_MUN-1, fbPA); LCD_LayerSetFormat(DDP_OVL_LAYER_MUN-1, LCD_LAYER_FORMAT_RGB565); LCD_LayerSetOffset(DDP_OVL_LAYER_MUN-1, 0, 0); LCD_LayerSetSize(DDP_OVL_LAYER_MUN-1,lcm_params->width,lcm_params->height); LCD_LayerSetPitch(DDP_OVL_LAYER_MUN-1, ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT) * 2); LCD_LayerEnable(DDP_OVL_LAYER_MUN-1, TRUE); */ LCD_LayerSetAddress(FB_LAYER, fbPA); LCD_LayerSetFormat(FB_LAYER, eRGB565); LCD_LayerSetOffset(FB_LAYER, 0, 0); LCD_LayerSetSize(FB_LAYER,lcm_params->width,lcm_params->height); LCD_LayerSetPitch(FB_LAYER, ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT) * 2); LCD_LayerEnable(FB_LAYER, TRUE); if(lcm_params->dsi.mode == CMD_MODE) config.dstModule = DISP_MODULE_DSI_CMD;// DISP_MODULE_WDMA1 else config.dstModule = DISP_MODULE_DSI_VDO;// DISP_MODULE_WDMA1 config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; disp_path_config(&config); if(lcm_params->dsi.mode != CMD_MODE) { //DSI_Wait_VDO_Idle(); disp_path_get_mutex(); } // Config FB_Layer port to be physical. { M4U_PORT_STRUCT portStruct; portStruct.ePortID = DISP_OVL_0; //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); } if(lcm_params->dsi.mode != CMD_MODE) { disp_path_release_mutex(); //if(1 == lcm_params->dsi.ufoe_enable) // UFOE_Start(); //DSI_Start(); } printk("%s, config done\n", __func__); return DISP_STATUS_OK; }
// --------------------------------------------------------------------------- // DBI Display Driver Public Functions // --------------------------------------------------------------------------- static DISP_STATUS dsi_config_ddp(UINT32 fbPA) { unsigned long irq_mask; struct disp_path_config_struct config = {0}; if (DISP_IsDecoupleMode()) { config.srcModule = DISP_MODULE_RDMA0; } else { config.srcModule = DISP_MODULE_OVL; } config.bgROI.x = 0; config.bgROI.y = 0; config.bgROI.width = lcm_params->width; config.bgROI.height = lcm_params->height; config.bgColor = 0x0; // background color config.pitch = lcm_params->width*2; config.srcROI.x = 0;config.srcROI.y = 0; config.srcROI.height= lcm_params->height; config.srcROI.width= lcm_params->width; config.ovl_config.source = OVL_LAYER_SOURCE_MEM; config.ovl_config.layer = DDP_OVL_LAYER_MUN-1; config.ovl_config.layer_en = 1; config.ovl_config.fmt = eRGB565; 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.dst_x = 0; // ROI config.ovl_config.dst_y = 0; config.ovl_config.dst_w = lcm_params->width; config.ovl_config.dst_h = lcm_params->height; config.ovl_config.src_pitch = ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT)*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(DDP_OVL_LAYER_MUN-1, fbPA); LCD_LayerSetFormat(DDP_OVL_LAYER_MUN-1, LCD_LAYER_FORMAT_RGB565); LCD_LayerSetOffset(DDP_OVL_LAYER_MUN-1, 0, 0); LCD_LayerSetSize(DDP_OVL_LAYER_MUN-1,lcm_params->width,lcm_params->height); LCD_LayerSetPitch(DDP_OVL_LAYER_MUN-1, ALIGN_TO(lcm_params->width, MTK_FB_ALIGNMENT) * 2); LCD_LayerEnable(DDP_OVL_LAYER_MUN-1, TRUE); if(lcm_params->dsi.mode == CMD_MODE) { config.dstModule = DISP_MODULE_DSI_CMD;// DISP_MODULE_WDMA1 } else { config.dstModule = DISP_MODULE_DSI_VDO;// DISP_MODULE_WDMA1 } config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; if(lcm_params->dsi.mode != CMD_MODE) { DSI_Wait_VDO_Idle(); local_irq_save(irq_mask); disp_path_get_mutex(); } disp_path_config(&config); // 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); } // hook m4u debug callback function m4u_set_tf_callback(M4U_CLNTMOD_DISP, &disp_m4u_dump_reg); if(lcm_params->dsi.mode != CMD_MODE) { disp_path_release_mutex(); DSI_Start(); local_irq_restore(irq_mask); } printk("%s, config done\n", __func__); return DISP_STATUS_OK; }
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 }; if (DISP_IsDecoupleMode()) config.srcModule = DISP_MODULE_RDMA; else 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.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; #if 0 /* Disable all layers. */ /* First disable FB_Layer. */ disp_path_get_mutex(); config.ovl_config.layer = 0; config.ovl_config.layer_en = 0; disp_path_config_layer(&config.ovl_config); config.ovl_config.layer = 1; disp_path_config_layer(&config.ovl_config); config.ovl_config.layer = 2; disp_path_config_layer(&config.ovl_config); config.ovl_config.layer = 3; disp_path_config_layer(&config.ovl_config); disp_path_release_mutex(); disp_path_wait_reg_update(); #endif /* Config FB_Layer port to be virtual. */ { M4U_PORT_STRUCT portStruct; portStruct.ePortID = DISP_OVL_0; /* 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. */ config.ovl_config.layer = FB_LAYER; config.ovl_config.layer_en = 1; config.ovl_config.fmt = eRGB565; 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.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; 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_path_release_mutex(); } #endif init_mipi_pll(); init_io_pad(); init_io_driving_current(); init_lcd(); init_dpi(isLcmInited); if (NULL != lcm_drv->init && !isLcmInited) lcm_drv->init(); DSI_PowerOn(); DSI_PowerOff(); UFOE_PowerOn(); UFOE_PowerOff(); #ifdef SPM_SODI_ENABLED spm_sodi_lcm_video_mode(TRUE); #endif return DISP_STATUS_OK; }
DAL_STATUS DAL_Printf(const char *fmt, ...) { va_list args; uint i; DAL_STATUS ret = DAL_STATUS_OK; printk("%s", __func__); //printk("[MTKFB_DAL] DAL_Printf mfc_handle=0x%08X, fmt=0x%08X\n", mfc_handle, fmt); if (NULL == mfc_handle) return DAL_STATUS_NOT_READY; if (NULL == fmt) return DAL_STATUS_INVALID_ARGUMENT; DAL_LOCK(); mutex_lock(&OverlaySettingMutex); if(isAEEEnabled==0) { printk("[DDP] isAEEEnabled from 0 to 1, ASSERT_LAYER=%d, dal_fb_pa %x\n", ASSERT_LAYER, dal_fb_pa); isAEEEnabled = 1; DAL_Dynamic_Change_FB_Layer(isAEEEnabled); // default_ui_ layer coniig to changed_ui_layer DAL_CHECK_MFC_RET(MFC_Open_Ex(&mfc_handle, dal_fb_addr, DAL_WIDTH, DAL_HEIGHT,DAL_PITCH, DAL_BPP, DAL_FG_COLOR, DAL_BG_COLOR)); //DAL_Clean(); cached_layer_config[ASSERT_LAYER].addr = dal_fb_pa; cached_layer_config[ASSERT_LAYER].alpha = 0x80; cached_layer_config[ASSERT_LAYER].aen = TRUE; cached_layer_config[ASSERT_LAYER].src_pitch = DAL_PITCH * DAL_BPP; cached_layer_config[ASSERT_LAYER].fmt= DAL_FORMAT; cached_layer_config[ASSERT_LAYER].src_x = 0; cached_layer_config[ASSERT_LAYER].src_y = 0; cached_layer_config[ASSERT_LAYER].src_w = DAL_WIDTH; cached_layer_config[ASSERT_LAYER].src_h = DAL_HEIGHT; cached_layer_config[ASSERT_LAYER].dst_x = 0; cached_layer_config[ASSERT_LAYER].dst_y = 0; cached_layer_config[ASSERT_LAYER].dst_w = DAL_WIDTH; cached_layer_config[ASSERT_LAYER].dst_h = DAL_HEIGHT; cached_layer_config[ASSERT_LAYER].layer_en= TRUE; cached_layer_config[ASSERT_LAYER].isDirty = true; atomic_set(&OverlaySettingDirtyFlag, 1); atomic_set(&OverlaySettingApplied, 0); } mutex_unlock(&OverlaySettingMutex); va_start (args, fmt); i = vsprintf(dal_print_buffer, fmt, args); BUG_ON(i>=ARRAY_SIZE(dal_print_buffer)); va_end (args); DAL_CHECK_MFC_RET(MFC_Print(mfc_handle, dal_print_buffer)); flush_cache_all(); /* if (LCD_STATE_POWER_OFF == LCD_GetState()) { ret = DAL_STATUS_LCD_IN_SUSPEND; dal_enable_when_resume = TRUE; goto End; } */ if (down_interruptible(&sem_early_suspend)) { DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "can't get semaphore in DAL_Printf()\n"); goto End; } #if 0 if(is_early_suspended){ up(&sem_early_suspend); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "DAL_Printf in power off\n"); goto End; } #endif up(&sem_early_suspend); mutex_lock(&OverlaySettingMutex); if (!dal_shown) { dal_shown = TRUE; } //DAL enable, switch ui layer from default 3 to 2 atomic_set(&OverlaySettingDirtyFlag, 1); atomic_set(&OverlaySettingApplied, 0); mutex_unlock(&OverlaySettingMutex); if (DISP_IsDecoupleMode()) { DISP_StartOverlayTransfer(); } DAL_CHECK_DISP_RET(DISP_UpdateScreen(0, 0, DAL_WIDTH, DAL_HEIGHT)); End: DAL_UNLOCK(); return ret; }
DAL_STATUS DAL_Clean(void) { const UINT32 BG_COLOR = MAKE_TWO_RGB565_COLOR(DAL_BG_COLOR, DAL_BG_COLOR); DAL_STATUS ret = DAL_STATUS_OK; static int dal_clean_cnt = 0; printk("[MTKFB_DAL] DAL_Clean\n"); if (NULL == mfc_handle) return DAL_STATUS_NOT_READY; // if (LCD_STATE_POWER_OFF == LCD_GetState()) // return DAL_STATUS_LCD_IN_SUSPEND; DAL_LOCK(); DAL_CHECK_MFC_RET(MFC_ResetCursor(mfc_handle)); MFC_CONTEXT *ctxt = (MFC_CONTEXT *)mfc_handle; ctxt->screen_color=0; DAL_SetScreenColor(DAL_COLOR_RED); /* if (LCD_STATE_POWER_OFF == LCD_GetState()) { DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "dal_clean in power off\n"); dal_disable_when_resume = TRUE; ret = DAL_STATUS_LCD_IN_SUSPEND; goto End; } */ if (down_interruptible(&sem_early_suspend)) { DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "can't get semaphore in DAL_Clean()\n"); goto End; } //xuecheng, for debug #if 0 if(is_early_suspended){ up(&sem_early_suspend); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DAL", "dal_clean in power off\n"); goto End; } #endif up(&sem_early_suspend); mutex_lock(&OverlaySettingMutex); //TODO: if dal_shown=false, and 3D enabled, mtkfb may disable UI layer, please modify 3D driver if(isAEEEnabled==1) { cached_layer_config[ASSERT_LAYER].layer_en= FALSE; cached_layer_config[ASSERT_LAYER].isDirty = true; // DAL disable, switch UI layer to default layer 3 printk("[DDP]* isAEEEnabled from 1 to 0, %d \n", dal_clean_cnt++); isAEEEnabled = 0; DAL_Dynamic_Change_FB_Layer(isAEEEnabled); // restore UI layer to DEFAULT_UI_LAYER } dal_shown = FALSE; #ifdef DAL_LOWMEMORY_ASSERT if (dal_lowMemory_shown) {//only need show lowmemory assert UINT32 LOWMEMORY_FG_COLOR = MAKE_TWO_RGB565_COLOR(DAL_LOWMEMORY_FG_COLOR, DAL_LOWMEMORY_FG_COLOR); UINT32 LOWMEMORY_BG_COLOR = MAKE_TWO_RGB565_COLOR(DAL_LOWMEMORY_BG_COLOR, DAL_LOWMEMORY_BG_COLOR); DAL_CHECK_MFC_RET(MFC_LowMemory_Printf(mfc_handle, low_memory_msg, LOWMEMORY_FG_COLOR, LOWMEMORY_BG_COLOR)); Show_LowMemory(); } dal_enable_when_resume_lowmemory = FALSE; dal_disable_when_resume_lowmemory = FALSE; #endif dal_disable_when_resume = FALSE; atomic_set(&OverlaySettingDirtyFlag, 1); atomic_set(&OverlaySettingApplied, 0); mutex_unlock(&OverlaySettingMutex); if (DISP_IsDecoupleMode()) { DISP_StartOverlayTransfer(); } DAL_CHECK_DISP_RET(DISP_UpdateScreen(0, 0, DAL_WIDTH, DAL_HEIGHT)); End: DAL_UNLOCK(); return ret; }