void platform_early_init(void)
{
g_fb_size = mt_disp_get_vram_size();
}
UINT32 mt_disp_get_vram_size(void)
{
return DISP_GetVRamSize();
}
UINT32 DISP_GetVRamSize(void)
{
![mtk lk disp dispair](http://img.413yy.cn/images/31101031/31020650t01db547f77a1c49fe7.jpg)
if (0 == vramSize)
{
disp_drv_init_context();
}
}
void platform_init(void)
{
#ifndef DISABLE_DISPLAY_IN_LK_FOR_82_BRINGUP
mt_disp_init((void *)g_fb_base);
#endif
}
mt_disp_drv.c
void mt_disp_init(void *lcdbase)
{
if(DISP_STATUS_OK != DISP_Change_LCM_Resolution(lcm_fake_width, lcm_fake_height))
DISP_CHECK_RET(DISP_Init((UINT32)lcdbase, (UINT32)lcdbase, FALSE));
}
disp_drv.c
static const DISP_DRIVER *disp_drv = NULL;
const LCM_DRIVER *lcm_drv = NULL;
static BOOL isLCMFound = FALSE;
static BOOL isLCMConnected = FALSE;
主要函数
DISP_STATUS DISP_Init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited)
{
if (!disp_drv_init_context()){
return DISP_STATUS_NOT_IMPLEMENTED;
}
r = (disp_drv->init) ?
(disp_drv->init(fbVA, fbPA, isLcmInited)) :
}
static BOOL disp_drv_init_context(void)
{
if(!isLCMFound)
DISP_DetectDevice();
}
BOOL DISP_DetectDevice(void)
{
lcm_drv = disp_drv_get_lcm_driver(NULL);
disp_dump_lcm_parameters(lcm_params);
}
mt65xx_lcm_list.c
unsigned int lcm_count = sizeof(lcm_driver_list)/sizeof(LCM_DRIVER*);
extern unsigned int lcm_count;
const LCM_DRIVER *disp_drv_get_lcm_driver(const char *lcm_name)
{
printk("[LCM Auto Detect], we have %d lcm drivers built inn", lcm_count);
printk("[LCM Auto Detect], try to find driver for [%s]n",
if(lcm_count ==1)
{
lcm = lcm_driver_list[0];
lcm->set_util_funcs(&lcm_utils);
lcm->get_params(&s_lcm_params);
u4IndexOfLCMList = 0;
lcm_params = &s_lcm_params;
lcm_drv = lcm;
isLCMFound = TRUE;
goto done;
}
done:
if(LCM_TYPE_DSI == lcm_params->type)
{
init_dsi(FALSE);
MASKREG32(DSI_BASE + 0x10, 0x2, 0x2);
data_array[0] = 0x00043700;
DSI_set_cmdq(data_array, 1, 1);
ret = DSI_dcs_read_lcm_reg_v2(0x2A, &buffer,4);
if(ret == 0)
{
isLCMConnected = 0;
printk("lcm is not connectedn");
}
else
{
isLCMConnected = 1;
printk("lcm is connected,return size = %dn",ret);
}
DSI_Deinit();
}
return lcm_drv;
}
DSI_dcs_read_lcm_reg_v2(0x0A, &buffer,1);
此语句是读取Display Power Mode
1.dsi
disp_drv_dsi.c
void init_dsi(BOOL isDsiPoweredOn)
{
//initialize DSI_PHY
DSI_PHY_clk_setting(lcm_params);
DSI_CHECK_RET(DSI_Init(isDsiPoweredOn));
}
UINT32 DSI_dcs_read_lcm_reg_v2(UINT8 cmd, UINT8 *buffer, UINT8 buffer_size)
{
do
{
t0.CONFG = 0x04; ///BTA
t0.Data0 = cmd;
if (buffer_size < 0x3)
t0.Data_ID = DSI_DCS_READ_PACKET_ID;
else
t0.Data_ID = DSI_GERNERIC_READ_LONG_PACKET_ID;
t0.Data1 = 0;
while(DSI_REG->DSI_INTSTA.RD_RDY == 0) ///read clear
{
///keep polling
msleep(1);
read_timeout_ms --;
if(read_timeout_ms == 0)
{
DISP_LOG_PRINT(ANDROID_LOG_INFO, "DSI", " Polling DSI read ready timeout!!!n");
DSI_DumpRegisters();
///do necessary reset here
DSI_Reset();
return 0;
}
}
}