搜索

374

主题

432

帖子

1524

积分

金牌会员

Rank: 6Rank: 6

积分
1524
发表于 2020-7-18 16:00:35 685 浏览 10 回复

MTK LCM porting

本帖最后由 tangh 于 2020-7-28 20:39 编辑

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驱动中,最主要的是了解该结构体中的成员函数运行过程
  1. LCM_DRIVER xxxx_hd720_lcm_drv =
  2. {
  3.     .name            ="xxxx_hd720_lcm_drv",   //LCM 的型号名,lk的型号名和kernel 型号名必须保持一致,否则会重启;
  4.     .set_util_funcs = lcm_set_util_funcs,
  5.     .get_params     = lcm_get_params,    //lcm 显示和mipi 时序参数配置,
  6.     .init           = lcm_init,             //lcm 的初始化参数
  7.     .suspend        = lcm_suspend,          /休眠
  8.     .resume         = lcm_resume,           //唤醒
  9.     .compare_id    = lcm_compare_id,  //LCM ID 获取,只有在lk有效,lk在启动阶段会调用该接口,通过返回值来判断当前lcm模组与驱动匹配,用语多模组时驱动兼容设计
  10. };
复制代码
开机启动会首先跑LK的中lcm驱动的.get_params和.init 给LCM模组进行初始化,其作用的生命周期一直到系统启动完成后,短按pwrkey或者自动休眠完成。
重新唤醒之后,就跑kernel 中lcm驱动中的.suspend和.resume;

注意:切记在调试过程中,如果lk和kernel中的lcm参数不一样(比如分辨率、型号名)开机系统会重启。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

374

主题

432

帖子

1524

积分

金牌会员

Rank: 6Rank: 6

积分
1524
 楼主| 发表于 2020-7-24 11:14:30
本帖最后由 tangh 于 2020-7-24 13:41 编辑

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
  1. LCM_DRIVER *lcm_driver_list[] = {
  2. #if defined(xxxx_HD720_DSI_VDO)
  3.         &xxxx_hd720_lcm_drv,
  4. #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,否则不会运行到新添加的屏驱动里面去。


回复

使用道具 举报

1

主题

7

帖子

99

积分

注册会员

Rank: 2

积分
99
发表于 2020-7-24 14:24:24
本帖最后由 software13 于 2020-7-25 10:03 编辑

在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
  1. LCM_DRIVER *lcm_driver_list[] = {
  2. #if defined(XXXX_HD720_DSI_VDO)
  3.           &xxxx_hd720_lcm_drv,
  4. #endif
复制代码
3.在lcm_list.h中添加LCM名称:kernel-3.18\drivers\misc\mediatek\lcm\mt65xx_lcm_list.h
  1. extern LCM_DRIVER xxxx_hd720_lcm_drv;
复制代码
4.修改配置文件中的LCM名称和分辨率:kernel-3.18\arch\arm64\configs\len6737m_65_sh_n_deconfig
  1. CONFIG_CUSTOM_KERNEL_LCM="xxxx_hd720_dsi_vdo"
  2. CONFIG_LCM_HEIGHT="480"
  3. CONFIG_LCM_WIDTH="800"
复制代码

回复

使用道具 举报

1

主题

7

帖子

99

积分

注册会员

Rank: 2

积分
99
发表于 2020-7-24 14:42:47
本帖最后由 software13 于 2020-7-25 10:33 编辑

MTK添加新屏驱动代码需要哪些地方?
1. 根据HW连接、LCM类型、DSI模式、LCM大小和PLL配置基本信息
  1. #define LCM_DSI_CMD_MODE                                                                        0
  2. #define FRAME_WIDTH                                                                                  (480)
  3. #define FRAME_HEIGHT                                                                                 (800)
复制代码
2. 屛的初始化参数(需要屛厂给出参数,参数不对会导致花屏现象)
  1. static struct LCM_setting_table lcm_initialization_setting[] = {
  2. // 屏幕配置初始化
  3.         {0xff,5,{0x77,0x01,0x00,0x00,0x10}},                                                               
  4.         {0xC0,2,{0x63,0x00}},                                                                             
  5.         {0xC1,2,{0x11,0x02}},                                                                             
  6.         {0xC2,2,{0x31,0x08}},   
  7. .........
  8.         {0xff,5,{0x77,0x01,0x00,0x00,0x00}},   
  9.         {0X29,0,{}},
  10.                     
  11. //以下一般不用改                                       
  12. {0x11,01,{0x00}},
  13. {REGFLAG_DELAY, 120, {}},  
  14. {0x29,01,{0x00}},      
  15. {REGFLAG_DELAY, 20, {}},  
  16. {REGFLAG_END_OF_TABLE, 0x00, {}}
  17. };
复制代码
3. 配置垂直线,水平像素及相关数据格式设置(对于时序的话,一般要求不高可以不需要改,如要改需要让屛厂提供)
  1. static void lcm_get_params(LCM_PARAMS *params)
  2. {
  3. params->width  = FRAME_WIDTH;
  4. params->height = FRAME_HEIGHT;
  5. // enable tearing-free
  6. params->dbi.te_mode                         = LCM_DBI_TE_MODE_VSYNC_ONLY;
  7. params->dbi.te_edge_polarity                = LCM_POLARITY_RISING;

  8. #if (LCM_DSI_CMD_MODE)
  9.                 params->dsi.mode   = CMD_MODE;
  10. #else
  11.         params->dsi.mode   =SYNC_PULSE_VDO_MODE; //SYNC_PULSE_VDO_MODE; //BURST_VDO_MODE;
  12.         //params->dsi.mode   = BURST_VDO_MODE;
  13. #endif

  14. // DSI
  15. /* Command mode setting */        
  16. params->dsi.LANE_NUM                        = LCM_TWO_LANE;//修改mipi通道数,根据实际模组打样来配置(询问FAE得知)
  17. params->dsi.data_format.format      = LCM_DSI_FORMAT_RGB888;
  18. //video mode timing
  19. params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;

  20. params->dsi.vertical_sync_active        = 4;//垂直同步信号的宽度
  21. params->dsi.vertical_backporch        = 16;//垂直同步信号的后沿
  22. params->dsi.vertical_frontporch        = 20;//垂直同步信号的前沿,可调节竖屏 上线白线条,闪屏
  23. params->dsi.vertical_active_line                                = FRAME_HEIGHT;

  24. params->dsi.horizontal_sync_active                        = 10;
  25. params->dsi.horizontal_backporch                        = 78;
  26. params->dsi.horizontal_frontporch                        = 80;
  27. params->dsi.horizontal_active_pixel                        = FRAME_WIDTH;

  28. params->dsi.PLL_CLOCK = 180;//lcm的频率,更据实际情况改动,这个一般mtk的都会影响gps的信号强弱。        

  29. }
复制代码
4.实现LCM休眠/恢复功能
  1. static void lcm_suspend(void)
  2. {
  3.     push_table(lcm_deep_sleep_mode_in_setting, sizeof(lcm_deep_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1);
  4.         SET_RESET_PIN(0);
  5.         MDELAY(10);
  6.         SET_RESET_PIN(1);
  7.         MDELAY(10);
  8.         SET_RESET_PIN(0);
  9.         MDELAY(120);

  10. static void lcm_resume(void)
  11. {
  12.         SET_RESET_PIN(1);
  13.         MDELAY(10);
  14.         SET_RESET_PIN(0);
  15.         MDELAY(10);
  16.         SET_RESET_PIN(1);
  17.         MDELAY(120);
  18.     push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
  19. }
复制代码


回复

使用道具 举报

1

主题

7

帖子

99

积分

注册会员

Rank: 2

积分
99
发表于 2020-7-25 10:43:09
在device文件夹下需要配置对应屏幕分辨率的LOGO(看文件夹下有以下哪个路径就改哪个路径):
device\mediateksample\len6737m_65_sh_n\ProjectConfig.mk
device\lentek\len6737m_65_sh_n\ProjectConfig.mk
  1. BOOT_LOGO = wvga (对应LOGO名在该路径下找:vendor\mediatek\proprietary\bootable\bootloader\lk\dev\logo)
  2. LCM_HEIGHT = 800
  3. LCM_WIDTH = 480
复制代码


回复

使用道具 举报

1

主题

7

帖子

99

积分

注册会员

Rank: 2

积分
99
发表于 2020-7-27 16:37:17
关于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) = width*height*1.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;    
回复

使用道具 举报

374

主题

432

帖子

1524

积分

金牌会员

Rank: 6Rank: 6

积分
1524
 楼主| 发表于 2020-7-29 14:15:39
lcm_get_params解析说明

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

2

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2020-9-3 11:42:46
请问驱动文件夹xxxx_hd720_dsi_vdo下还需要创建.c的驱动文件和Makefile文件吗?
回复

使用道具 举报

374

主题

432

帖子

1524

积分

金牌会员

Rank: 6Rank: 6

积分
1524
 楼主| 发表于 2020-9-3 14:27:25
adam 发表于 2020-9-3 11:42
请问驱动文件夹xxxx_hd720_dsi_vdo下还需要创建.c的驱动文件和Makefile文件吗?

这是当然了,你没驱动,代码怎么跑呢? 你屏又怎么会亮呢?比如ili9881c_hd720_dsi_vdo.c就是屏的驱动文件。
回复

使用道具 举报

0

主题

2

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2020-9-9 15:35:56
LCM_setting_table默认结构体申明的是3个参数,新的屏幕厂商给出的参数中多了一个屏幕数据识别参数,请问这个要怎么写?
回复

使用道具 举报

下一页 »
12下一页
返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


登录或注册
快速回复 返回顶部 返回列表