Android系统开机启动过程及驱动概述:
MTK平台的显示驱动分两块,一块在LK代码里面,一块在kernel代码里面;
lk的lcm驱动路径在:vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\xxxx_hd720_dsi_vdo
kernel的lcm驱动路径在:kernel-x.x\drivers\misc\mediatek\lcm\xxxx_hd720_dsi_vdo
lcm驱动中,最主要的是了解该结构体中的成员函数运行过程:
LCM_DRIVER xxxx_hd720_lcm_drv =
{
.name ="xxxx_hd720_lcm_drv", //LCM 的型号名,lk的型号名和kernel 型号名必须保持一致,否则会重启;
.set_util_funcs = lcm_set_util_funcs,
.get_params = lcm_get_params, //lcm 显示和mipi 时序参数配置,
.init = lcm_init, //lcm 的初始化参数
.suspend = lcm_suspend, /休眠
.resume = lcm_resume, //唤醒
.compare_id = lcm_compare_id, //LCM ID 获取,只有在lk有效,lk在启动阶段会调用该接口,通过返回值来判断当前lcm模组与驱动匹配,用语多模组时驱动兼容设计
};
开机启动会首先跑LK的中lcm驱动的.get_params和.init给LCM模组进行初始化,其作用的生命周期一直到系统启动完成后,短按pwrkey或者自动休眠完成。 重新唤醒之后,就跑kernel中lcm驱动中的.suspend和.resume;
注意:切记在调试过程中,如果lk和kernel中的lcm参数不一样(比如分辨率、型号名)开机系统会重启。
MTK平台如何添加新屏驱动的支持?
首先要了解清楚本身本身的硬件特性:
比如分辨率最高支持到多少(MTK平台还比较关心当前的LCM显示屏是物理竖屏还是物理横屏,MTK的手机平台有默认不支持竖屏之说)?最多能支持几通道的mipi-DSI?
LK部分如何添加新lcm型号支持?
1、将新LCM的驱动xxxx_hd720_dsi_vdo文件夹放在vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm下面;
2、添加LCM的驱动型号到lcm_list中,修改文件如下:
vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\mt65xx_lcm_list.c
LCM_DRIVER *lcm_driver_list[] = {
#if defined(xxxx_HD720_DSI_VDO)
&xxxx_hd720_lcm_drv,
#endif
3、将新lcm的文件型号添加到lk的配置文件中:
vendor\mediatek\proprietary\bootable\bootloader\lk\project\xx_xx_bsp.mk
在CUSTOM_LK_LCM添加你要添加的屏型号,比如:CUSTOM_LK_LCM=“xxxx_hd720_dsi_vdo”
注意:LCM驱动文件夹名要跟lk配置文件的字符串名保持一直xxxx_hd720_dsi_vdo,否则会编译不进去;
lcm_list中添加支持lcm驱动的宏定义,需要将字符大写XXXX_HD720_DSI_VDO,否则不会运行到新添加的屏驱动里面去。
在Kernel部分,添加新lcm型号支持步骤:
1、将新LCM的驱动文件 xxxx_hd720_dsi_vdo 文件夹放在 kernel-3.18\drivers\misc\mediatek\lcm下 驱动文件的命名格式为:型号_分辨率_MIPI接口_接口下SYNC模式
1)MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口)、DPI(也叫RGB接口)、DSI
2)接口下SYNC模式:DSI接口有两种sync 模式:video mode和command mode,其中video mode是BB端一直刷数据到LCM,cmd mode是在有数据更新时刷数据到LCM GRAM中)
2、将LCM的驱动型号添加到lcm_list.c中:kernel-3.18\drivers\misc\mediatek\lcm\mt65xx_lcm_list.c
LCM_DRIVER *lcm_driver_list[] = {
#if defined(XXXX_HD720_DSI_VDO)
&xxxx_hd720_lcm_drv,
#endif
3、在lcm_list.h中添加LCM名称:kernel-3.18\drivers\misc\mediatek\lcm\mt65xx_lcm_list.h
extern LCM_DRIVER xxxx_hd720_lcm_drv;
4、修改配置文件中的LCM名称和分辨率:kernel-3.18\arch\arm64\configs\len6737m_65_sh_n_deconfig
CONFIG_CUSTOM_KERNEL_LCM="xxxx_hd720_dsi_vdo"
CONFIG_LCM_HEIGHT="480"
CONFIG_LCM_WIDTH="800"
MTK添加新屏驱动代码需要哪些地方?
1、根据HW连接、LCM类型、DSI模式、LCM大小和PLL配置基本信息
#define LCM_DSI_CMD_MODE 0
#define FRAME_WIDTH (480)
#define FRAME_HEIGHT (800)
2、 屛的初始化参数(需要屛厂给出参数,参数不对会导致花屏现象)
static struct LCM_setting_table lcm_initialization_setting[] = {
// 屏幕配置初始化
{0xff,5,{0x77,0x01,0x00,0x00,0x10}},
{0xC0,2,{0x63,0x00}},
{0xC1,2,{0x11,0x02}},
{0xC2,2,{0x31,0x08}},
.........
{0xff,5,{0x77,0x01,0x00,0x00,0x00}},
{0X29,0,{}},
//以下一般不用改
{0x11,01,{0x00}},
{REGFLAG_DELAY, 120, {}},
{0x29,01,{0x00}},
{REGFLAG_DELAY, 20, {}},
{REGFLAG_END_OF_TABLE, 0x00, {}}
};
3、 配置垂直线,水平像素及相关数据格式设置(对于时序的话,一般要求不高可以不需要改,如要改需要让屛厂提供)
static void lcm_get_params(LCM_PARAMS *params)
{
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
// enable tearing-free
params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY;
params->dbi.te_edge_polarity = LCM_POLARITY_RISING;
#if (LCM_DSI_CMD_MODE)
params->dsi.mode = CMD_MODE;
#else
params->dsi.mode =SYNC_PULSE_VDO_MODE; //SYNC_PULSE_VDO_MODE; //BURST_VDO_MODE;
//params->dsi.mode = BURST_VDO_MODE;
#endif
// DSI
/* Command mode setting */
params->dsi.LANE_NUM = LCM_TWO_LANE;//修改mipi通道数,根据实际模组打样来配置(询问FAE得知)
params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
//video mode timing
params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
params->dsi.vertical_sync_active = 4;//垂直同步信号的宽度
params->dsi.vertical_backporch = 16;//垂直同步信号的后沿
params->dsi.vertical_frontporch = 20;//垂直同步信号的前沿,可调节竖屏 上线白线条,闪屏
params->dsi.vertical_active_line = FRAME_HEIGHT;
params->dsi.horizontal_sync_active = 10;
params->dsi.horizontal_backporch = 78;
params->dsi.horizontal_frontporch = 80;
params->dsi.horizontal_active_pixel = FRAME_WIDTH;
params->dsi.PLL_CLOCK = 180;//lcm的频率,更据实际情况改动,这个一般mtk的都会影响gps的信号强弱。
}
4、实现LCM休眠/恢复功能
static void lcm_suspend(void)
{
push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1);
SET_RESET_PIN(0);
MDELAY(10);
SET_RESET_PIN(1);
MDELAY(10);
SET_RESET_PIN(0);
MDELAY(120);
}
static void lcm_resume(void)
{
SET_RESET_PIN(1);
MDELAY(10);
SET_RESET_PIN(0);
MDELAY(10);
SET_RESET_PIN(1);
MDELAY(120);
push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
}
在device文件夹下需要配置对应屏幕分辨率的LOGO(看文件夹下有以下哪个路径就改哪个路径):
device\mediateksample\len6737m_65_sh_n\ProjectConfig.mk
device\lentek\len6737m_65_sh_n\ProjectConfig.mk
BOOT_LOGO = wvga (对应LOGO名在该路径下找:vendor\mediatek\proprietary\bootable\bootloader\lk\dev\logo)
LCM_HEIGHT = 800
LCM_WIDTH = 480