static void init_intermediate_buffers(UINT32 fbPhysAddr) { UINT32 tmpFbStartPA = fbPhysAddr; UINT32 tmpFbPitchInBytes = DISP_GetScreenWidth() * dpiTmpBufBpp; UINT32 tmpFbSizeInBytes = tmpFbPitchInBytes * DISP_GetScreenHeight(); UINT32 i; for (i = 0; i < lcm_params->dpi.intermediat_buffer_num; ++ i) { TempBuffer *b = &s_tmpBuffers[i]; #ifdef BUILD_UBOOT // clean the intermediate buffers as black to prevent from noise display memset(tmpFbStartPA, 0, tmpFbSizeInBytes); #endif b->pitchInBytes = tmpFbPitchInBytes; b->pa = tmpFbStartPA; ASSERT((tmpFbStartPA & 0x7) == 0); // check if 8-byte-aligned tmpFbStartPA += tmpFbSizeInBytes; } }
static DISP_STATUS dsi_init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited) { // DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "%s, line:%d\n", __func__, __LINE__); if (!disp_drv_dsi_init_context()) return DISP_STATUS_NOT_IMPLEMENTED; // DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "%s, line:%d\n", __func__, __LINE__); if(lcm_params->dsi.mode == CMD_MODE) { #ifndef MT65XX_NEW_DISP init_lcd(); #endif init_dsi(isLcmInited); mdelay(1); // DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "%s, line:%d\n", __func__, __LINE__); if (NULL != lcm_drv->init && !isLcmInited) { lcm_drv->init(); DSI_LP_Reset(); } // DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "%s, line:%d\n", __func__, __LINE__); #ifndef MT65XX_NEW_DISP DSI_clk_HS_mode(0); #else DSI_clk_HS_mode(1); #endif // DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", "%s, line:%d\n", __func__, __LINE__); DSI_SetMode(lcm_params->dsi.mode); #ifndef MT65XX_NEW_DISP init_lcd_te_control(); #endif } else { #ifndef MT65XX_NEW_DISP init_intermediate_buffers(fbPA); init_lcd(); init_dpi(isLcmInited); #endif if (!isLcmInited) { DSI_SetMode(0); mdelay(100); DSI_Stop(); } else { is_video_mode_running = true; } init_dsi(isLcmInited); mdelay(1); if (NULL != lcm_drv->init && !isLcmInited) { lcm_drv->init(); DSI_LP_Reset(); } DSI_SetMode(lcm_params->dsi.mode); #ifndef BUILD_UBOOT if(lcm_params->dsi.lcm_ext_te_monitor) { is_video_mode_running = false; LCD_TE_SetMode(LCD_TE_MODE_VSYNC_ONLY); LCD_TE_SetEdgePolarity(LCM_POLARITY_RISING); LCD_TE_Enable(FALSE); } if(lcm_params->dsi.noncont_clock) DSI_set_noncont_clk(false, lcm_params->dsi.noncont_clock_period); if(lcm_params->dsi.lcm_int_te_monitor) DSI_set_int_TE(false, lcm_params->dsi.lcm_int_te_period); #endif } #ifdef MT65XX_NEW_DISP { 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 = ALIGN_TO(DISP_GetScreenWidth(),32)*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.vaddr = fbVA; 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; 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; 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); #if defined(MTK_M4U_EXT_PAGE_TABLE) if(lcm_params->dsi.mode != CMD_MODE) { DSI_Wait_VDO_Idle(); disp_path_get_mutex(); } disp_path_config(&config); #if 1 // 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); #endif if(lcm_params->dsi.mode != CMD_MODE) { disp_path_release_mutex(); DSI_Start(); } #else if(lcm_params->dsi.mode != CMD_MODE){ #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); } else { disp_path_config(&config); #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 } #endif } #endif 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; memset(&config, 0x0, sizeof(config)); config.srcModule = DISP_MODULE_OVL; if(config.srcModule == DISP_MODULE_RDMA) { config.inFormat = RDMA_INPUT_FORMAT_RGB565; config.addr = fbPA; config.pitch = ALIGN_TO(DISP_GetScreenWidth()*2, MTK_FB_ALIGNMENT); config.srcROI.x = 0;config.srcROI.y = 0; config.srcROI.height= DISP_GetScreenHeight();config.srcROI.width= DISP_GetScreenWidth(); } else { 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 1 config.ovl_config.layer = 2; 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.x = 0; // ROI config.ovl_config.y = 0; config.ovl_config.w = DISP_GetScreenWidth(); config.ovl_config.h = DISP_GetScreenHeight(); config.ovl_config.pitch = ALIGN_TO(DISP_GetScreenWidth()*2, MTK_FB_ALIGNMENT); config.ovl_config.keyEn = 0; config.ovl_config.key = 0xff; // color key config.ovl_config.aen = 0; // alpha enable config.ovl_config.alpha = 0; #endif } config.dstModule = DISP_MODULE_DPI0;// DISP_MODULE_WDMA1 if(config.dstModule == DISP_MODULE_DPI0) config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; else config.outFormat = WDMA_OUTPUT_FORMAT_ARGB; disp_path_get_mutex(); disp_path_config(&config); disp_path_release_mutex(); disp_bls_config(); } #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(); return DISP_STATUS_OK; }
static void process_dbg_opt(const char *opt) { if (0 == strncmp(opt, "hdmion", 6)) { hdmi_force_init(); } else if (0 == strncmp(opt, "fps:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { dbg_opt.en_fps_log = 1; } else if (0 == strncmp(opt + 4, "off", 3)) { dbg_opt.en_fps_log = 0; } else { goto Error; } reset_fps_logger(); } else if (0 == strncmp(opt, "tl:", 3)) { if (0 == strncmp(opt + 3, "on", 2)) { dbg_opt.en_touch_latency_log = 1; } else if (0 == strncmp(opt + 3, "off", 3)) { dbg_opt.en_touch_latency_log = 0; } else { goto Error; } } else if (0 == strncmp(opt, "black", 5)) { mtkfb_clear_lcm(); } else if (0 == strncmp(opt, "suspend", 4)) { DISP_PanelEnable(FALSE); DISP_PowerEnable(FALSE); } else if (0 == strncmp(opt, "resume", 4)) { DISP_PowerEnable(TRUE); DISP_PanelEnable(TRUE); } else if (0 == strncmp(opt, "lcm:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { DISP_PanelEnable(TRUE); } else if (0 == strncmp(opt + 4, "off", 3)) { DISP_PanelEnable(FALSE); } else if (0 == strncmp(opt + 4, "init", 4)) { if (NULL != lcm_drv && NULL != lcm_drv->init) { lcm_drv->init(); } }else { goto Error; } } else if (0 == strncmp(opt, "cabc:", 5)) { if (0 == strncmp(opt + 5, "ui", 2)) { mtkfb_set_backlight_mode(1); }else if (0 == strncmp(opt + 5, "mov", 3)) { mtkfb_set_backlight_mode(3); }else if (0 == strncmp(opt + 5, "still", 5)) { mtkfb_set_backlight_mode(2); }else { goto Error; } } else if (0 == strncmp(opt, "lcd:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { DISP_PowerEnable(TRUE); } else if (0 == strncmp(opt + 4, "off", 3)) { DISP_PowerEnable(FALSE); } else { goto Error; } } else if (0 == strncmp(opt, "dbi:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { LCD_PowerOn(); } else if (0 == strncmp(opt + 4, "off", 3)) { LCD_PowerOff(); } else { goto Error; } } else if (0 == strncmp(opt, "dpi:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { DPI_PowerOn(); } else if (0 == strncmp(opt + 4, "off", 3)) { DPI_PowerOff(); } else { goto Error; } } else if (0 == strncmp(opt, "dsi:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { DSI_PowerOn(); } else if (0 == strncmp(opt + 4, "off", 3)) { DSI_PowerOff(); } else { goto Error; } } else if (0 == strncmp(opt, "te:", 3)) { if (0 == strncmp(opt + 3, "on", 2)) { LCD_TE_Enable(TRUE); DSI_TE_Enable(TRUE); } else if (0 == strncmp(opt + 3, "off", 3)) { LCD_TE_Enable(FALSE); DSI_TE_Enable(FALSE); } else { goto Error; } } else if (0 == strncmp(opt, "vsynclog:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { EnableVSyncLog = 1; } else if (0 == strncmp(opt + 9, "off", 3)) { EnableVSyncLog = 0; } else { goto Error; } } else if (0 == strncmp(opt, "layer", 5)) { dump_lcd_layer_info(); } else if (0 == strncmp(opt, "reg:", 4)) { if (0 == strncmp(opt + 4, "lcd", 3)) { LCD_DumpRegisters(); }else if (0 == strncmp(opt + 4, "dpi1", 4)) { DPI1_DumpRegisters(); }else if (0 == strncmp(opt + 4, "dpi", 3)) { DPI_DumpRegisters(); } else if (0 == strncmp(opt + 4, "dsi", 3)) { DSI_DumpRegisters(); #if defined(MTK_TVOUT_SUPPORT) } else if (0 == strncmp(opt + 4, "tvc", 3)) { TVC_DumpRegisters(); } else if (0 == strncmp(opt + 4, "tve", 3)) { TVE_DumpRegisters(); } else if (0 == strncmp(opt + 4, "tvr", 3)) { TVR_DumpRegisters(); #endif } else { goto Error; } } #if defined(MTK_TVOUT_SUPPORT) else if (0 == strncmp(opt, "tv:", 3)) { if (0 == strncmp(opt + 3, "on", 2)) { TVOUT_TvCablePlugIn(); } else if (0 == strncmp(opt +3, "off", 3)) { TVOUT_TvCablePlugOut(); } else { goto Error; } } else if (0 == strncmp(opt, "tvforce:", 8)) { if (0 == strncmp(opt + 8, "on", 2)) { TVOUT_TvCablePlugIn_Directly(); } else if (0 == strncmp(opt +8, "off", 3)) { TVOUT_TvCablePlugOut_Directly(); } else { goto Error; } } else if (0 == strncmp(opt, "tvsys:", 6)) { if (0 == strncmp(opt + 6, "ntsc", 4)) { TVOUT_SetTvSystem(TVOUT_SYSTEM_NTSC); } else if (0 == strncmp(opt + 6, "pal", 3)) { TVOUT_SetTvSystem(TVOUT_SYSTEM_PAL); } else { goto Error; } } else if (0 == strncmp(opt, "tvrot:", 6)) { if (0 == strncmp(opt + 6, "on", 2)) { TVOUT_SetOrientation(TVOUT_ROT_270); } else if (0 == strncmp(opt + 6, "off", 3)) { TVOUT_SetOrientation(TVOUT_ROT_0); } else { goto Error; } } else if (0 == strncmp(opt, "tvcb:", 5)) { if (0 == strncmp(opt + 5, "on", 2)) { TVOUT_EnableColorBar(TRUE); } else if (0 == strncmp(opt + 5, "off", 3)) { TVOUT_EnableColorBar(FALSE); } else { goto Error; } } else if (0 == strncmp(opt, "tvvm:", 5)) { if (0 == strncmp(opt + 5, "on", 2)) { TVOUT_DisableVideoMode(false); } else if (0 == strncmp(opt + 5, "off", 3)) { TVOUT_DisableVideoMode(true); } else { goto Error; } } else if (0 == strncmp(opt, "tvlog:", 6)) { if (0 == strncmp(opt + 6, "on", 2)) { TVOUT_EnableLog(true); } else if (0 == strncmp(opt + 6, "off", 3)) { TVOUT_EnableLog(false); } else { goto Error; } } else if (0 == strncmp(opt, "tvtime:", 7)) { if (0 == strncmp(opt + 7, "on", 2)) { TVOUT_EnableTimeProfiling(true); } else if (0 == strncmp(opt + 7, "off", 3)) { TVOUT_EnableTimeProfiling(false); } else { goto Error; } } else if (0 == strncmp(opt, "tvcap:", 6)) { if (0 == strncmp(opt + 6, "on", 2)) { capture_tv_buffer = true; } else if (0 == strncmp(opt + 6, "off", 3)) { capture_tv_buffer = false; } else { goto Error; } } else if (0 == strncmp(opt, "tvcam:", 6)) { if (0 == strncmp(opt + 6, "on", 2)) { TVOUT_ForceClose(); } else if (0 == strncmp(opt + 6, "off", 3)) { TVOUT_RestoreOpen(); } else { goto Error; } } else if (0 == strncmp(opt, "tvuser:"******"on", 2)) { TVOUT_TurnOn(true); } else if (0 == strncmp(opt + 7, "off", 3)) { TVOUT_TurnOn(false); } else { goto Error; } } else if (0 == strncmp(opt, "tvcoffset:", 10)) { char *p = (char *)opt + 10; unsigned long offset = simple_strtoul(p, &p, 10); TVC_SetCheckLineOffset(offset); } #endif else if (0 == strncmp(opt, "regw:", 5)) { char *p = (char *)opt + 5; unsigned long addr = simple_strtoul(p, &p, 16); unsigned long val = simple_strtoul(p + 1, &p, 16); if (addr) { OUTREG32(addr, val); } else { goto Error; } } else if (0 == strncmp(opt, "regr:", 5)) { char *p = (char *)opt + 5; unsigned int addr = (unsigned int) simple_strtoul(p, &p, 16); if (addr) { DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "Read register 0x%08x: 0x%08x\n", addr, INREG32(addr)); } else { goto Error; } } else if(0 == strncmp(opt, "bkl:", 4)) { char *p = (char *)opt + 4; unsigned int level = (unsigned int) simple_strtoul(p, &p, 10); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "process_dbg_opt(), set backlight level = %d\n", level); DISP_SetBacklight(level); } else if(0 == strncmp(opt, "dither:", 7)) { unsigned lrs, lgs, lbs, dbr, dbg, dbb; char *p = (char *)opt + 7; lrs = (unsigned int) simple_strtoul(p, &p, 16); p++; lgs = (unsigned int) simple_strtoul(p, &p, 16); p++; lbs = (unsigned int) simple_strtoul(p, &p, 16); p++; dbr = (unsigned int) simple_strtoul(p, &p, 16); p++; dbg = (unsigned int) simple_strtoul(p, &p, 16); p++; dbb = (unsigned int) simple_strtoul(p, &p, 16); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "process_dbg_opt(), %d %d %d %d %d %d\n", lrs, lgs, lbs, dbr, dbg, dbb); #if 0 //defined(CONFIG_ARCH_MT6573) LCD_WaitForNotBusy(); LCD_ConfigDither(lrs, lgs, lbs, dbr, dbg, dbb); LCD_StartTransfer(true); #endif } else if (0 == strncmp(opt, "mtkfblog:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { mtkfb_log_enable(true); } else if (0 == strncmp(opt + 9, "off", 3)) { mtkfb_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "displog:", 8)) { if (0 == strncmp(opt + 8, "on", 2)) { disp_log_enable(true); } else if (0 == strncmp(opt + 8, "off", 3)) { disp_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "lcdlog:", 7)) { if (0 == strncmp(opt + 7, "on", 2)) { dbi_log_enable(true); } else if (0 == strncmp(opt + 7, "off", 3)) { dbi_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "dsilog:", 7)) { if (0 == strncmp(opt + 7, "on", 2)) { DSI_Enable_Log(true); } else if (0 == strncmp(opt + 7, "off", 3)) { DSI_Enable_Log(false); } else { goto Error; } } else if (0 == strncmp(opt, "glitchlog:", 10)) { if (0 == strncmp(opt + 10, "on", 2)) { Glitch_Enable_Log(true); } else if (0 == strncmp(opt + 10, "off", 3)) { Glitch_Enable_Log(false); } else { goto Error; } } else if(0 == strncmp(opt, "glitch_times:", 13)) { char *p = (char *)opt + 13; unsigned int level = (unsigned int) simple_strtoul(p, &p, 10); Glitch_times(level); } else if (0 == strncmp(opt, "mtkfb_vsynclog:", 15)) { if (0 == strncmp(opt + 15, "on", 2)) { mtkfb_vsync_log_enable(true); } else if (0 == strncmp(opt + 15, "off", 3)) { mtkfb_vsync_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "dpilog:", 7)) { if (0 == strncmp(opt + 7, "on", 2)) { //dpi_log_enable(true); } else if (0 == strncmp(opt + 7, "off", 3)) { //dpi_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "log:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { mtkfb_log_enable(true); disp_log_enable(true); dbi_log_enable(true); //dpi_log_enable(true); } else if (0 == strncmp(opt + 4, "off", 3)) { mtkfb_log_enable(false); disp_log_enable(false); dbi_log_enable(false); //dpi_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "update", 6)) { DISP_UpdateScreen(0, 0, DISP_GetScreenWidth(), DISP_GetScreenHeight()); } else if (0 == strncmp(opt, "pan_disp", 8)) { mtkfb_pan_disp_test(); } else if (0 == strncmp(opt, "sem_cnt", 7)) { mtkfb_show_sem_cnt(); LCD_GetVsyncCnt(); } else if (0 == strncmp(opt, "hang:", 5)) { if (0 == strncmp(opt + 5, "on", 2)) { mtkfb_hang_test(true); } else if (0 == strncmp(opt + 5, "off", 3)) { mtkfb_hang_test(false); } else{ goto Error; } } #if defined(MTK_M4U_SUPPORT) else if (0 == strncmp(opt, "m4u:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { mtkfb_m4u_switch(true); } else if (0 == strncmp(opt + 4, "off", 3)) { mtkfb_m4u_switch(false); } else if (0 == strncmp(opt + 4, "dump", 4)) { mtkfb_m4u_dump(); } else{ goto Error; } } #endif else if (0 == strncmp(opt, "cpfbonly:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { mtkfb_capture_fb_only(true); } else if (0 == strncmp(opt + 9, "off", 3)) { mtkfb_capture_fb_only(false); } } else if (0 == strncmp(opt, "esd:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { esd_recovery_pause(FALSE); } else if (0 == strncmp(opt + 4, "off", 3)) { esd_recovery_pause(TRUE); } } else if (0 == strncmp(opt, "HQA:", 4)) { if (0 == strncmp(opt + 4, "NormalToFactory", 15)) { mtkfb_switch_normal_to_factory(); } else if (0 == strncmp(opt + 4, "FactoryToNormal", 15)) { mtkfb_switch_factory_to_normal(); } } else if (0 == strncmp(opt, "mmp", 3)) { init_mtkfb_mmp_events(); } else if (0 == strncmp(opt, "dump_layer:", 11)) { if (0 == strncmp(opt + 11, "on", 2)) { char *p = (char *)opt + 14; gCaptureLayerDownX = simple_strtoul(p, &p, 10); gCaptureLayerDownY = simple_strtoul(p+1, &p, 10); gCaptureLayerEnable = 1; } else if (0 == strncmp(opt + 11, "off", 3)) { gCaptureLayerEnable = 0; } } else if (0 == strncmp(opt, "dump_ovl:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { char *p = (char *)opt + 12; gCaptureOvlDownX = simple_strtoul(p, &p, 10); gCaptureOvlDownY = simple_strtoul(p+1, &p, 10); gCaptureOvlThreadEnable = 1; wake_up_process(captureovl_task); } else if (0 == strncmp(opt + 9, "off", 3)) { gCaptureOvlThreadEnable = 0; } } else if (0 == strncmp(opt, "dump_fb:", 8)) { if (0 == strncmp(opt + 8, "on", 2)) { char *p = (char *)opt + 11; gCaptureFBDownX = simple_strtoul(p, &p, 10); gCaptureFBDownY = simple_strtoul(p+1, &p, 10); gCaptureFBPeriod = simple_strtoul(p+1, &p, 10); gCaptureFBEnable = 1; wake_up_interruptible(&gCaptureFBWQ); } else if (0 == strncmp(opt + 8, "off", 3)) { gCaptureFBEnable = 0; } } else { goto Error; } return; Error: DISP_LOG_PRINT(ANDROID_LOG_INFO, "ERROR", "parse command error!\n\n%s", STR_HELP); }
static ssize_t layer_debug_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos) { #ifndef MT65XX_NEW_DISP int ret; MTKFB_LAYER_DBG_OPTIONS *dbgopt = (MTKFB_LAYER_DBG_OPTIONS *)file->private_data; UINT32 aligned_buffer; if(dbgopt->working_buf == 0) { DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "No working buffer is available \n"); return 0; } ///if LCD layer is enabled if(!LCD_IsLayerEnable(dbgopt->layer_index)) { DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "The layer %d is not enabled \n", dbgopt->layer_index); return 0; } aligned_buffer = (dbgopt->working_buf + 32) & 0xFFFFFFC0; if(*ppos == 0) { extern struct semaphore sem_flipping; extern struct semaphore sem_early_suspend; extern struct semaphore sem_update_screen; extern BOOL is_early_suspended; ret = down_interruptible(&sem_flipping); ret = down_interruptible(&sem_early_suspend); if (is_early_suspended) { up(&sem_early_suspend); up(&sem_flipping); return 0; } ret = down_interruptible(&sem_update_screen); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "This is layer %d capturing \n", dbgopt->layer_index); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "This layer width:%d , height:%d\n", LCD_REG->LAYER[dbgopt->layer_index].SIZE.WIDTH, LCD_REG->LAYER[dbgopt->layer_index].SIZE.HEIGHT); if(lcm_params->type == LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) { DSI_CHECK_RET(DSI_WaitForNotBusy()); LCD_CHECK_RET(LCD_EnableDCtoDsi(FALSE)); } LCD_Capture_Layerbuffer(dbgopt->layer_index,aligned_buffer,16); if(lcm_params->type == LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) { LCD_CHECK_RET(LCD_EnableDCtoDsi(TRUE)); } up(&sem_update_screen); up(&sem_early_suspend); up(&sem_flipping); } return simple_read_from_buffer(ubuf, count, ppos, (void *)aligned_buffer, DISP_GetScreenWidth()*DISP_GetScreenHeight()*2); #else return 0; #endif }
DPI_STATUS DPI_Capture_Framebuffer(unsigned int pvbuf, unsigned int bpp) { unsigned int i = 0; unsigned char *fbv; unsigned int fbsize = 0; unsigned int dpi_fb_bpp = 0; unsigned int w,h; if(s_isDpiPowerOn == false) { DPI_PowerOn(); } if(pvbuf == 0 || bpp == 0) { printk("DPI_Capture_Framebuffer, ERROR, parameters wrong: pvbuf=0x%08x, bpp=%d\n", pvbuf, bpp); return DPI_STATUS_OK; } if(DPI_FBGetFormat() == DPI_FB_FORMAT_RGB565) { dpi_fb_bpp = 16; } else if(DPI_FBGetFormat() == DPI_FB_FORMAT_RGB888) { dpi_fb_bpp = 24; } else { printk("DPI_Capture_Framebuffer, ERROR, dpi_fb_bpp is wrong: %d\n", dpi_fb_bpp); return DPI_STATUS_OK; } w = DISP_GetScreenWidth(); h = DISP_GetScreenHeight(); fbsize = w*h*dpi_fb_bpp/8; fbv = (unsigned char*)ioremap_cached((unsigned int)DPI_REG->FB[DPI_GetCurrentFB()].ADDR, fbsize); printk("current fb count is %d\n", DPI_GetCurrentFB()); if(bpp == 32 && dpi_fb_bpp == 24) { for(i = 0;i < w*h; i++) { *(unsigned int*)(pvbuf+i*4) = 0xff000000|fbv[i*3]|(fbv[i*3+1]<<8)|(fbv[i*3+2]<<16); } } else if(bpp == 32 && dpi_fb_bpp == 16) { unsigned int t; unsigned short* fbvt = (unsigned short*)fbv; for(i = 0;i < w*h; i++) { t = fbvt[i]; *(unsigned int*)(pvbuf+i*4) = 0xff000000|((t&0x001F)<<3)|((t&0x07E0)<<5)|((t&0xF800)<<8); } } else if(bpp == 16 && dpi_fb_bpp == 16) { memcpy((void*)pvbuf, (void*)fbv, fbsize); } else if(bpp == 16 && dpi_fb_bpp == 24) { for(i = 0;i < w*h; i++) { *(unsigned short*)(pvbuf+i*2) = ((fbv[i*3+0]&0x1F)>>3)| ((fbv[i*3+1]&0xFC)<<3)| ((fbv[i*3+2]&0x1F)<<8); } } else {
static DISP_STATUS dbi_init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited) { if (!disp_drv_dbi_init_context()) return DISP_STATUS_NOT_IMPLEMENTED; #if 0 #ifdef MT65XX_NEW_DISP { 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 FB_Layer port to be physical. */ { M4U_PORT_STRUCT portStruct; portStruct.ePortID = M4U_PORT_OVL_CH3; /* 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_DBI; /* DISP_MODULE_WDMA1 */ config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; /* disp_path_get_mutex(); */ disp_path_config(&config); /* Config LK UI layer port to be physical. */ { M4U_PORT_STRUCT portStruct; portStruct.ePortID = M4U_PORT_OVL_CH2; /* 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); } disp_bls_config(); } #endif init_io_pad(); init_io_driving_current(); init_lcd(); if (NULL != lcm_drv->init && !isLcmInited) lcm_drv->init(); init_lcd_te_control(); DPI_PowerOn(); DPI_PowerOff(); DSI_PowerOn(); DSI_PowerOff(); #endif return DISP_STATUS_OK; }
UINT32 DAL_GetLayerSize(void) { return DISP_GetScreenWidth() * DISP_GetScreenHeight() * 2; }
static DISP_STATUS dbi_init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited) { if (!disp_drv_dbi_init_context()) return DISP_STATUS_NOT_IMPLEMENTED; //#if 0 //#ifdef MT65XX_NEW_DISP #if 1 { struct disp_path_config_struct config = {0}; config.srcModule = DISP_MODULE_OVL; if(config.srcModule == DISP_MODULE_RDMA0) { config.inFormat = RDMA_INPUT_FORMAT_RGB565; config.addr = fbPA; config.pitch = DISP_GetScreenWidth()*2; config.srcROI.x = 0;config.srcROI.y = 0; config.srcROI.height= DISP_GetScreenHeight();config.srcROI.width= DISP_GetScreenWidth(); } else { 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; #if 0 config.ovl_config.layer = 2; 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.x = 0; // ROI config.ovl_config.y = 0; config.ovl_config.w = DISP_GetScreenWidth(); config.ovl_config.h = DISP_GetScreenHeight(); config.ovl_config.pitch = DISP_GetScreenWidth()*2; //pixel number config.ovl_config.keyEn = 1; config.ovl_config.key = 0xFFFFFFFF; // color key config.ovl_config.aen = 0; // alpha enable config.ovl_config.alpha = 0; #endif } config.dstModule = DISP_MODULE_DBI;// DISP_MODULE_WDMA1 if(config.dstModule == DISP_MODULE_DBI) config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; else config.outFormat = WDMA_OUTPUT_FORMAT_ARGB; disp_path_get_mutex(); disp_path_config(&config); disp_bls_config(); } #endif init_io_pad(); init_io_driving_current(); init_lcd(); if (NULL != lcm_drv->init && !isLcmInited) { lcm_drv->init(); } init_lcd_te_control(); DPI_PowerOn(); DPI_PowerOff(); DSI_PowerOn(); DSI_PowerOff(); return DISP_STATUS_OK; }
int disp_helper_get_option(DISP_HELPER_OPTION option) { /* DISPMSG("stage=0x%08x\n", disp_global_stage); */ switch (option) { case DISP_HELPER_OPTION_USE_CMDQ: { if (_is_normal_stage()) return 1; else if (_is_bringup_stage()) return 0; else if (_is_early_porting_stage()) return 0; else BUG_ON(1); } case DISP_HELPER_OPTION_USE_M4U: { if (_is_normal_stage()) return 1; else if (_is_bringup_stage()) return 0; else if (_is_early_porting_stage()) return 0; else BUG_ON(1); } case DISP_HELPER_OPTION_USE_CLKMGR: { if (_is_normal_stage()) return 1; else if (_is_bringup_stage()) return 0; else if (_is_early_porting_stage()) return 0; else BUG_ON(1); } case DISP_HELPER_OPTION_MIPITX_ON_CHIP: { if (_is_normal_stage()) return 1; else if (_is_bringup_stage()) return 1; else if (_is_early_porting_stage()) return 0; else BUG_ON(1); } case DISP_HELPER_OPTION_FAKE_LCM_X: { int x = 0; #ifdef CONFIG_CUSTOM_LCM_X /*x = simple_strtoul(CONFIG_CUSTOM_LCM_X, NULL, 0);*/ kstrtoint(CONFIG_CUSTOM_LCM_X , 0 , &x); #endif return x; } case DISP_HELPER_OPTION_FAKE_LCM_Y: { int y = 0; #ifdef CONFIG_CUSTOM_LCM_Y /*y = simple_strtoul(CONFIG_CUSTOM_LCM_Y, NULL, 0);*/ kstrtoint(CONFIG_CUSTOM_LCM_Y , 0 , &y); #endif return y; } case DISP_HELPER_OPTION_FAKE_LCM_WIDTH: { int x = 0; int w = DISP_GetScreenWidth(); #ifdef CONFIG_CUSTOM_LCM_X /*x = simple_strtoul(CONFIG_CUSTOM_LCM_X, NULL, 0);*/ kstrtoint(CONFIG_CUSTOM_LCM_X , 0 , &x); if (x != 0) w = ALIGN_TO(w, 16); #endif return w; } case DISP_HELPER_OPTION_FAKE_LCM_HEIGHT: { int h = DISP_GetScreenHeight(); return h; } default: { return _disp_helper_option_value[option]; } } return; }
static void process_dbg_opt(const char *opt) { if (0 == strncmp(opt, "stop_trigger_loop", 17)) { _cmdq_stop_trigger_loop(); return; } else if (0 == strncmp(opt, "start_trigger_loop", 18)) { _cmdq_start_trigger_loop(); return; } else if (0 == strncmp(opt, "cmdqregw:", 9)) { char *p = (char *)opt + 9; unsigned int addr = simple_strtoul(p, &p, 16); unsigned int val = simple_strtoul(p + 1, &p, 16); if (addr) { primary_display_cmdq_set_reg(addr, val); } else { return; } } else if (0 == strncmp(opt, "idle_switch_DC", 14)) { if (0 == strncmp(opt + 14, "on", 2)) { enable_screen_idle_switch_decouple(); printk("enable screen_idle_switch_decouple\n"); } else if (0 == strncmp(opt + 14, "off", 3)) { disable_screen_idle_switch_decouple(); printk("disable screen_idle_switch_decouple\n"); } } else if (0 == strncmp(opt, "shortpath", 9)) { char *p = (char *)opt + 10; int s = simple_strtoul(p, &p, 10); DISPMSG("will %s use shorter decouple path\n", s?"":"not"); disp_helper_set_option(DISP_HELPER_OPTION_TWO_PIPE_INTERFACE_PATH, s); } else if (0 == strncmp(opt, "helper", 6)) { char *p = (char *)opt + 7; int option = simple_strtoul(p, &p, 10); int value = simple_strtoul(p + 1, &p, 10); DISPMSG("will set option %d to %d\n", option, value); disp_helper_set_option(option, value); } else if (0 == strncmp(opt, "dc565", 5)) { char *p = (char *)opt + 6; int s = simple_strtoul(p, &p, 10); DISPMSG("will %s use RGB565 decouple path\n", s?"":"not"); disp_helper_set_option(DISP_HELPER_OPTION_DECOUPLE_MODE_USE_RGB565, s); } else if (0 == strncmp(opt, "switch_mode:", 12)) { int session_id = MAKE_DISP_SESSION(DISP_SESSION_PRIMARY,0); char *p = (char *)opt + 12; unsigned long sess_mode = simple_strtoul(p, &p, 10); primary_display_switch_mode(sess_mode, session_id, 1); } else if (0 == strncmp(opt, "dsipattern", 10)) { char *p = (char *)opt + 11; unsigned int pattern = (unsigned int) simple_strtoul(p, &p, 16); if (pattern) { DSI_BIST_Pattern_Test(DISP_MODULE_DSI0,NULL,true,pattern); DISPMSG("enable dsi pattern: 0x%08x\n", pattern); } else { primary_display_manual_lock(); DSI_BIST_Pattern_Test(DISP_MODULE_DSI0,NULL,false,0); primary_display_manual_unlock(); return; } } else if (0 == strncmp(opt, "rdma_color:", 11)) { printk("zeng: rdma_color\n"); if (0 == strncmp(opt + 11, "on", 2)) { printk("zeng:rdma_color on\n"); char *p = (char *)opt + 14; unsigned int red = simple_strtoul(p, &p, 10); unsigned int green = simple_strtoul(p + 1, &p, 10); unsigned int blue = simple_strtoul(p + 1, &p, 10); rdma_color_matrix matrix = {0}; rdma_color_pre pre = {0}; rdma_color_post post = {255, 0, 0}; post.ADD0 = red; post.ADD1 = green; post.ADD2 = blue; rdma_set_color_matrix(DISP_MODULE_RDMA0, &matrix, &pre, &post); rdma_enable_color_transform(DISP_MODULE_RDMA0); } else if (0 == strncmp(opt + 11, "off", 3)) { printk("zeng:rdma_color off\n"); rdma_disable_color_transform(DISP_MODULE_RDMA0); } } else if (0 == strncmp(opt, "diagnose", 8)) { primary_display_diagnose(); return; } else if (0 == strncmp(opt, "_efuse_test", 11)) { primary_display_check_test(); } else if (0 == strncmp(opt, "dprec_reset", 11)) { dprec_logger_reset_all(); return; } else if (0 == strncmp(opt, "suspend", 4)) { primary_display_suspend(); return; } else if (0 == strncmp(opt, "ata",3)) { mtkfb_fm_auto_test(); return; } else if (0 == strncmp(opt, "resume", 4)) { primary_display_resume(); } else if (0 == strncmp(opt, "dalprintf", 9)) { DAL_Printf("display aee layer test\n"); } else if (0 == strncmp(opt, "dalclean", 8)) { DAL_Clean(); } else if(0 == strncmp(opt, "lfr_setting:",12)) { char *p = (char *)opt + 12; unsigned int enable = (unsigned int) simple_strtoul(p, &p, 12); unsigned int mode = (unsigned int)simple_strtoul(p+1, &p, 12); LCM_PARAMS lcm_param; //unsigned int mode=3; unsigned int type=0; unsigned int skip_num = 1; printk("--------------enable/disable lfr--------------\n"); if (enable) { printk("lfr enable %d mode =%d\n",enable,mode); enable=1; DSI_Set_LFR(DISP_MODULE_DSI0, NULL,mode,type,enable,skip_num); }else{ printk("lfr disable %d mode=%d\n",enable,mode); enable=0; DSI_Set_LFR(DISP_MODULE_DSI0, NULL,mode,type,enable,skip_num); } } else if(0 == strncmp(opt, "vsync_switch:",13)) { char *p = (char *)opt + 13; unsigned int method = 0; method =(unsigned int) simple_strtoul(p, &p, 13); primary_display_vsync_switch(method); } else if (0 == strncmp(opt, "DP", 2)) { char *p = (char *)opt + 3; unsigned int pattern = (unsigned int) simple_strtoul(p, &p, 16); g_display_debug_pattern_index = pattern; return; } else if(0==strncmp(opt,"dsi0_clk:",9)) { char*p=(char*)opt+9; UINT32 clk=simple_strtoul(p, &p, 10); // DSI_ChangeClk(DISP_MODULE_DSI0,clk); } else if (0 == strncmp(opt, "diagnose", 8)) { primary_display_diagnose(); return; } else if (0 == strncmp(opt, "switch:", 7)) { char*p=(char*)opt+7; UINT32 mode=simple_strtoul(p, &p, 10); primary_display_switch_dst_mode(mode%2); return; } else if (0 == strncmp(opt, "regw:", 5)) { char *p = (char *)opt + 5; unsigned long addr = simple_strtoul(p, &p, 16); unsigned long val = simple_strtoul(p + 1, &p, 16); if (addr) { OUTREG32(addr, val); } else { return; } } else if (0 == strncmp(opt, "regr:", 5)) { char *p = (char *)opt + 5; unsigned long addr = (unsigned int) simple_strtoul(p, &p, 16); if (addr) { printk("Read register 0x%lx: 0x%08x\n", addr, INREG32(addr)); } else { return; } } else if (0 == strncmp(opt, "cmmva_dprec", 11)) { dprec_handle_option(0x7); } else if (0 == strncmp(opt, "cmmpa_dprec", 11)) { dprec_handle_option(0x3); } else if (0 == strncmp(opt, "dprec", 5)) { char *p = (char *)opt + 6; unsigned int option = (unsigned int) simple_strtoul(p, &p, 16); dprec_handle_option(option); } else if (0 == strncmp(opt, "cmdq", 4)) { char *p = (char *)opt + 5; unsigned int option = (unsigned int) simple_strtoul(p, &p, 16); if(option) primary_display_switch_cmdq_cpu(CMDQ_ENABLE); else primary_display_switch_cmdq_cpu(CMDQ_DISABLE); } else if (0 == strncmp(opt, "maxlayer", 8)) { char *p = (char *)opt + 9; unsigned int maxlayer = (unsigned int) simple_strtoul(p, &p, 10); if(maxlayer) primary_display_set_max_layer(maxlayer); else DISPERR("can't set max layer to 0\n"); } else if (0 == strncmp(opt, "primary_reset", 13)) { primary_display_reset(); } else if(0 == strncmp(opt, "esd_check", 9)) { char *p = (char *)opt + 10; unsigned int enable = (unsigned int) simple_strtoul(p, &p, 10); primary_display_esd_check_enable(enable); } else if(0 == strncmp(opt, "esd_recovery", 12)) { primary_display_esd_recovery(); } else if(0 == strncmp(opt, "lcm0_reset", 10)) { #if 1 DISP_CPU_REG_SET(DISPSYS_CONFIG_BASE+0x150, 1); msleep(10); DISP_CPU_REG_SET(DISPSYS_CONFIG_BASE+0x150, 0); msleep(10); DISP_CPU_REG_SET(DISPSYS_CONFIG_BASE+0x150, 1); #else #if 0 mt_set_gpio_mode(GPIO106|0x80000000, GPIO_MODE_00); mt_set_gpio_dir(GPIO106|0x80000000, GPIO_DIR_OUT); mt_set_gpio_out(GPIO106|0x80000000, GPIO_OUT_ONE); msleep(10); mt_set_gpio_out(GPIO106|0x80000000, GPIO_OUT_ZERO); msleep(10); mt_set_gpio_out(GPIO106|0x80000000, GPIO_OUT_ONE); #endif #endif } else if(0 == strncmp(opt, "lcm0_reset0", 11)) { DISP_CPU_REG_SET(DDP_REG_BASE_MMSYS_CONFIG+0x150,0); } else if(0 == strncmp(opt, "lcm0_reset1", 11)) { DISP_CPU_REG_SET(DDP_REG_BASE_MMSYS_CONFIG+0x150,1); } else if (0 == strncmp(opt, "cg", 2)) { char *p = (char *)opt + 2; unsigned int enable = (unsigned int) simple_strtoul(p, &p, 10); primary_display_enable_path_cg(enable); } else if (0 == strncmp(opt, "ovl2mem:", 8)) { if (0 == strncmp(opt + 8, "on", 2)) switch_ovl1_to_mem(true); else switch_ovl1_to_mem(false); } else if (0 == strncmp(opt, "dump_layer:", 11)) { if (0 == strncmp(opt + 11, "on", 2)) { char *p = (char *)opt + 14; gCapturePriLayerDownX = simple_strtoul(p, &p, 10); gCapturePriLayerDownY = simple_strtoul(p+1, &p, 10); gCapturePriLayerNum= simple_strtoul(p+1, &p, 10); gCapturePriLayerEnable = 1; gCaptureWdmaLayerEnable = 1; if(gCapturePriLayerDownX==0) gCapturePriLayerDownX = 20; if(gCapturePriLayerDownY==0) gCapturePriLayerDownY = 20; printk("dump_layer En %d DownX %d DownY %d,Num %d",gCapturePriLayerEnable,gCapturePriLayerDownX,gCapturePriLayerDownY,gCapturePriLayerNum); } else if (0 == strncmp(opt + 11, "off", 3)) { gCapturePriLayerEnable = 0; gCaptureWdmaLayerEnable = 0; gCapturePriLayerNum = OVL_LAYER_NUM; printk("dump_layer En %d\n",gCapturePriLayerEnable); } } #ifdef MTK_TODO #error if (0 == strncmp(opt, "hdmion", 6)) { // hdmi_force_init(); } else if (0 == strncmp(opt, "fps:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { dbg_opt.en_fps_log = 1; } else if (0 == strncmp(opt + 4, "off", 3)) { dbg_opt.en_fps_log = 0; } else { goto Error; } reset_fps_logger(); } else if (0 == strncmp(opt, "tl:", 3)) { if (0 == strncmp(opt + 3, "on", 2)) { dbg_opt.en_touch_latency_log = 1; } else if (0 == strncmp(opt + 3, "off", 3)) { dbg_opt.en_touch_latency_log = 0; } else { goto Error; } } else if (0 == strncmp(opt, "black", 5)) { mtkfb_clear_lcm(); } else if (0 == strncmp(opt, "suspend", 4)) { DISP_PanelEnable(FALSE); DISP_PowerEnable(FALSE); } else if (0 == strncmp(opt, "resume", 4)) { DISP_PowerEnable(TRUE); DISP_PanelEnable(TRUE); } else if (0 == strncmp(opt, "lcm:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { DISP_PanelEnable(TRUE); } else if (0 == strncmp(opt + 4, "off", 3)) { DISP_PanelEnable(FALSE); } else if (0 == strncmp(opt + 4, "init", 4)) { if (NULL != lcm_drv && NULL != lcm_drv->init) { lcm_drv->init(); } }else { goto Error; } } else if (0 == strncmp(opt, "cabc:", 5)) { if (0 == strncmp(opt + 5, "ui", 2)) { mtkfb_set_backlight_mode(1); }else if (0 == strncmp(opt + 5, "mov", 3)) { mtkfb_set_backlight_mode(3); }else if (0 == strncmp(opt + 5, "still", 5)) { mtkfb_set_backlight_mode(2); }else { goto Error; } } else if (0 == strncmp(opt, "lcd:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { DISP_PowerEnable(TRUE); } else if (0 == strncmp(opt + 4, "off", 3)) { DISP_PowerEnable(FALSE); } else { goto Error; } } else if (0 == strncmp(opt, "vsynclog:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { EnableVSyncLog = 1; } else if (0 == strncmp(opt + 9, "off", 3)) { EnableVSyncLog = 0; } else { goto Error; } } else if (0 == strncmp(opt, "layer", 5)) { dump_layer_info(); } else if (0 == strncmp(opt, "regw:", 5)) { char *p = (char *)opt + 5; unsigned long addr = simple_strtoul(p, &p, 16); unsigned long val = simple_strtoul(p + 1, &p, 16); if (addr) { OUTREG32(addr, val); } else { goto Error; } } else if (0 == strncmp(opt, "regr:", 5)) { char *p = (char *)opt + 5; unsigned int addr = (unsigned int) simple_strtoul(p, &p, 16); if (addr) { DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "Read register 0x%08x: 0x%08x\n", addr, INREG32(addr)); } else { goto Error; } } else if(0 == strncmp(opt, "bkl:", 4)) { char *p = (char *)opt + 4; unsigned int level = (unsigned int) simple_strtoul(p, &p, 10); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "process_dbg_opt(), set backlight level = %d\n", level); DISP_SetBacklight(level); } else if(0 == strncmp(opt, "dither:", 7)) { unsigned lrs, lgs, lbs, dbr, dbg, dbb; char *p = (char *)opt + 7; lrs = (unsigned int) simple_strtoul(p, &p, 16); p++; lgs = (unsigned int) simple_strtoul(p, &p, 16); p++; lbs = (unsigned int) simple_strtoul(p, &p, 16); p++; dbr = (unsigned int) simple_strtoul(p, &p, 16); p++; dbg = (unsigned int) simple_strtoul(p, &p, 16); p++; dbb = (unsigned int) simple_strtoul(p, &p, 16); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "process_dbg_opt(), %d %d %d %d %d %d\n", lrs, lgs, lbs, dbr, dbg, dbb); } else if (0 == strncmp(opt, "mtkfblog:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { mtkfb_log_enable(true); } else if (0 == strncmp(opt + 9, "off", 3)) { mtkfb_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "displog:", 8)) { if (0 == strncmp(opt + 8, "on", 2)) { disp_log_enable(true); } else if (0 == strncmp(opt + 8, "off", 3)) { disp_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "mtkfb_vsynclog:", 15)) { if (0 == strncmp(opt + 15, "on", 2)) { mtkfb_vsync_log_enable(true); } else if (0 == strncmp(opt + 15, "off", 3)) { mtkfb_vsync_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "log:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { mtkfb_log_enable(true); disp_log_enable(true); } else if (0 == strncmp(opt + 4, "off", 3)) { mtkfb_log_enable(false); disp_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "update", 6)) { DISP_UpdateScreen(0, 0, DISP_GetScreenWidth(), DISP_GetScreenHeight()); } else if (0 == strncmp(opt, "pan_disp", 8)) { mtkfb_pan_disp_test(); } else if (0 == strncmp(opt, "sem_cnt", 7)) { mtkfb_show_sem_cnt(); } else if (0 == strncmp(opt, "hang:", 5)) { if (0 == strncmp(opt + 5, "on", 2)) { mtkfb_hang_test(true); } else if (0 == strncmp(opt + 5, "off", 3)) { mtkfb_hang_test(false); } else{ goto Error; } } else if (0 == strncmp(opt, "cpfbonly:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { mtkfb_capture_fb_only(true); } else if (0 == strncmp(opt + 9, "off", 3)) { mtkfb_capture_fb_only(false); } } else if (0 == strncmp(opt, "esd:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { esd_recovery_pause(FALSE); } else if (0 == strncmp(opt + 4, "off", 3)) { esd_recovery_pause(TRUE); } } else if (0 == strncmp(opt, "HQA:", 4)) { if (0 == strncmp(opt + 4, "NormalToFactory", 15)) { mtkfb_switch_normal_to_factory(); } else if (0 == strncmp(opt + 4, "FactoryToNormal", 15)) { mtkfb_switch_factory_to_normal(); } } else if (0 == strncmp(opt, "mmp", 3)) { init_mtkfb_mmp_events(); } else if (0 == strncmp(opt, "dump_ovl:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { char *p = (char *)opt + 12; gCaptureOvlDownX = simple_strtoul(p, &p, 10); gCaptureOvlDownY = simple_strtoul(p+1, &p, 10); gCaptureOvlThreadEnable = 1; wake_up_process(captureovl_task); } else if (0 == strncmp(opt + 9, "off", 3)) { gCaptureOvlThreadEnable = 0; } } else if (0 == strncmp(opt, "dump_fb:", 8)) { if (0 == strncmp(opt + 8, "on", 2)) { char *p = (char *)opt + 11; gCaptureFBDownX = simple_strtoul(p, &p, 10); gCaptureFBDownY = simple_strtoul(p+1, &p, 10); gCaptureFBPeriod = simple_strtoul(p+1, &p, 10); gCaptureFBEnable = 1; wake_up_interruptible(&gCaptureFBWQ); } else if (0 == strncmp(opt + 8, "off", 3)) { gCaptureFBEnable = 0; } } else { if (disphal_process_dbg_opt(opt)) goto Error; } return; Error: DISP_LOG_PRINT(ANDROID_LOG_INFO, "ERROR", "parse command error!\n\n%s", STR_HELP); #endif }
static void process_dbg_opt(const char *opt) { if (0 == strncmp(opt, "hdmion", 6)) { // hdmi_force_init(); } else if (0 == strncmp(opt, "fps:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { dbg_opt.en_fps_log = 1; } else if (0 == strncmp(opt + 4, "off", 3)) { dbg_opt.en_fps_log = 0; } else { goto Error; } reset_fps_logger(); } else if (0 == strncmp(opt, "tl:", 3)) { if (0 == strncmp(opt + 3, "on", 2)) { dbg_opt.en_touch_latency_log = 1; } else if (0 == strncmp(opt + 3, "off", 3)) { dbg_opt.en_touch_latency_log = 0; } else { goto Error; } } else if (0 == strncmp(opt, "black", 5)) { mtkfb_clear_lcm(); } else if (0 == strncmp(opt, "suspend", 4)) { DISP_PanelEnable(FALSE); DISP_PowerEnable(FALSE); } else if (0 == strncmp(opt, "resume", 4)) { DISP_PowerEnable(TRUE); DISP_PanelEnable(TRUE); } else if (0 == strncmp(opt, "lcm:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { DISP_PanelEnable(TRUE); } else if (0 == strncmp(opt + 4, "off", 3)) { DISP_PanelEnable(FALSE); } else if (0 == strncmp(opt + 4, "init", 4)) { if (NULL != lcm_drv && NULL != lcm_drv->init) { lcm_drv->init(); } } else { goto Error; } } else if (0 == strncmp(opt, "cabc:", 5)) { if (0 == strncmp(opt + 5, "ui", 2)) { mtkfb_set_backlight_mode(1); } else if (0 == strncmp(opt + 5, "mov", 3)) { mtkfb_set_backlight_mode(3); } else if (0 == strncmp(opt + 5, "still", 5)) { mtkfb_set_backlight_mode(2); } else { goto Error; } } else if (0 == strncmp(opt, "lcd:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { DISP_PowerEnable(TRUE); } else if (0 == strncmp(opt + 4, "off", 3)) { DISP_PowerEnable(FALSE); } else { goto Error; } } else if (0 == strncmp(opt, "vsynclog:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { EnableVSyncLog = 1; } else if (0 == strncmp(opt + 9, "off", 3)) { EnableVSyncLog = 0; } else { goto Error; } } else if (0 == strncmp(opt, "layer", 5)) { dump_layer_info(); } else if (0 == strncmp(opt, "fm_test:", 8)) { unsigned int ret = 0; char *p = (char *)opt + 8; unsigned int level = (unsigned int) simple_strtoul(p, &p, 10); color = level; ret = mtkfb_fm_auto_test(); printk("ret = %d, 0x%x\n", ret,color); } else if (0 == strncmp(opt, "regw:", 5)) { char *p = (char *)opt + 5; unsigned long addr = simple_strtoul(p, &p, 16); unsigned long val = simple_strtoul(p + 1, &p, 16); if (addr) { OUTREG32(addr, val); } else { goto Error; } } else if (0 == strncmp(opt, "regr:", 5)) { char *p = (char *)opt + 5; unsigned int addr = (unsigned int) simple_strtoul(p, &p, 16); if (addr) { DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "Read register 0x%08x: 0x%08x\n", addr, INREG32(addr)); } else { goto Error; } } else if(0 == strncmp(opt, "bkl:", 4)) { char *p = (char *)opt + 4; unsigned int level = (unsigned int) simple_strtoul(p, &p, 10); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "process_dbg_opt(), set backlight level = %d\n", level); DISP_SetBacklight(level); } else if(0 == strncmp(opt, "dither:", 7)) { unsigned lrs, lgs, lbs, dbr, dbg, dbb; char *p = (char *)opt + 7; lrs = (unsigned int) simple_strtoul(p, &p, 16); p++; lgs = (unsigned int) simple_strtoul(p, &p, 16); p++; lbs = (unsigned int) simple_strtoul(p, &p, 16); p++; dbr = (unsigned int) simple_strtoul(p, &p, 16); p++; dbg = (unsigned int) simple_strtoul(p, &p, 16); p++; dbb = (unsigned int) simple_strtoul(p, &p, 16); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DBG", "process_dbg_opt(), %d %d %d %d %d %d\n", lrs, lgs, lbs, dbr, dbg, dbb); } else if (0 == strncmp(opt, "mtkfblog:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { mtkfb_log_enable(true); } else if (0 == strncmp(opt + 9, "off", 3)) { mtkfb_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "displog:", 8)) { if (0 == strncmp(opt + 8, "on", 2)) { disp_log_enable(true); } else if (0 == strncmp(opt + 8, "off", 3)) { disp_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "mtkfb_vsynclog:", 15)) { if (0 == strncmp(opt + 15, "on", 2)) { mtkfb_vsync_log_enable(true); } else if (0 == strncmp(opt + 15, "off", 3)) { mtkfb_vsync_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "log:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { mtkfb_log_enable(true); disp_log_enable(true); } else if (0 == strncmp(opt + 4, "off", 3)) { mtkfb_log_enable(false); disp_log_enable(false); } else { goto Error; } } else if (0 == strncmp(opt, "update", 6)) { DISP_UpdateScreen(0, 0, DISP_GetScreenWidth(), DISP_GetScreenHeight()); } else if (0 == strncmp(opt, "pan_disp", 8)) { mtkfb_pan_disp_test(); } else if (0 == strncmp(opt, "sem_cnt", 7)) { mtkfb_show_sem_cnt(); } else if (0 == strncmp(opt, "hang:", 5)) { if (0 == strncmp(opt + 5, "on", 2)) { mtkfb_hang_test(true); } else if (0 == strncmp(opt + 5, "off", 3)) { mtkfb_hang_test(false); } else { goto Error; } } else if (0 == strncmp(opt, "cpfbonly:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { mtkfb_capture_fb_only(true); } else if (0 == strncmp(opt + 9, "off", 3)) { mtkfb_capture_fb_only(false); } } else if (0 == strncmp(opt, "esd:", 4)) { if (0 == strncmp(opt + 4, "on", 2)) { esd_recovery_pause(FALSE); } else if (0 == strncmp(opt + 4, "off", 3)) { esd_recovery_pause(TRUE); } } else if (0 == strncmp(opt, "HQA:", 4)) { if (0 == strncmp(opt + 4, "NormalToFactory", 15)) { mtkfb_switch_normal_to_factory(); } else if (0 == strncmp(opt + 4, "FactoryToNormal", 15)) { mtkfb_switch_factory_to_normal(); } } else if (0 == strncmp(opt, "mmp", 3)) { init_mtkfb_mmp_events(); } else if (0 == strncmp(opt, "dump_layer:", 11)) { if (0 == strncmp(opt + 11, "on", 2)) { char *p = (char *)opt + 14; gCaptureLayerDownX = simple_strtoul(p, &p, 10); gCaptureLayerDownY = simple_strtoul(p+1, &p, 10); gCaptureLayerEnable = 1; gCaptureLayerRawData = 0; } else if (0 == strncmp(opt + 11, "raw", 3)) { gCaptureLayerDownX = 1; gCaptureLayerDownY = 1; gCaptureLayerEnable = 1; gCaptureLayerRawData = 1; } else if (0 == strncmp(opt + 11, "off", 3)) { gCaptureLayerEnable = 0; gCaptureLayerRawData = 0; } } else if (0 == strncmp(opt, "dump_ovl:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { char *p = (char *)opt + 12; gCaptureOvlDownX = simple_strtoul(p, &p, 10); gCaptureOvlDownY = simple_strtoul(p+1, &p, 10); gCaptureOvlEnable = 1; gCaptureOvlRawData = 0; } else if (0 == strncmp(opt + 9, "raw", 3)) { gCaptureOvlDownX = 1; gCaptureOvlDownY = 1; gCaptureOvlEnable = 1; gCaptureOvlRawData = 1; } else if (0 == strncmp(opt + 9, "off", 3)) { gCaptureOvlEnable = 0; gCaptureOvlRawData = 0; } } else if (0 == strncmp(opt, "dump_fb:", 8)) { if (0 == strncmp(opt + 8, "on", 2)) { char *p = (char *)opt + 11; gCaptureFBDownX = simple_strtoul(p, &p, 10); gCaptureFBDownY = simple_strtoul(p+1, &p, 10); gCaptureFBEnable = 1; gCaptureFBRawData = 0; } else if (0 == strncmp(opt + 8, "raw", 3)) { gCaptureFBDownX = 1; gCaptureFBDownY = 1; gCaptureFBEnable = 1; gCaptureFBRawData = 1; } else if (0 == strncmp(opt + 8, "off", 3)) { gCaptureFBEnable = 0; gCaptureFBRawData = 0; } } else if (0 == strncmp(opt, "decouple:", 9)) { if (0 == strncmp(opt + 9, "on", 2)) { struct fb_overlay_mode mode; mode.mode = DISP_DECOUPLE_MODE; DISP_SwitchDisplayMode(&mode); } else if (0 == strncmp(opt + 9, "off", 3)) { struct fb_overlay_mode mode; mode.mode = DISP_DIRECT_LINK_MODE; DISP_SwitchDisplayMode(&mode); } } else { if (disphal_process_dbg_opt(opt)) goto Error; } return; Error: DISP_LOG_PRINT(ANDROID_LOG_INFO, "ERROR", "parse command error!\n\n%s", STR_HELP); }
/* touch panel probe */ static int tpd_probe(struct platform_device *pdev) { int touch_type = 1; // 0:R-touch, 1: Cap-touch int i=0; TPD_DMESG("enter %s, %d\n", __FUNCTION__, __LINE__); /* Select R-Touch */ // if(g_tpd_drv == NULL||tpd_load_status == 0) #if 0 if(g_tpd_drv == NULL) { g_tpd_drv = &tpd_driver_list[0]; /* touch_type:0: r-touch, 1: C-touch */ touch_type = 0; TPD_DMESG("Generic touch panel driver\n"); } #ifdef CONFIG_HAS_EARLYSUSPEND MTK_TS_early_suspend_handler.suspend = g_tpd_drv->suspend; MTK_TS_early_suspend_handler.resume = g_tpd_drv->resume; register_early_suspend(&MTK_TS_early_suspend_handler); #endif #endif if (misc_register(&tpd_misc_device)) { printk("mtk_tpd: tpd_misc_device register failed\n"); } if((tpd=(struct tpd_device*)kmalloc(sizeof(struct tpd_device), GFP_KERNEL))==NULL) return -ENOMEM; memset(tpd, 0, sizeof(struct tpd_device)); /* allocate input device */ if((tpd->dev=input_allocate_device())==NULL) { kfree(tpd); return -ENOMEM; } //TPD_RES_X = simple_strtoul(LCM_WIDTH, NULL, 0); //TPD_RES_Y = simple_strtoul(LCM_HEIGHT, NULL, 0); TPD_RES_X = DISP_GetScreenWidth(); TPD_RES_Y = DISP_GetScreenHeight(); printk("mtk_tpd: TPD_RES_X = %d, TPD_RES_Y = %d\n", TPD_RES_X, TPD_RES_Y); tpd_mode = TPD_MODE_NORMAL; tpd_mode_axis = 0; tpd_mode_min = TPD_RES_Y/2; tpd_mode_max = TPD_RES_Y; tpd_mode_keypad_tolerance = TPD_RES_X*TPD_RES_X/1600; /* struct input_dev dev initialization and registration */ tpd->dev->name = TPD_DEVICE; set_bit(EV_ABS, tpd->dev->evbit); set_bit(EV_KEY, tpd->dev->evbit); set_bit(ABS_X, tpd->dev->absbit); set_bit(ABS_Y, tpd->dev->absbit); set_bit(ABS_PRESSURE, tpd->dev->absbit); set_bit(BTN_TOUCH, tpd->dev->keybit); set_bit(INPUT_PROP_DIRECT, tpd->dev->propbit); #if 1 for(i = 1; i < TP_DRV_MAX_COUNT; i++) { /* add tpd driver into list */ if(tpd_driver_list[i].tpd_device_name != NULL) { tpd_driver_list[i].tpd_local_init(); //msleep(1); if(tpd_load_status ==1) { TPD_DMESG("[mtk-tpd]tpd_probe, tpd_driver_name=%s\n", tpd_driver_list[i].tpd_device_name); g_tpd_drv = &tpd_driver_list[i]; break; } } } if(g_tpd_drv == NULL) { if(tpd_driver_list[0].tpd_device_name != NULL) { g_tpd_drv = &tpd_driver_list[0]; /* touch_type:0: r-touch, 1: C-touch */ touch_type = 0; g_tpd_drv->tpd_local_init(); TPD_DMESG("[mtk-tpd]Generic touch panel driver\n"); } else { TPD_DMESG("[mtk-tpd]cap touch and Generic touch both are not loaded!!\n"); return 0; } } #ifdef CONFIG_HAS_EARLYSUSPEND MTK_TS_early_suspend_handler.suspend = g_tpd_drv->suspend; MTK_TS_early_suspend_handler.resume = g_tpd_drv->resume; register_early_suspend(&MTK_TS_early_suspend_handler); #endif #endif //#ifdef TPD_TYPE_CAPACITIVE /* TPD_TYPE_CAPACITIVE handle */ if(touch_type == 1){ set_bit(ABS_MT_TRACKING_ID, tpd->dev->absbit); set_bit(ABS_MT_TOUCH_MAJOR, tpd->dev->absbit); set_bit(ABS_MT_TOUCH_MINOR, tpd->dev->absbit); set_bit(ABS_MT_POSITION_X, tpd->dev->absbit); set_bit(ABS_MT_POSITION_Y, tpd->dev->absbit); #if 0 // linux kernel update from 2.6.35 --> 3.0 tpd->dev->absmax[ABS_MT_POSITION_X] = TPD_RES_X; tpd->dev->absmin[ABS_MT_POSITION_X] = 0; tpd->dev->absmax[ABS_MT_POSITION_Y] = TPD_RES_Y; tpd->dev->absmin[ABS_MT_POSITION_Y] = 0; tpd->dev->absmax[ABS_MT_TOUCH_MAJOR] = 100; tpd->dev->absmin[ABS_MT_TOUCH_MINOR] = 0; #else input_set_abs_params(tpd->dev, ABS_MT_POSITION_X, 0, TPD_RES_X, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_POSITION_Y, 0, TPD_RES_Y, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MAJOR, 0, 100, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MINOR, 0, 100, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_PRESSURE, 0, 255, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_WIDTH_MINOR, 0, 15, 0, 0); #endif TPD_DMESG("Cap touch panel driver\n"); } //#endif #if 0 //linux kernel update from 2.6.35 --> 3.0 tpd->dev->absmax[ABS_X] = TPD_RES_X; tpd->dev->absmin[ABS_X] = 0; tpd->dev->absmax[ABS_Y] = TPD_RES_Y; tpd->dev->absmin[ABS_Y] = 0; tpd->dev->absmax[ABS_PRESSURE] = 255; tpd->dev->absmin[ABS_PRESSURE] = 0; #else input_set_abs_params(tpd->dev, ABS_X, 0, TPD_RES_X, 0, 0); input_set_abs_params(tpd->dev, ABS_Y, 0, TPD_RES_Y, 0, 0); input_abs_set_res(tpd->dev, ABS_X, TPD_RES_X); input_abs_set_res(tpd->dev, ABS_Y, TPD_RES_Y); input_set_abs_params(tpd->dev, ABS_PRESSURE, 0, 255, 0, 0); #endif if(input_register_device(tpd->dev)) TPD_DMESG("input_register_device failed.(tpd)\n"); else tpd_register_flag = 1; /* init R-Touch */ #if 0 if(touch_type == 0) { g_tpd_drv->tpd_local_init(); } #endif if(g_tpd_drv->tpd_have_button) { tpd_button_init(); } if (g_tpd_drv->attrs.num) tpd_create_attributes(&pdev->dev, &g_tpd_drv->attrs); #if defined(TARGET_S4) synaptics_init_sysfs (); #else if(SEL_SYSFS == 1) { synaptics_init_sysfs (); } else if(SEL_SYSFS == 2) { LU201x_init_sysfs (); } #endif return 0; }
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; }
/* Will only be used in ioctl(MTK_HDMI_AUDIO_VIDEO_ENABLE) */ static HDMI_STATUS hdmi_drv_init(void) { int lcm_width, lcm_height; int tmpBufferSize; M4U_PORT_STRUCT portStruct; HDMI_FUNC(); RETIF(p->output_mode == HDMI_OUTPUT_MODE_DPI_BYPASS, 0); p->hdmi_width = 1280; p->hdmi_height = 720; lcm_width = DISP_GetScreenWidth(); lcm_height = DISP_GetScreenHeight(); //printk("[hdmi]%s, hdmi_width=%d, hdmi_height=%d\n", __func__, p->hdmi_width, p->hdmi_height); HDMI_LOG("lcm_width=%d, lcm_height=%d\n", lcm_width, lcm_height); tmpBufferSize = lcm_width * lcm_height *4 * 4; temp_va = (unsigned int) vmalloc(tmpBufferSize); if (((void*) temp_va) == NULL) { HDMI_LOG("vmalloc %dbytes fail\n", tmpBufferSize); return -1; } // WDMA1 if (m4u_alloc_mva(M4U_CLNTMOD_WDMA, temp_va, tmpBufferSize, 0, 0, &temp_mva_w)) { HDMI_LOG("m4u_alloc_mva for temp_mva_w fail\n"); return -1; } m4u_dma_cache_maint(M4U_CLNTMOD_WDMA, temp_va, tmpBufferSize, DMA_BIDIRECTIONAL); portStruct.ePortID = M4U_PORT_WDMA1; //hardware port ID, defined in M4U_PORT_ID_ENUM portStruct.Virtuality = 1; portStruct.Security = 0; portStruct.domain = 0; //domain : 0 1 2 3 portStruct.Distance = 1; portStruct.Direction = 0; m4u_config_port(&portStruct); HDMI_LOG("temp_va=0x%08x, temp_mva_w=0x%08x\n", temp_va, temp_mva_w); p->lcm_width = lcm_width; p->lcm_height = lcm_height; p->output_video_resolution = hdmi_params->init_config.vformat; p->output_audio_format = hdmi_params->init_config.aformat; //#ifdef NEW_HDMI_ARCH // hdmi_display_path_overlay_config(true); //#endif DISP_Config_Overlay_to_Memory(temp_mva_w, 1); //hdmi_dpi_config_clock(); // configure dpi clock //hdmi_dpi_power_switch(false); // but dpi power is still off //hdmi_drv->suspend(); #if 0 LCD_WaitForNotBusy(); LCD_SetOutputMode(3); // LCD write to memory and LCM #endif return HDMI_STATUS_OK; }
DPI_STATUS DPI_Capture_Framebuffer(unsigned int pvbuf, unsigned int bpp) { #if 0 unsigned int i = 0; unsigned char *fbv; unsigned int fbsize = 0; unsigned int dpi_fb_bpp = 0; unsigned int w,h; BOOL dpi_needPowerOff = FALSE; if(!s_isDpiPowerOn){ DPI_PowerOn(); dpi_needPowerOff = TRUE; LCD_WaitForNotBusy(); LCD_WaitDPIIndication(FALSE); LCD_FBReset(); LCD_StartTransfer(TRUE); LCD_WaitDPIIndication(TRUE); } if(pvbuf == 0 || bpp == 0) { DISP_LOG_PRINT(ANDROID_LOG_ERROR, "DPI", "DPI_Capture_Framebuffer, ERROR, parameters wrong: pvbuf=0x%08x, bpp=%d\n", pvbuf, bpp); return DPI_STATUS_OK; } if(DPI_FBGetFormat() == DPI_FB_FORMAT_RGB565) { dpi_fb_bpp = 16; } else if(DPI_FBGetFormat() == DPI_FB_FORMAT_RGB888) { dpi_fb_bpp = 24; } else { DISP_LOG_PRINT(ANDROID_LOG_ERROR, "DPI", "DPI_Capture_Framebuffer, ERROR, dpi_fb_bpp is wrong: %d\n", dpi_fb_bpp); return DPI_STATUS_OK; } w = DISP_GetScreenWidth(); h = DISP_GetScreenHeight(); fbsize = w*h*dpi_fb_bpp/8; if(dpi_needPowerOff) fbv = (unsigned char*)ioremap_cached((unsigned int)DPI_REG->FB[0].ADDR, fbsize); else fbv = (unsigned char*)ioremap_cached((unsigned int)DPI_REG->FB[DPI_GetCurrentFB()].ADDR, fbsize); DISP_LOG_PRINT(ANDROID_LOG_INFO, "DPI", "current fb count is %d\n", DPI_GetCurrentFB()); if(bpp == 32 && dpi_fb_bpp == 24) { if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 3)){ unsigned int pix_count = w * h - 1; for(i = 0;i < w*h; i++) { *(unsigned int*)(pvbuf+ (pix_count - i) * 4) = 0xff000000|fbv[i*3]|(fbv[i*3+1]<<8)|(fbv[i*3+2]<<16); } } else{ for(i = 0;i < w*h; i++) { *(unsigned int*)(pvbuf+i*4) = 0xff000000|fbv[i*3]|(fbv[i*3+1]<<8)|(fbv[i*3+2]<<16); } } } else if(bpp == 32 && dpi_fb_bpp == 16) { unsigned int t; unsigned short* fbvt = (unsigned short*)fbv; if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 3)){ unsigned int pix_count = w * h - 1; for(i = 0;i < w*h; i++) { t = fbvt[i]; *(unsigned int*)(pvbuf+ (pix_count - i) * 4) = 0xff000000|((t&0x001F)<<3)|((t&0x07E0)<<5)|((t&0xF800)<<8); } } else{ for(i = 0;i < w*h; i++) { t = fbvt[i]; *(unsigned int*)(pvbuf+i*4) = 0xff000000|((t&0x001F)<<3)|((t&0x07E0)<<5)|((t&0xF800)<<8); } } } else if(bpp == 16 && dpi_fb_bpp == 16) { if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 3)){ unsigned int pix_count = w * h - 1; unsigned short* fbvt = (unsigned short*)fbv; for(i = 0;i < w*h; i++) { *(unsigned short*)(pvbuf+ (pix_count - i) * 2) = fbvt[i]; } } else memcpy((void*)pvbuf, (void*)fbv, fbsize); } else if(bpp == 16 && dpi_fb_bpp == 24) { if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 3)){ unsigned int pix_count = w * h - 1; for(i = 0;i < w*h; i++) { *(unsigned short*)(pvbuf+ (pix_count - i) * 2) = ((fbv[i*3+0]&0xF8)>>3)| ((fbv[i*3+1]&0xFC)<<3)| ((fbv[i*3+2]&0xF8)<<8); } } else{ for(i = 0;i < w*h; i++)
/* touch panel probe */ static int tpd_probe(struct platform_device *pdev) { int touch_type = 1; // 0:R-touch, 1: Cap-touch int i=0; TPD_DMESG("enter %s, %d\n", __FUNCTION__, __LINE__); /* Select R-Touch */ // if(g_tpd_drv == NULL||tpd_load_status == 0) #if 0 if(g_tpd_drv == NULL) { g_tpd_drv = &tpd_driver_list[0]; /* touch_type:0: r-touch, 1: C-touch */ touch_type = 0; TPD_DMESG("Generic touch panel driver\n"); } #ifdef CONFIG_HAS_EARLYSUSPEND MTK_TS_early_suspend_handler.suspend = g_tpd_drv->suspend; MTK_TS_early_suspend_handler.resume = g_tpd_drv->resume; register_early_suspend(&MTK_TS_early_suspend_handler); #endif #endif /*Begin lenovo-sw wengjun1 add for tp info struct. 2014-1-15*/ tpd_info_t = (struct tpd_version_info*)kmalloc(sizeof(struct tpd_version_info), GFP_KERNEL); /*End lenovo-sw wengjun1 add for tp info struct. 2014-1-15*/ if (misc_register(&tpd_misc_device)) { printk("mtk_tpd: tpd_misc_device register failed\n"); } if((tpd=(struct tpd_device*)kmalloc(sizeof(struct tpd_device), GFP_KERNEL))==NULL) return -ENOMEM; memset(tpd, 0, sizeof(struct tpd_device)); /* allocate input device */ if((tpd->dev=input_allocate_device())==NULL) { kfree(tpd); return -ENOMEM; } //TPD_RES_X = simple_strtoul(LCM_WIDTH, NULL, 0); //TPD_RES_Y = simple_strtoul(LCM_HEIGHT, NULL, 0); TPD_RES_X = DISP_GetScreenWidth(); TPD_RES_Y = DISP_GetScreenHeight(); printk("mtk_tpd: TPD_RES_X = %d, TPD_RES_Y = %d\n", TPD_RES_X, TPD_RES_Y); tpd_mode = TPD_MODE_NORMAL; tpd_mode_axis = 0; tpd_mode_min = TPD_RES_Y/2; tpd_mode_max = TPD_RES_Y; tpd_mode_keypad_tolerance = TPD_RES_X*TPD_RES_X/1600; /* struct input_dev dev initialization and registration */ tpd->dev->name = TPD_DEVICE; set_bit(EV_ABS, tpd->dev->evbit); set_bit(EV_KEY, tpd->dev->evbit); /*Lenovo-sw wengjun1 remove unused attributes*/ #ifndef LENOVO_TP_OPTIMIZED set_bit(ABS_X, tpd->dev->absbit); set_bit(ABS_Y, tpd->dev->absbit); set_bit(ABS_PRESSURE, tpd->dev->absbit); set_bit(BTN_TOUCH, tpd->dev->keybit); #endif /*Lenovo-sw remove end*/ set_bit(INPUT_PROP_DIRECT, tpd->dev->propbit); #if 1 for(i = 1; i < TP_DRV_MAX_COUNT; i++) { /* add tpd driver into list */ if(tpd_driver_list[i].tpd_device_name != NULL) { tpd_driver_list[i].tpd_local_init(); //msleep(1); if(tpd_load_status ==1) { TPD_DMESG("[mtk-tpd]tpd_probe, tpd_driver_name=%s\n", tpd_driver_list[i].tpd_device_name); g_tpd_drv = &tpd_driver_list[i]; break; } } } if(g_tpd_drv == NULL) { if(tpd_driver_list[0].tpd_device_name != NULL) { g_tpd_drv = &tpd_driver_list[0]; /* touch_type:0: r-touch, 1: C-touch */ touch_type = 0; g_tpd_drv->tpd_local_init(); TPD_DMESG("[mtk-tpd]Generic touch panel driver\n"); } else { TPD_DMESG("[mtk-tpd]cap touch and Generic touch both are not loaded!!\n"); return 0; } } #ifdef CONFIG_HAS_EARLYSUSPEND MTK_TS_early_suspend_handler.suspend = g_tpd_drv->suspend; MTK_TS_early_suspend_handler.resume = g_tpd_drv->resume; //liangzhiqiang add for tp wakeup if(lct_tp_early_suspend == 0) { MTK_TS_early_suspend_handler.level = EARLY_SUSPEND_LEVEL_DISABLE_FB+10; } register_early_suspend(&MTK_TS_early_suspend_handler); #endif #endif //#ifdef TPD_TYPE_CAPACITIVE /* TPD_TYPE_CAPACITIVE handle */ if(touch_type == 1){ set_bit(ABS_MT_TRACKING_ID, tpd->dev->absbit); set_bit(ABS_MT_TOUCH_MAJOR, tpd->dev->absbit); /*Lenovo-sw wengjun1 remove unused attributes*/ #ifndef LENOVO_TP_OPTIMIZED set_bit(ABS_MT_TOUCH_MINOR, tpd->dev->absbit); #endif /*Lenovo-sw remove end*/ set_bit(ABS_MT_POSITION_X, tpd->dev->absbit); set_bit(ABS_MT_POSITION_Y, tpd->dev->absbit); #if 0 // linux kernel update from 2.6.35 --> 3.0 tpd->dev->absmax[ABS_MT_POSITION_X] = TPD_RES_X; tpd->dev->absmin[ABS_MT_POSITION_X] = 0; tpd->dev->absmax[ABS_MT_POSITION_Y] = TPD_RES_Y; tpd->dev->absmin[ABS_MT_POSITION_Y] = 0; tpd->dev->absmax[ABS_MT_TOUCH_MAJOR] = 100; tpd->dev->absmin[ABS_MT_TOUCH_MINOR] = 0; #else input_set_abs_params(tpd->dev, ABS_MT_POSITION_X, 0, TPD_RES_X, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_POSITION_Y, 0, TPD_RES_Y, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MAJOR, 0, 100, 0, 0); /*Lenovo-sw wengjun1 remove unused attributes*/ #ifndef LENOVO_TP_OPTIMIZED input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MINOR, 0, 100, 0, 0); #endif /*Lenovo-sw remove end*/ #endif TPD_DMESG("Cap touch panel driver\n"); } //#endif #if 0 //linux kernel update from 2.6.35 --> 3.0 tpd->dev->absmax[ABS_X] = TPD_RES_X; tpd->dev->absmin[ABS_X] = 0; tpd->dev->absmax[ABS_Y] = TPD_RES_Y; tpd->dev->absmin[ABS_Y] = 0; tpd->dev->absmax[ABS_PRESSURE] = 255; tpd->dev->absmin[ABS_PRESSURE] = 0; #else /*Lenovo-sw wengjun1 remove unused attributes*/ #ifndef LENOVO_TP_OPTIMIZED input_set_abs_params(tpd->dev, ABS_X, 0, TPD_RES_X, 0, 0); input_set_abs_params(tpd->dev, ABS_Y, 0, TPD_RES_Y, 0, 0); input_abs_set_res(tpd->dev, ABS_X, TPD_RES_X); input_abs_set_res(tpd->dev, ABS_Y, TPD_RES_Y); input_set_abs_params(tpd->dev, ABS_PRESSURE, 0, 255, 0, 0); #endif /*Lenovo-sw remove end*/ #endif if(input_register_device(tpd->dev)) TPD_DMESG("input_register_device failed.(tpd)\n"); else tpd_register_flag = 1; /* init R-Touch */ #if 0 if(touch_type == 0) { g_tpd_drv->tpd_local_init(); } #endif //lenovo-wengjun1 #if 1 //defined(LENOVO_PRODUCT_DEVICE==S960) //#if(LENOVO_PRODUCT_DEVICE == 920) //if(g_tpd_drv->tpd_have_button) #else if(g_tpd_drv->tpd_have_button) #endif { tpd_button_init(); } if (g_tpd_drv->attrs.num) tpd_create_attributes(&pdev->dev, &g_tpd_drv->attrs); #if 1 if(device_create_file(&pdev->dev, &dev_attr_tpd_fw_version)) { TPD_DMESG("create fw_version file error--Liu\n"); } if(device_create_file(&pdev->dev, &dev_attr_tpd_fw_vendor_info)) { TPD_DMESG("create touch_info file error--Liu\n"); } if(device_create_file(&pdev->dev, &dev_attr_tpd_fw_chip_info)) { TPD_DMESG("create touch_info file error--Liu\n"); } #endif return 0; }
static DISP_STATUS dsi_init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited) { if (!disp_drv_dsi_init_context()) return DISP_STATUS_NOT_IMPLEMENTED; if(lcm_params->dsi.mode == CMD_MODE) { #ifndef MT65XX_NEW_DISP init_lcd(); #endif init_dsi(isLcmInited); if (NULL != lcm_drv->init && !isLcmInited) { lcm_drv->init(); DSI_LP_Reset(); } #ifndef MT65XX_NEW_DISP DSI_clk_HS_mode(0); #else DSI_clk_HS_mode(1); #endif DSI_SetMode(lcm_params->dsi.mode); #ifndef MT65XX_NEW_DISP DPI_PowerOn(); DPI_PowerOff(); init_lcd_te_control(); #endif } else { #ifndef MT65XX_NEW_DISP init_intermediate_buffers(fbPA); init_lcd(); init_dpi(isLcmInited); #endif if (!isLcmInited) { DSI_SetMode(0); mdelay(100); DSI_DisableClk(); } else { is_video_mode_running = true; } init_dsi(isLcmInited); if (NULL != lcm_drv->init && !isLcmInited) { lcm_drv->init(); DSI_LP_Reset(); } DSI_SetMode(lcm_params->dsi.mode); #ifndef BUILD_UBOOT #ifndef MT65XX_NEW_DISP if(lcm_params->dsi.lcm_ext_te_monitor) { is_video_mode_running = false; LCD_TE_SetMode(LCD_TE_MODE_VSYNC_ONLY); LCD_TE_SetEdgePolarity(LCM_POLARITY_RISING); LCD_TE_Enable(FALSE); } if(lcm_params->dsi.noncont_clock) DSI_set_noncont_clk(false, lcm_params->dsi.noncont_clock_period); if(lcm_params->dsi.lcm_int_te_monitor) DSI_set_int_TE(false, lcm_params->dsi.lcm_int_te_period); #endif #endif } #ifdef MT65XX_NEW_DISP { 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; if(lcm_params->dsi.mode != CMD_MODE) { 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(); } // Config FB_Layer port to be physical. { M4U_PORT_STRUCT portStruct; portStruct.ePortID = M4U_PORT_OVL_CH3; //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); } 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.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); 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) disp_path_get_mutex(); disp_path_config(&config); if(lcm_params->dsi.mode != CMD_MODE) disp_path_release_mutex(); // Disable LK UI layer (Layer2) if(lcm_params->dsi.mode != CMD_MODE) { 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(); } // Config LK UI layer port to be physical. { M4U_PORT_STRUCT portStruct; portStruct.ePortID = M4U_PORT_OVL_CH2; //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); } } #endif return DISP_STATUS_OK; }
static DISP_STATUS dbi_init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited) { if (!disp_drv_dbi_init_context()) return DISP_STATUS_NOT_IMPLEMENTED; #ifdef MT65XX_NEW_DISP { 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 FB_Layer port to be physical. #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); } #endif // Reconfig FB_Layer and enable it. 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_DBI;// DISP_MODULE_WDMA1 config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; disp_path_config(&config); disp_bls_config(); } #endif init_io_pad(); init_io_driving_current(); init_lcd(isLcmInited); if (NULL != lcm_drv->init && !isLcmInited) { lcm_drv->init(); } init_lcd_te_control(); 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 init_mipi_pll(); init_io_pad(); init_io_driving_current(); printf("%s, %d\n", __func__, __LINE__); init_lcd(); // must initialize lcm before dpi enable if (NULL != lcm_drv->init && !isLcmInited) { lcm_drv->init(); } init_dpi(isLcmInited); printf("%s, %d\n", __func__, __LINE__); { struct disp_path_config_struct config = {0}; printf("%s, %d\n", __func__, __LINE__); config.srcModule = DISP_MODULE_OVL; if(config.srcModule == DISP_MODULE_RDMA0) { config.inFormat = RDMA_INPUT_FORMAT_RGB565; config.addr = fbPA; config.pitch = DISP_GetScreenWidth()*2; config.srcROI.x = 0;config.srcROI.y = 0; config.srcROI.height= DISP_GetScreenHeight();config.srcROI.width= DISP_GetScreenWidth(); } else { 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 = 2; 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.x = 0; // ROI config.ovl_config.y = 0; config.ovl_config.w = DISP_GetScreenWidth(); config.ovl_config.h = DISP_GetScreenHeight(); config.ovl_config.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;// DISP_MODULE_WDMA1 if(config.dstModule == DISP_MODULE_DPI0) config.outFormat = RDMA_OUTPUT_FORMAT_ARGB; else config.outFormat = WDMA_OUTPUT_FORMAT_ARGB; disp_path_get_mutex(); disp_path_config(&config); disp_bls_init(DISP_GetScreenWidth(), DISP_GetScreenHeight()); printf("%s, %d\n", __func__, __LINE__); disp_path_release_mutex(); } #endif return DISP_STATUS_OK; }
int disp_helper_get_option(DISP_HELPER_OPTION option) { //DISPMSG("stage=0x%08x\n", disp_global_stage); switch(option) { case DISP_HELPER_OPTION_USE_CMDQ: { if(_is_normal_stage()) return 1; else if(_is_bringup_stage()) return 0; else if(_is_early_porting_stage()) return 0; else BUG_ON(1); } case DISP_HELPER_OPTION_USE_M4U: { if(_is_normal_stage()) return 1; else if(_is_bringup_stage()) return 0; else if(_is_early_porting_stage()) return 0; else BUG_ON(1); } case DISP_HELPER_OPTION_USE_CLKMGR: { if(_is_normal_stage()) return 1; else if(_is_bringup_stage()) return 0; else if(_is_early_porting_stage()) return 0; else BUG_ON(1); } case DISP_HELPER_OPTION_MIPITX_ON_CHIP: { if(_is_normal_stage()) return 1; else if(_is_bringup_stage()) return 1; else if(_is_early_porting_stage()) return 0; else BUG_ON(1); } case DISP_HELPER_OPTION_FAKE_LCM_X: { int x = 0; #ifdef CONFIG_CUSTOM_LCM_X x = simple_strtoul(CONFIG_CUSTOM_LCM_X, NULL, 0); #endif return x; } case DISP_HELPER_OPTION_FAKE_LCM_Y: { int y = 0; #ifdef CONFIG_CUSTOM_LCM_Y y = simple_strtoul(CONFIG_CUSTOM_LCM_Y, NULL, 0); #endif return y; } case DISP_HELPER_OPTION_FAKE_LCM_WIDTH: { int x = 0; int w = DISP_GetScreenWidth(); #ifdef CONFIG_CUSTOM_LCM_X x = simple_strtoul(CONFIG_CUSTOM_LCM_X, NULL, 0); if(x != 0) { w = ALIGN_TO(w, 16); } #endif return w; } case DISP_HELPER_OPTION_FAKE_LCM_HEIGHT: { int h = DISP_GetScreenHeight(); return h; } case DISP_HELPER_OPTION_DYNAMIC_SWITCH_UNDERFLOW_EN: { return 0; } case DISP_HELPER_OPTION_OVL_WARM_RESET: { return 1; } default: break; } BUG_ON(1); }
/* touch panel probe */ static int tpd_probe(struct platform_device *pdev) { int touch_type = 1; /* 0:R-touch, 1: Cap-touch */ int i = 0; TPD_DMESG("enter %s, %d\n", __func__, __LINE__); /* Select R-Touch */ /* if(g_tpd_drv == NULL||tpd_load_status == 0) */ #if 0 if (g_tpd_drv == NULL) { g_tpd_drv = &tpd_driver_list[0]; /* touch_type:0: r-touch, 1: C-touch */ touch_type = 0; TPD_DMESG("Generic touch panel driver\n"); } #ifdef CONFIG_HAS_EARLYSUSPEND MTK_TS_early_suspend_handler.suspend = g_tpd_drv->suspend; MTK_TS_early_suspend_handler.resume = g_tpd_drv->resume; register_early_suspend(&MTK_TS_early_suspend_handler); #endif #endif if (misc_register(&tpd_misc_device)) { printk("mtk_tpd: tpd_misc_device register failed\n"); } if ((tpd = (struct tpd_device *)kmalloc(sizeof(struct tpd_device), GFP_KERNEL)) == NULL) return -ENOMEM; memset(tpd, 0, sizeof(struct tpd_device)); /* allocate input device */ if ((tpd->dev = input_allocate_device()) == NULL) { kfree(tpd); return -ENOMEM; } /* TPD_RES_X = simple_strtoul(LCM_WIDTH, NULL, 0); */ /* TPD_RES_Y = simple_strtoul(LCM_HEIGHT, NULL, 0); */ #ifdef CONFIG_MTK_LCM_PHYSICAL_ROTATION if(0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION, "90", 2) || 0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION, "270", 3)) { TPD_RES_Y = DISP_GetScreenWidth(); TPD_RES_X = DISP_GetScreenHeight(); } else #endif { #ifdef CONFIG_CUSTOM_LCM_X #ifndef CONFIG_MTK_FPGA TPD_RES_X = DISP_GetScreenWidth(); TPD_RES_Y = DISP_GetScreenHeight(); #endif #else TPD_RES_X = simple_strtoul(CONFIG_LCM_WIDTH, NULL, 0); TPD_RES_Y = simple_strtoul(CONFIG_LCM_HEIGHT, NULL, 0); #endif } printk("mtk_tpd: TPD_RES_X = %d, TPD_RES_Y = %d\n", TPD_RES_X, TPD_RES_Y); tpd_mode = TPD_MODE_NORMAL; tpd_mode_axis = 0; tpd_mode_min = TPD_RES_Y / 2; tpd_mode_max = TPD_RES_Y; tpd_mode_keypad_tolerance = TPD_RES_X * TPD_RES_X / 1600; /* struct input_dev dev initialization and registration */ tpd->dev->name = TPD_DEVICE; set_bit(EV_ABS, tpd->dev->evbit); set_bit(EV_KEY, tpd->dev->evbit); set_bit(ABS_X, tpd->dev->absbit); set_bit(ABS_Y, tpd->dev->absbit); set_bit(ABS_PRESSURE, tpd->dev->absbit); #if !defined(CONFIG_MTK_S3320) && !defined(CONFIG_MTK_S3320_47) && !defined(CONFIG_MTK_S3320_50) && !defined(CONFIG_MTK_MIT200) && !defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S3528) && !defined(CONFIG_MTK_S7020) set_bit(BTN_TOUCH, tpd->dev->keybit); #endif /* CONFIG_MTK_S3320 */ set_bit(INPUT_PROP_DIRECT, tpd->dev->propbit); /* save dev for regulator_get() before tpd_local_init() */ tpd->tpd_dev = &pdev->dev; #if 1 for (i = 1; i < TP_DRV_MAX_COUNT; i++) { /* add tpd driver into list */ if (tpd_driver_list[i].tpd_device_name != NULL) { tpd_driver_list[i].tpd_local_init(); /* msleep(1); */ if (tpd_load_status == 1) { TPD_DMESG("[mtk-tpd]tpd_probe, tpd_driver_name=%s\n", tpd_driver_list[i].tpd_device_name); g_tpd_drv = &tpd_driver_list[i]; break; } } } if (g_tpd_drv == NULL) { if (tpd_driver_list[0].tpd_device_name != NULL) { g_tpd_drv = &tpd_driver_list[0]; /* touch_type:0: r-touch, 1: C-touch */ touch_type = 0; g_tpd_drv->tpd_local_init(); TPD_DMESG("[mtk-tpd]Generic touch panel driver\n"); } else { TPD_DMESG("[mtk-tpd]cap touch and Generic touch both are not loaded!!\n"); return 0; } } #ifdef CONFIG_HAS_EARLYSUSPEND #ifndef CONFIG_MTK_FPGA MTK_TS_early_suspend_handler.suspend = g_tpd_drv->suspend; MTK_TS_early_suspend_handler.resume = g_tpd_drv->resume; #ifdef CONFIG_EARLYSUSPEND register_early_suspend(&MTK_TS_early_suspend_handler); #endif #endif #endif #endif /* #ifdef TPD_TYPE_CAPACITIVE */ /* TPD_TYPE_CAPACITIVE handle */ if (touch_type == 1) { set_bit(ABS_MT_TRACKING_ID, tpd->dev->absbit); set_bit(ABS_MT_TOUCH_MAJOR, tpd->dev->absbit); set_bit(ABS_MT_TOUCH_MINOR, tpd->dev->absbit); set_bit(ABS_MT_POSITION_X, tpd->dev->absbit); set_bit(ABS_MT_POSITION_Y, tpd->dev->absbit); #if 0 /* linux kernel update from 2.6.35 --> 3.0 */ tpd->dev->absmax[ABS_MT_POSITION_X] = TPD_RES_X; tpd->dev->absmin[ABS_MT_POSITION_X] = 0; tpd->dev->absmax[ABS_MT_POSITION_Y] = TPD_RES_Y; tpd->dev->absmin[ABS_MT_POSITION_Y] = 0; tpd->dev->absmax[ABS_MT_TOUCH_MAJOR] = 100; tpd->dev->absmin[ABS_MT_TOUCH_MINOR] = 0; #else input_set_abs_params(tpd->dev, ABS_MT_POSITION_X, 0, TPD_RES_X, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_POSITION_Y, 0, TPD_RES_Y, 0, 0); #if defined(CONFIG_MTK_S3320) || defined(CONFIG_MTK_S3320_47) || defined(CONFIG_MTK_S3320_50) || defined(CONFIG_MTK_MIT200) || defined(CONFIG_TOUCHSCREEN_SYNAPTICS_S3528) || defined(CONFIG_MTK_S7020) input_set_abs_params(tpd->dev, ABS_MT_PRESSURE, 0, 255, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_WIDTH_MINOR, 0, 15, 0, 0); input_mt_init_slots(tpd->dev, 10, 0); #else input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MAJOR, 0, 100, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_TOUCH_MINOR, 0, 100, 0, 0); #endif /* CONFIG_MTK_S3320 */ #endif TPD_DMESG("Cap touch panel driver\n"); } /* #endif */ #if 0 /* linux kernel update from 2.6.35 --> 3.0 */ tpd->dev->absmax[ABS_X] = TPD_RES_X; tpd->dev->absmin[ABS_X] = 0; tpd->dev->absmax[ABS_Y] = TPD_RES_Y; tpd->dev->absmin[ABS_Y] = 0; tpd->dev->absmax[ABS_PRESSURE] = 255; tpd->dev->absmin[ABS_PRESSURE] = 0; #else input_set_abs_params(tpd->dev, ABS_X, 0, TPD_RES_X, 0, 0); input_set_abs_params(tpd->dev, ABS_Y, 0, TPD_RES_Y, 0, 0); input_abs_set_res(tpd->dev, ABS_X, TPD_RES_X); input_abs_set_res(tpd->dev, ABS_Y, TPD_RES_Y); input_set_abs_params(tpd->dev, ABS_PRESSURE, 0, 255, 0, 0); input_set_abs_params(tpd->dev, ABS_MT_TRACKING_ID, 0, 10, 0, 0); #endif if (input_register_device(tpd->dev)) TPD_DMESG("input_register_device failed.(tpd)\n"); else tpd_register_flag = 1; /* init R-Touch */ #if 0 if (touch_type == 0) { g_tpd_drv->tpd_local_init(); } #endif if (g_tpd_drv->tpd_have_button) { tpd_button_init(); } if (g_tpd_drv->attrs.num) tpd_create_attributes(&pdev->dev, &g_tpd_drv->attrs); return 0; }