需要的资料
屏幕厂商资料
供应商一般会提供一份包含供电电压、初始化代码、proch参数、屏幕尺寸的txt文档参考如下,和相应的屏幕规格书
TXT文档如下
EK79007+BOE7.0 IPS 1024x600_IPS //IC型号、封装厂商、玻璃、屏幕尺寸
//以下为电压
VDD= 1.8V
RESET=VDD;
STBYB=VDD;
VGH= 18V
VGL= -6V
AVDD= 9.6V
VCOM= 3.2V(TPY.)
//以下为proch参数
MIPI CLK Speed:340Mbps(170MHZ)
H back porch:160
H front porch:160
H pulse width:10
V back porch:23
V front porch:12
V pulse width:1
//以下为初始化参数
MIPI command:
regw(0x80,0xAB);
regw(0x81,0x4B);//00=1LANE 01=2LANE 10=3LANE 11=4LANE
regw(0x82,0x84);
regw(0x83,0x88);
regw(0x84,0xA8);
regw(0x85,0xE3);
regw(0x86,0xB8);
注:請用MIPI短包(0x15)下初始化
规格书部分内容如下
主板硬件资料
主板硬件资料一般需要注意的有以下几个点
1、各个电源的使能引脚,reset的引脚
如我拿到的主板原理图的VDD是通过LDO产生的,故需要查看LDO是否使用对应电压的LDO,使能引脚是否使能。
又比如该屏幕需要使用VGL VGH我拿到的主板是通过同一个DCDC搭配不同外设通过二极管隔离达到的,实际上只需要一个引脚控制DCDC的使能。
2、mipi lane
我拿到的主板是默认支持4lane故可以直接使用该参数
兼容
屏幕的兼容我是参考
https://blog.csdn.net/hismee/article/details/107185470
这个链接进行配置的,以下是我的配置方式
LK阶段
路径:
vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm
首先复制源代码内的一个屏幕(最好是IC相同的)
我复制的屏幕为EK79007_WSVGALNL_DSI_VDO
将文件夹EK79007_WSVGALNL_DSI_VDO复制并从命名为EK79007_BOE_70_IPS(名字可以自己取)
并将内部的.C文件修改为ek79007_boe_70_ips(名字可以自己取,但是建议与文件夹相同,区分大小写)
1、将初始化代码替换
以下为修改后初始化代码
static struct LCM_setting_table lcm_initialization_setting[] =
{
{0x80,1,{0xAB}},
{0x81,1,{0x4B}},
{0x82,1,{0x84}},
{0x83,1,{0x88}},
{0x84,1,{0xA8}},
{0x85,1,{0xE3}},
{0x86,1,{0xB8}},
{0x11,1,{0x00}},
{REGFLAG_DELAY,150,{}},
{0x29,1,{0x00}},
{REGFLAG_END_OF_TABLE, 0x00, {}},
};
修改前
static struct LCM_setting_table lcm_initialization_setting[] =
{
{0x25,1,{0x55}},
{0x36,1,{0x01}},
//{0x25,1,{0x00}},
{0xB1,1,{0x30}},
{0xB2,1,{0x10}},
{0x80,1,{0x47}},
{0x81,1,{0x40}},
{0x82,1,{0x04}},
{0x83,1,{0x77}},
{0x84,1,{0x0f}},
{0x85,1,{0x70}},
{0x86,1,{0x70}},
//{0x25,1,{0x00}},
//{0x11,1,{0x00}},
{REGFLAG_DELAY,150,{}},
//{0x29,1,{0x00}},
//{REGFLAG_DELAY,70,{}},
{REGFLAG_END_OF_TABLE, 0x00, {}},
};
2、修改proch参数
原始代码
static void lcm_get_params(LCM_PARAMS *params)
{
memset(params, 0, sizeof(LCM_PARAMS));
params->type = LCM_TYPE_DSI;
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
#if (LCM_DSI_CMD_MODE)
params->dsi.mode = CMD_MODE;
#else
params->dsi.mode = BURST_VDO_MODE; //SYNC_EVENT_VDO_MODE; //SYNC_PULSE_VDO_MODE;
#endif
// DSI
/* Command mode setting */
// Three lane or Four lane
params->dsi.LANE_NUM = LCM_TWO_LANE;
//The following defined the fomat for data coming from LCD engine.
params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST;
params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB;
params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
// Highly depends on LCD driver capability.
// Not support in MT6573
params->dsi.packet_size=256;
// Video mode setting
params->dsi.intermediat_buffer_num = 0;
params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
params->dsi.word_count=FRAME_WIDTH*3;
params->dsi.vertical_sync_active = 10;
params->dsi.vertical_backporch = 8;
params->dsi.vertical_frontporch = 6;
params->dsi.vertical_active_line = FRAME_HEIGHT;
params->dsi.horizontal_sync_active = 10;
params->dsi.horizontal_backporch = 60;
params->dsi.horizontal_frontporch = 60;
params->dsi.horizontal_blanking_pixel = 60;
params->dsi.horizontal_active_pixel = FRAME_WIDTH;
// Bit rate calculation
// Every lane speed
//params->dsi.pll_div1=0; // div1=0,1,2,3;div1_real=1,2,4,4
//params->dsi.pll_div2=0; // div2=0,1,2,3;div1_real=1,2,4,4
//params->dsi.fbk_div =0x12; // fref=26MHz, fvco=fref*(fbk_div+1)*2/(div1_real*div2_real)
params->dsi.cont_clock = 1;
params->dsi.ssc_disable = 0;
params->dsi.PLL_CLOCK = 300;
}
其中 params->dsi.LANE_NUM 为LANE的线数 我这里使用4LINE 修改为
params->dsi.LANE_NUM = LCM_FOUR_LANE;
参数 | 对应txt中的参数 |
---|---|
params->dsi.vertical_sync_active | V pulse width (也叫VSC) |
params->dsi.vertical_backporch | V back porch (也叫VBP) |
params->dsi.vertical_frontporch | V front porch (也叫VFP) |
params->dsi.horizontal_sync_active | V pulse width(也叫HSC) |
params->dsi.horizontal_backporch | H back porch(也叫HBP) |
params->dsi.horizontal_frontporch | H front porch (也叫HFP) |
params->dsi.vertical_active_line | 屏幕V方向尺寸 |
params->dsi.horizontal_active_pixel | 屏幕H方向尺寸 |
由于各家FAE叫法不同,如不清楚的 可以直接找FAE沟通
params->dsi.PLL_CLOCK 该参数个人也没有研究清楚具体的对应公式,我直接使用的值为MIPI CLK Speed 中的170。有大神可以提点一下小弟
我参考的是文档
https://blog.csdn.net/zuoyioo7/article/details/79021459?spm=1001.2014.3001.5502
3、修改各种GPIO引脚
首先根据硬件原理图找到具体的引脚标号,然后修改dws文件
vendor\mediatek\proprietary\bootable\bootloader\lk\target\tb8765ap1_bsp_1g_k419\dct\dct\codegen.dws
vendor\mediatek\proprietary\bootable\bootloader\preloader\custom\tb8765ap1_bsp_1g_k419\dct\dct\codegen.dws
其中tb8765ap1_bsp_1g_k419 为项目名称
原始代码中初始化使用的引脚通过GPIO_LCM_RST 宏定义的reset
通过GPIO_LCD_BL_EN定义的背光引脚
代码如下
#ifdef GPIO_LCM_PWR_EN
#define GPIO_LCD_PWR_EN GPIO_LCM_PWR_EN
#else
#define GPIO_LCD_PWR_EN 0xFFFFFFFF
#endif
#ifdef GPIO_LCM_RST
#define GPIO_LCD_RST GPIO_LCM_RST
#else
#define GPIO_LCD_RST 0xFFFFFFFF
#endif
#ifdef GPIO_LCM_BL_EN
#define GPIO_LCD_BL_EN GPIO_LCM_BL_EN
#else
#define GPIO_LCD_BL_EN 0xFFFFFFFF
#endif
我修改为
#define GPIO_LCM_RESET (GPIO83 | 0x80000000)
#define GPIO_LCM_POWER18 (GPIO13 | 0x80000000) //该IO是控制VDD的
#define GPIO_LCM_POWER33 (GPIO124 | 0x80000000) //该IO是控制vgh vgl avdd vcom的电压的
然后在函数lcm_init lcm_suspend中修改对应的代码,以满足规格书提供的时序
4、读取ID
lcm_compare_id函数为读取id的函数,初步调试的时候建议不读取ID,由于该IC的屏幕读取ID有问题,故默认代码也未读取ID,如需要读取ID,可以参考其他屏幕的该部分代码。要注意屏幕读取ID的寄存器操作说明。
5、修改屏幕名称
原始代码
LCM_DRIVER ek79007_wsvgalnl_dsi_vdo_lcm_drv =
{
.name = "EK79007_WSVGALNL_DSI_VDO",
将以上的ek79007_wsvgalnl_dsi_vdo_lcm_drv 修改一个vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\mt65xx_lcm_list.c 内没有的名称
.name 这个值可以自己取,只是一串字符串,但是注意与后续修改的kernel内保持一致
LCM_DRIVER ek79007_boe_70_ips_wsvga_dsi_lcm_drv =
{
.name = "ek79007_boe_70_ips",
6、将添加的屏幕加入编译
将文件夹内的makefile内的
obj-y += VVX10F008B00_WUXGA_DSI_VDO.o
修改为
obj-y += ek79007_boe_70_ips.o
注意 名称与文件夹内的.C文件一样,且区分大小写。
在以下文件内
vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\mt65xx_lcm_list.c
添加
#if defined(EK79007_BOE_70_IPS)
extern LCM_DRIVER ek79007_boe_70_ips_wsvga_dsi_lcm_drv;
#endif
以及在
LCM_DRIVER *lcm_driver_list[] = {
数组内添加
#if defined(EK79007_BOE_70_IPS)
&ek79007_boe_70_ips_wsvga_dsi_lcm_drv,
#endif
最后在文件
vendor\mediatek\proprietary\bootable\bootloader\lk\project\tb8765ap1_bsp_1g_k419.mk
修改
CUSTOM_LK_LCM="ek79007_boe_70_ips"
以及修改
BOOT_LOGO := wsvga
其中CUSTOM_LK_LCM 后面的参数记得带引号,参数值与#if defined(EK79007_BOE_70_IPS) 内的参数有关全小写
BOOT_LOGO的参数后面的wsvga 参数值与屏幕尺寸有关,根据屏幕尺寸选择(可以参考https://blog.csdn.net/hismee/article/details/107185470 文档内,有部分尺寸说明)vendor\mediatek\proprietary\bootable\bootloader\lk\dev\logo\文件内的不同文件夹名称,如没有可以添加
修改
device\mediateksample\tb8765ap1_bsp_1g_k419\ProjectConfig.mk
内的
BOOT_LOGO
LCM_HEIGHT
LCM_WIDTH
其中tb8765ap1_bsp_1g_k419 这个对应项目名称
BOOT_LOGO 与vendor\mediatek\proprietary\bootable\bootloader\lk\project\tb8765ap1_bsp_1g_k419.mk 内的logo相同
LCM_HEIGHT LCM_WIDTH 为屏幕尺寸
以上LK部分代码修改基本完毕
kernel阶段
1、添加屏幕的文件
由于安卓12最低要求使用kernel4.19故需要在以下路径
kernel-4.19\drivers\misc\mediatek\lcm
同样复制相似的屏幕 修改文件夹名称和文件名称(与LK阶段相同)
2、修改初始化代码
内容同LK阶段,可以直接将LK阶段的代码直接拷贝
3、修改GPIO
修改
kernel-4.19\drivers\misc\mediatek\dws\mt6739\tb8765ap1_bsp_1g_k419.dws
同时也需要按照LK的方式修改 kernel阶段的时序
同时kernel阶段的gpio建议通过设备树读取
可以在kernel-4.19\drivers\misc\mediatek\lcm\文件夹目录内添加读取设备树的.文件并修改makefile
并通过late_initcall 函数使其调用
4、修改屏幕名称
屏幕名称应与IK相同,建议LCM_DRIVER的指针名称也跟LK相同
5、将添加的屏幕添加并编译到软件中
在文件
kernel-4.19\drivers\misc\mediatek\lcm\mt65xx_lcm_list.h
内添加
#if defined(EK79007_BOE_70_IPS)
extern struct LCM_DRIVER ek79007_boe_70_ips_wsvga_dsi_lcm_drv;
#endif
并在
kernel-4.19\drivers\misc\mediatek\lcm\mt65xx_lcm_list.c
文件内的
struct LCM_DRIVER *lcm_driver_list[] = {
数组内添加
#if defined(EK79007_BOE_70_IPS)
&ek79007_boe_70_ips_wsvga_dsi_lcm_drv,
#endif
最后在
kernel-4.19\arch\arm\configs\tb8765ap1_bsp_1g_k419_debug_defconfig
kernel-4.19\arch\arm\configs\tb8765ap1_bsp_1g_k419_defconfig
文件内修改
CONFIG_CUSTOM_KERNEL_LCM
CONFIG_LCM_HEIGHT
CONFIG_LCM_WIDTH
以上三个参数
CONFIG_CUSTOM_KERNEL_LCM="ek79007_boe_70_ips"
CONFIG_LCM_HEIGHT="600"
CONFIG_LCM_WIDTH="1024"
以上屏幕基本添加完成
在调试过程中遇到问题可以多与FAE沟通。
特别强调一点(我遇到的大坑),MTK在安卓11(我知道的是)开始,代码内默认打开了AAL,如果没有AAL的许可证,会出现在kernel阶段息屏后不能点亮屏幕,且在log中有
AAL is not working:no license key
参考FAQ22764将AAL关闭
一般建议关闭 MTK_AAL_SUPPORT 宏
附上FAQ内的部分内容
AAL requires a license, if you have already obtained it, Please
configuration as follows:
(1)device/mediatek/[Project]/ProjectConfig.mk
MTK_AAL_SUPPORT = yes
(2)kernel/arch/arm64/configs/Myproject_debug_defconfig
CONFIG_MTK_AAL_SUPPORT=y
(3)vendor\mediatek\proprietary\custom&project\hal\aal\cust_aal.cpp
int InitFunction = 2; //enable CABC InitFunction = 0 : CABC and DRE disable InitFunction = 2 : CABC enable InitFunction = 4 :
DRE enable InitFunction = 6 : DRE and CABC enable Then, full build
this project.
参考文档:
1、https://blog.csdn.net/hismee/article/details/107185470
2、https://blog.csdn.net/hffyfdt/article/details/84021383
3、http://blog.chinaunix.net/uid-12461657-id-3244929.html
4、https://blog.csdn.net/zuoyioo7/article/details/79021459?spm=1001.2014.3001.5502
5、https://blog.csdn.net/zuoyioo7/article/details/79021936?spm=1001.2014.3001.5502
6、https://blog.csdn.net/zuoyioo7/article/details/78961675?spm=1001.2014.3001.5502