屏是三大件中最首要的器件 下文以Mtk6755 Android9作为正文内容
主要涉及文件:
修改:
modified: device/mediateksample/k50v1_64_bsp/ProjectConfig.mk
modified: kernel-3.18/arch/arm64/configs/k50v1_64_bsp_debug_defconfig
modified: kernel-3.18/arch/arm64/configs/k50v1_64_bsp_defconfig
modified: kernel-3.18/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c
modified: kernel-3.18/drivers/misc/mediatek/lcm/mt65xx_lcm_list.h
modified: vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/mt65xx_lcm_list.c
modified: vendor/mediatek/proprietary/bootable/bootloader/lk/project/k50v1_64_bsp.mk
新增:
kernel-3.18/drivers/misc/mediatek/lcm/otm1282b_hd720_jd4p7/
vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/otm1282b_hd720_jd4p7/
lcm代码修改
otm1282b_hd720_jd4p7/Makefile
驱动编译文件添加obj-y += otm1282b_hd720_jd4p7.o
obj-y += otm1282b_hd720_jd4p7.o
ccflags-$(CONFIG_MTK_LCM) += -I$(srctree)/drivers/misc/mediatek/lcm/inc
otm1282b_hd720_jd4p7/otm1282b_hd720_jd4p7.c
1、驱动结构体名称修改
LCM_DRIVER otm1282b_hd720_jd4p7_lcm_drv =
{
.name = "otm1282b_hd720_jd4p7",//LCM 的型号名,lk的型号名和kernel 型号名必须保持一致,否则会重启
.set_util_funcs = lcm_set_util_funcs,
.compare_id = lcm_compare_id, //LCM ID 获取,只有在lk有效,lk在启动阶段会调用该接口,通过返回值来判断当前lcm模组与驱动匹配,用于多模组时驱动兼容设计
.get_params = lcm_get_params, //lcm 显示和mipi 时序参数配置
.init = lcm_init, //lcm 的初始化参数
.suspend = lcm_suspend, //休眠
.resume = lcm_resume, //唤醒
};
2、根据HW连接修改LCM类型、DSI模式、LCM大小配置基本信息
#define FRAME_WIDTH (720)
#define FRAME_HEIGHT (1280)
3、屛的初始化参数(需要屛厂给出参数,参数不对会导致花屏现象)
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, {}}
};
4、配置垂直线,水平像素及相关数据格式设置(对于时序的话,一般要求不高可以不需要改,如要改需要让屛厂提供)
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的信号强弱。
}
@关于PLL_CLOCK的计算
1、DSI vdo mode下的数据速率data_rate的大致计算公式为:
(Data rate) = (height + vsa + vbp + vfp) * (width + hsa + hbp + hfp) * total_bit_per_pixel * frame_per_second / total_lane_num
2、DSI cmd mode下的数据速率data_rate的大致计算公式为:
(Data rate) = widthheight1.2* total_bit_per_pixel*frame_per_second/total_lane_num
参数注释:
data_rate : 表示的是数据速率
width,height :屏幕分辨率
VSA VBP VFP :DSI vdo mode的vertical porch配置参数
HSA HBP HFP :DSI vdo mode的horizontal porch配置参数
total_bit_per_pixel :表示的是一个pixel需要用几个bit来表示,比如RGB565的话就是16个bit/RGB888就是24bit
frame_per_second :就是我们通常看到的fps,叫做帧率,表示每秒发送多少个帧,一般是60帧每秒
total_lane_num :表示的是data lane
DSI采用的是双边采样,则clk等于数据速率的一半,也就是说一个clk周期内传送2位,所以你计算出来的值还要除以2,即PLL_CLOCK(clk )= Data rate/2;
5、实现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);
}
kerne层修改
将对应的屏幕驱动放在
kernel-3.18/drivers/misc/mediatek/lcm/下
添加:
kernel-3.18/drivers/misc/mediatek/lcm/otm1282b_hd720_jd4p7/Makefile
kernel-3.18/drivers/misc/mediatek/lcm/otm1282b_hd720_jd4p7/otm1282b_hd720_jd4p7.c
kernel-3.18/arch/arm64/configs/k50v1_64_bsp_debug_defconfig
kernel-3.18/arch/arm64/configs/k50v1_64_bsp_defconfig
修改配置文件中的LCM名称和分辨率:
CONFIG_CUSTOM_KERNEL_LCM="otm1282b_hd720_jd4p7"
CONFIG_LCM_HEIGHT="1280"
CONFIG_LCM_WIDTH="720"
kernel-3.18/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c的LCM_DRIVER *lcm_driver_list[]
添加LCM的驱动型号到lcm_list中 注意大小写:
#if defined(OTM1282B_HD720_JD4P7)
&otm1282b_hd720_jd4p7_lcm_drv,
在lcm_list.h中添加LCM名称:
kernel-3.18/drivers/misc/mediatek/lcm/mt65xx_lcm_list.h
+extern LCM_DRIVER otm1282b_hd720_jd4p7_lcm_drv;
lk层修改
将对应的屏幕驱动放在
vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/下
添加:
kernel-3.18/drivers/misc/mediatek/lcm/otm1282b_hd720_jd4p7/Makefile
kernel-3.18/drivers/misc/mediatek/lcm/otm1282b_hd720_jd4p7/otm1282b_hd720_jd4p7.c
添加LCM的驱动型号到lcm_list中 注意大小写
vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/mt65xx_lcm_list.c
1:
extern LCM_DRIVER otm1282b_hd720_jd4p7_lcm_drv;
2:
在LCM_DRIVER *lcm_driver_list[]中添加
#if defined(OTM1282B_HD720_JD4P7)
&otm1282b_hd720_jd4p7_lcm_drv,
将新lcm的文件型号和对应的logo资源添加到lk的配置文件中
vendor/mediatek/proprietary/bootable/bootloader/lk/project/k50v1_64_bsp.mk
CUSTOM_LK_LCM="otm1282b_hd720_jd4p7"
BOOT_LOGO :=hd720
device下修改
修改项目对应的ProjectConfig.mk
device/mediateksample/k50v1_64_bsp/ProjectConfig.mk
LCM_HEIGHT = 1280
LCM_WIDTH = 720
BOOT_LOGO = hd720