如何验证MTK的触摸屏自己点与LCM的点是否对应

本版文章用户
后使用快捷导航没有帐号?
手机&智能终端
元器件/物料库
当前位置:
查看: 1822|回复: 2
MT6575都是横屏模式,如何改成竖屏
现在是板子上开机logo,解锁界面,桌面。简单的说就是平板横屏的样子,现在能不能改成竖屏的。也就是全部都改成竖屏。
拒绝修改ProjectConfig.mk 的 __PHYSICAL_ROTATION=90。因为这样会出现很多问题。谢谢
(70.85 KB, 下载次数: 3)
15:25 上传
技术词条:
不修改LCM角度,只能改下开机logo和动画了,做个假的竖屏开机。这个很简单
要真正改竖屏,还是要改LCM,视频通话,camera,重力sensor,数据流,等等,一大堆,从上层到底层。我改了整整一个月才搞定
lkykk 发表于
不修改LCM角度,只能改下开机logo和动画了,做个假的竖屏开机。这个很简单
要真正改竖屏,还是要改LCM,视频 ...
应该没那么夸张吧?
一牛交流学习 欢迎加入(限2个/人)
Android驱动开发技术培训
基带硬件技术交流
射频技术培训班
pcb layout交流群
全志技术交流群
no-iot行业交流
驱动专家群
IC设计技术交流
上海及周边会员交流群
北京及周边会员交流群
成都及周边会员交流群
no-iot行业交流
展开版块导航
获取手机验证码配置lcm背光的控制脚
lcm背光控制主要有两个引脚:使能脚EN和亮度控制引脚VFB。使能脚用来控制背光的使能与否,比如这里是1为enable,0为disable;亮度控制引脚则是用来接PWM输出,通过PWM的占空比来控制背光亮度,这里是低为亮,高为灭。
所以在这两个引脚的连接和配置上要保证EN连接至gpio上,而VFB则连接至BB的PWM输出口,然后通过dct工具将上述引脚配置成对应的mode。
mediatek/custom/bbk75_ics/uboot/cust_leds.c
在 cust_led_list数组中更改 lcd-backlight的配置为pwm:
static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
//{"lcd-backlight",
MT65XX_LED_MODE_CUST, (int)DISP_SetBacklight,{0}},
{"lcd-backlight",
MT65XX_LED_MODE_PWM, PWM1,{0}},
mediatek/platform/mt6575/uboot/mt65xx_leds.c
在 mt65xx_led_set_cust中添加对lcm使能脚的控制,以更好地对屏幕的亮灭进行控制:
case MT65XX_LED_MODE_PWM:
if(strcmp(cust-&name,"lcd-backlight") == 0)
if(level == 0)
mt_set_gpio_out(BACKLIGHT_EN_PIN,GPIO_OUT_ZERO);
if (level & 80) level =80;
level = level/4;
brightness_set_pwm(cust-&data, level,&(cust-&config_data));
udelay(10000);
mt_set_gpio_out(BACKLIGHT_EN_PIN,GPIO_OUT_ONE);
//return brightness_set_pwm(cust-&data, level,&cust-&config_data);
return led_set_pwm(cust-&data, level);
case MT65XX_LED_MODE_GPIO:
以下两个函数同步更改:
void mt65xx_backlight_on(void)
printf("[LEDS]uboot: mt65xx_backlight_on \n\r");
mt_set_gpio_mode(BACKLIGHT_EN_PIN, GPIO_MODE_00);// GPIO MODE
mt_set_gpio_dir(BACKLIGHT_EN_PIN, GPIO_DIR_OUT);
mt_set_gpio_out(BACKLIGHT_EN_PIN, GPIO_OUT_ONE);
mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_FULL);
void mt65xx_backlight_off(void)
printf("[LEDS]uboot: mt65xx_backlight_off \n\r");
mt_set_gpio_mode(BACKLIGHT_EN_PIN, GPIO_MODE_00);// GPIO MODE
mt_set_gpio_dir(BACKLIGHT_EN_PIN, GPIO_DIR_OUT);
mt_set_gpio_out(BACKLIGHT_EN_PIN, GPIO_OUT_ZERO);
mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_OFF);
配置kernel
mediatek/custom/bbk75_ics/kernel/leds/mt65xx/cust_leds.c
将背光led的控制方式更改为pwm:
static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
///{"lcd-backlight",
MT65XX_LED_MODE_CUST, (int)Cust_SetBacklight,{0}},
{"lcd-backlight",
MT65XX_LED_MODE_PWM, PWM1,{0}},
mediatek/source/kernel/drivers/leds/leds.c
和uboot一样,在 mt65xx_led_set_cust中添加对lcm使能脚的控制,以更好地对屏幕的亮灭进行控制:
if (level & LED_FULL)
level = LED_FULL;
else if (level & 0)
level = 0;
mt_set_gpio_mode(BACKLIGHT_EN_PIN, GPIO_MODE_GPIO);
mt_set_gpio_dir(BACKLIGHT_EN_PIN, GPIO_DIR_OUT);
mt_set_gpio_mode(BACKLIGHT_VFB_PIN, GPIO_MODE_01);
mt_set_gpio_dir(BACKLIGHT_VFB_PIN, GPIO_DIR_OUT); //GPIO_PWM_1_PIN_M_PWM
printk("mt65xx_leds_set_cust: set brightness, name:%s, mode:%d, level:%d\n",
cust-&name, cust-&mode, level);
switch (cust-&mode) {
case MT65XX_LED_MODE_PWM:
if(strcmp(cust-&name,"lcd-backlight") == 0)
bl_brightness = level;
if(level == 0)
mt_set_gpio_out(BACKLIGHT_EN_PIN,GPIO_OUT_ZERO);
mt_set_pwm_disable(cust-&data);
mt_power_off (cust-&data);
level = brightness_mapping(tmp_level);
if(level & 0 && level & 20 ) level = 20;//45
if ( level & 195 )
level=(level-20)/7;
level=level - 20 ;
level=(level-175)/4;
level=level+25;
if (level & 244 && level & 255) level =244; //level 37
//if (level & 54) level = 54;
backlight_set_pwm(cust-&data, level, bl_div,&(cust-&config_data));
mt_set_gpio_out(BACKLIGHT_EN_PIN,GPIO_OUT_ONE);
bl_duty = level;
if(level == 0)
led_tmp_setting.nled_mode = NLED_OFF;
led_tmp_setting.nled_mode = NLED_ON;
led_set_pwm(cust-&data,&led_tmp_setting);
case MT65XX_LED_MODE_GPIO:
如果uboot中将VFB配置成了gpio并且输出低使背光一直保持全亮,在进入kernel后通过代码再将其设置为pwm模式,这理应是ok的;但现实就是不行,这样会导致背光不能调节(不过由于没有量波形,故不知是有波形输出还是仍一直输出低电平),就在这里耗时较长,所以关注一下这点。
附修改记录:
Modified : /trunk/ALPS.ICS.MP.V1_T_/mediatek/custom/bbk15_td_ics/kernel/leds/mt65xx/cust_leds.c
Modified : /trunk/ALPS.ICS.MP.V1_T_/mediatek/custom/bbk15_td_ics/uboot/cust_leds.c
Modified : /trunk/ALPS.ICS.MP.V1_T_/mediatek/platform/mt6575/uboot/mt65xx_leds.c
Modified : /trunk/ALPS.ICS.MP.V1_T_/mediatek/source/kernel/drivers/leds/leds.c
[mtk lcd]调试问题总结
LCD会注意到一下问题:
1.gamma是否超标。
2.刷新率是否合适。
3.flicker现象是否严重或能否轻易察觉。
4.ESD是否合格。
5.背光调节是否存在问题,特别是自动调节是否有...
LCD背光亮,黑屏问题
LCD背光亮,黑屏。
高温测试,moboplayer播放视频。
moboplayer播放器发生crash,但是还没有退出,还...
(1)占空比(Duty Cycle)有如下含义: 在一串理想的脉冲序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。例如:脉冲宽度1μs,信号周期4μs的脉冲序列,占空比为0.25。 即在一段连续...
转载自:LABC and CABC-MTK Platform
mtk 平台 cabc 背光控制方式
MT6571 使用PWM配置背光及频率计算
[DESCRIPTION]
MT6571 使用PWM配置背光及频率计算
[SOLUTION]
以GPIO52 pin为例:
p { margin-bottom: 0.1 direction: color: rgb(0, 0, 10); line-height: 120%; text-align: justi...
LCD会注意到一下问题:
1.gamma是否超标。
2.刷新率是否合适。
3.flicker现象是否严重或能否轻易察觉。
4.ESD是否合格。
5.背光调节是否存在问题,特别是自动调节是否有不平滑现象...
没有更多推荐了,说明:&&MTK 串口屏接口跟驱动(MTK SER LCD INTERFACE)
文件列表:
AOXUN23C_09A_LCM\lcd.c
AOXUN23C_09A_LCM\lcdHX8353C.c
AOXUN23C_09A_LCM\lcdHX8353C.h
AOXUN23C_09A_LCM\lcdILI9163B.c
AOXUN23C_09A_LCM\lcdILI9163B.h
AOXUN23C_09A_LCM\lcdSPFD5414D.c
AOXUN23C_09A_LCM\lcdSPFD5414D.h
AOXUN23C_09A_LCM\lcdST7687S.c
AOXUN23C_09A_LCM\lcdST7687S.h
AOXUN23C_09A_LCM\lcd_hw.h
AOXUN23C_09A_LCM\lcd_sw.h
AOXUN23C_09A_LCM\lcd_sw_inc.h
AOXUN23C_09A_LCM\lcd_sw_rnd.h
AOXUN23C_09A_LCM\复件 lcd.c
AOXUN23C_09A_LCM
近期下载者:
相关文件:一.mtk显示架构
分析代码时会看到ddp-xxx开头的文件,ddp指的是display data path,下面是6582的ddp结构,比较老的芯片,新的没找到,但是大体流程应该是类似的。
  图像旋转,支持多个方向旋转,也支持局部旋转
  图像缩放,水平垂直方向缩放
3.color engine
  图像颜色处理,PQ处理,改变亮度色坐标等
4.OVL(overlayer)
  数据输入:direct link scaler format,YUV or RGB;memory source format.可以直接从上级模块SCL or PQ,也可以直接从memory输入
  支持4组layer:支持ROI(region of interest),自定义各layer的大小、起始地址、显示区域
  支持数据重新map:例如RGB、BGR之间转换
  支持数据类型转换:;例如YUV转RGB
5.WDMA(write DMA)
  模块负责数据写入DRAM中,OVL--&WDMA1实现截图function
6.RDMA(read DMA)
  模块负责从DRAM中将数据写入显示模块,如DSI、DPI、DBI(这些都是MIPI显示接口类型)
  RDMA0支持两种输入,direct link和memory input;RDMA1只支持memory input
7.BLS(背光相关)
  通过pwm等调节背光,根据图片显示内容改变背光亮度(CABC)
二.display一些基本概念
1.video mode & command&mode
  video mode:显示数据流通过driver IC直接显示到lcd上,为实时数据
  command mode:数据先更新到ram中再由ram刷新到lcd上。&1&这种模式需要ic带ram,平台无数据更新时,显示内容就由ram更新到lcd上,节省功耗。&2&1/2 or 1/3 ram(ram大小为一帧的1/2 1/3)可以实现平台较小的数据输入,输出较高分辨率的效果,平台方压缩显示数据,driver IC解压数据并显示到lcd上。
2.DSI、DBI、DPI
  DSI,串行接口,实现较高的数据传输
  DPI,并行接口,实时传输
  DBI,并行接口,driver IC带ram
3.video mode的类型
& &  Non-Burst Mode with Sync Pulses :传输时包括sync pulse
  Non-Burst Mode with Sync Events :相比上一种只是普通的同步事件
  Burst mode &:在scan line传输完RGB信号其余时间均为LP11模式
4.MIPI DSI接口PLL计算
  总数据量=(VS+VBP+VACT+VFP)*(HS+HBP+HACT+HFP)* fps * format_bit(format_bit根据一个pixel的数据位来定,大多为24位,RGB888)
  每lane的数据量=总数据量/lane数
  DSI为差分信号,一个clock内双沿采样,传输2bit数据
  则最终PLL速率为每lane数据量/2
三.lk中lcm添加新的驱动
1.在/dev/lcm/mtxx_lcm_list中包含这样一个结构体数组,数据定义了各种lcm设备。例如标红的是新增的lcm。
LCM_DRIVER *lcm_driver_list[] = {
#if defined(NT35595_FHD_DSI_CMD_TRULY_8163)
&nt35595_fhd_dsi_cmd_truly_8163_lcm_drv,
#if defined(OTM1284A_HD720_DSI_VDO_TM)
&otm1284a_hd720_dsi_vdo_tm_lcm_drv,
#if defined(R69338_FHD_DSI_VDO_JDI)
&r69338_fhd_dsi_vdo_jdi_drv,
#if defined(FT8707_FHD_DSI_VDO_LGD)
&ft8707_fhd_dsi_vdo_lgd_drv,
#if defined(OTM1285A_HD720_DSI_VDO_TM)
&otm1285a_hd720_dsi_vdo_tm_lcm_drv,
2.添加nt35595的驱动代码,截取LCM_DRIVER这部分代码
LCM_DRIVER nt35595_fhd_dsi_cmd_truly_8163_lcm_drv= {
= "nt35595_fhd_dsi_cmd_truly_8163",
.set_util_funcs
= lcm_set_util_funcs,
.get_params
= lcm_get_params,
= lcm_init,
= lcm_suspend,
= lcm_resume,
.init_power
= lcm_init_power,
.resume_power
= lcm_resume_power,
.suspend_power
= lcm_suspend_power,
#if (LCM_DSI_CMD_MODE)
= lcm_update,
3.在/project/xx.mk中添加新的lcm,会根据name选取对应的驱动进行初始化操作
CUSTOM_LK_LCM="nt35595_fhd_dsi_cmd_truly_8163"
四.lk显示代码分析
1.platform_init代码分析
//framebuffer的大小g_fb_size = mt_disp_get_vram_size();//framebuffer的起始地址
g_fb_base = mblock_reserve(&g_boot_arg-&mblock_info, g_fb_size, <span style="color: #x10000, <span style="color: #xa0000000, RANKMAX);//mtk display系统初始化
mt_disp_init((void *)g_fb_base);//fb预先填充black
mt_disp_fill_rect(<span style="color: #, <span style="color: #, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT, <span style="color: #x0);//将fb内容更新到lcm上
mt_disp_update(<span style="color: #, <span style="color: #, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);//加载logo
mboot_common_load_logo((unsigned long)mt_get_logo_db_addr_pa(), "logo");//根据启动方式选择加载的logo,填充到fb中
mt_disp_show_boot_logo();//打开背光
mt65xx_backlight_on();
mt_disp_update(<span style="color: #, <span style="color: #, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
2.首先看下如下结构体
//LCM_DRIVER,lcm相关的一系列的操作函数typedef struct {
const char *  --用于匹配lcm
void (*set_util_funcs) (const LCM_UTIL_FUNCS *util);
--设置lcm操作函数,gpio、reset、delay、write/read cmd
void (*get_params) (LCM_PARAMS *params);  --获取lcm的参数,接口、分辨率、porch、PLL clock、data format等
void (*init) (void);  --lcm初始化,一般为上电复位初始化
void (*suspend) (void);  --pm相关
void (*resume) (void);
/* for power-on sequence refinement */
void (*init_power) (void);  --上电初始化
void (*suspend_power) (void);
void (*resume_power) (void);
void (*update) (unsigned int x, unsigned int y, unsigned int width, unsigned int height);  --设置ram的显示区域(x,y)-&(x+width,y+height),只在command mode下使用
unsigned int (*compare_id) (void);
void (*parse_dts)(const LCM_DTS *DTS, unsigned char force_update);  --解析设备树
/* /////////////////////////CABC backlight related function */
void (*set_backlight) (unsigned int level);  --背光相关函数
void (*set_backlight_cmdq) (void *handle, unsigned int level);
void (*set_pwm) (unsigned int divider);
unsigned int (*get_pwm) (unsigned int divider);
void (*set_backlight_mode) (unsigned int mode);
/* ///////////////////////// */
int (*adjust_fps) (void *cmdq, int fps);  --调节刷新率,一般刷新率为60Hz
/* ///////////ESD_RECOVERY////////////////////// */
unsigned int (*esd_check) (void);  --ESD检测相关,开启该功能,系统会周期性检测lcm寄存器状态,状态NG则会reset lcm
unsigned int (*esd_recover) (void);
unsigned int (*check_status) (void);
unsigned int (*ata_check) (unsigned char *buffer);
void (*read_fb) (unsigned char *buffer);
int (*ioctl) (LCM_DRV_IOCTL_CMD cmd, unsigned int data);
/* /////////////////////////////////////////////// */
void (*enter_idle)(void);
void (*exit_idle)(void);
void (*change_fps)(unsigned int mode);
/* //switch mode */   void *(*switch_mode) (int mode);  --用于切换mode,command mode 和video mode切换
void (*set_cmd) (void *handle, int *mode, unsigned int cmd_num);
void (*set_lcm_cmd) (void *handle, unsigned int *lcm_cmd, unsigned int *lcm_count,
unsigned int *lcm_value);
/* /////////////PWM///////////////////////////// */
void (*set_pwm_for_mix) (int enable);
} LCM_DRIVER;
//LCM_PARAMS,lcm参数设置
typedef struct {
LCM_TYPE  --lcm的接口类型,分为DSI、DBI、DPI
--lcm寄存器的访问方式,普遍通过MIPI LP下指令,也有的支持spi/i2c等接口访问
LCM_INTERFACE_ID lcm_  --lcm的接口id,分为DSI0、DSI1、dual port DSI、DBI0、DPI0、DPI1
LCM_INTERFACE_ID lcm_cmd_  --cmd模式接口,和lcm_if一致
/* common parameters */
unsigned int lcm_x;  --(lcm_x,lcm_y)定义显示的起始pixel,(virtual_width,virtual_height)or(width,height)定义显示区域的宽和高
unsigned int lcm_y;  
unsigned int
unsigned int
unsigned int virtual_  
unsigned int virtual_
unsigned int io_select_
/* DBI or DPI should select IO mode according to chip spec */
/* particular parameters */
LCM_DBI_PARAMS  --DBI参数
LCM_DPI_PARAMS  --DPI参数
LCM_DSI_PARAMS  --DSI参数
unsigned int physical_
unsigned int physical_
unsigned int od_table_
void *od_  --光学相关表格,gamma节点
} LCM_PARAMS;
typedef struct {
LCM_PARAMS
*params;  
LCM_DRIVER
LCM_INTERFACE_ID
lcm_if_  --接口id  
is_  --lcm是否初始化
is_  --lcm是否连接
} disp_lcm_handle, *pdisp_lcm_
//ddp内容结构体typedef struct {
need_trigger_  --overlay是否需要触发
DISP_PRIMARY_PATH_MODE  --ddp模式,这里选择DIRECT_LINK_MODE
unsigned int
last_vsync_  
#ifndef DDP_LK_BOOT
struct mutex
disp_lcm_handle *  --lcm相关
cmdqRecHandle
cmdq_handle_  --配置线程cmdq句柄
cmdqRecHandle
cmdq_handle_  --触发线程cmdq句柄
disp_path_handle
dpmgr_  --ddp manager句柄
disp_path_handle
ovl2mem_path_
} display_primary_path_
//ddp handle结构体typedef struct {
cmdqRecHandle   --配置线程cmdq句柄
power_  --是否上电
DDP_MODE  --分为video和cmd mode,这里为video mode
//struct mutex
DDP_IRQ_EVENT_MAPPING
irq_event_map[DISP_PATH_EVENT_NUM];  --event与irq映射数组
DPMGR_WQ_HANDLE
wq_list[DISP_PATH_EVENT_NUM];  --waitqueue数组,每类事件对应一个wq
DDP_SCENARIO_ENUM  --ddp index,根据index从ddp二维数组获得ddp
disp_ddp_path_config
last_  --overlay相关
} ddp_path_handle_t, *ddp_path_
//disp_ddp_path_config
typedef struct { // for ovl   unsigned int ovl_  --模块bypass的标志   unsigned int rdma_   unsigned int wdma_   unsigned int dst_   OVL_CONFIG_STRUCT
ovl_config[4];   RDMA_CONFIG_STRUCT rdma_   WDMA_CONFIG_STRUCT wdma_   LCM_DSI_PARAMS dsi_   LCM_DPI_PARAMS dpi_   unsigned int lcm_   unsigned int dst_w;   unsigned int dst_h;} disp_ddp_path_
//display相关事件
typedef enum{   DISP_PATH_EVENT_FRAME_START = 0,   DISP_PATH_EVENT_FRAME_DONE,   DISP_PATH_EVENT_FRAME_REG_UPDATE,   DISP_PATH_EVENT_FRAME_TARGET_LINE,   DISP_PATH_EVENT_FRAME_COMPLETE,   DISP_PATH_EVENT_FRAME_STOP,   DISP_PATH_EVENT_IF_CMD_DONE,   DISP_PATH_EVENT_IF_VSYNC,   DISP_PATH_EVENT_AAL_TRIGGER,   DISP_PATH_EVENT_COLOR_TRIGGER,   DISP_PATH_EVENT_NUM,   DISP_PATH_EVENT_NONE = 0xff,}DISP_PATH_EVENT;
//定义了支持的ddp num,即mtk支持这么多种显示方案,每种显示方案对应由不同的模块组成,构成一个二维数组,module_list_scenario
typedef enum {
DDP_SCENARIO_PRIMARY_DISP = <span style="color: #,
DDP_SCENARIO_PRIMARY_RDMA0_COLOR0_DISP,
DDP_SCENARIO_PRIMARY_RDMA0_DISP,
DDP_SCENARIO_PRIMARY_BYPASS_RDMA,
DDP_SCENARIO_PRIMARY_OVL_MEMOUT,
DDP_SCENARIO_PRIMARY_DITHER_MEMOUT,
DDP_SCENARIO_PRIMARY_UFOE_MEMOUT,
DDP_SCENARIO_DISPLAY_INTERFACE,
DDP_SCENARIO_PRIMARY_ALL,
DDP_SCENARIO_SUB_DISP,
DDP_SCENARIO_SUB_RDMA1_DISP,
DDP_SCENARIO_SUB_OVL_MEMOUT,
DDP_SCENARIO_SUB_ALL,
DDP_SCENARIO_MAX
} DDP_SCENARIO_ENUM;
int module_list_scenario[DDP_SCENARIO_MAX][DDP_ENING_NUM] = {
  /*PRIMARY_DISP*/ {DISP_MODULE_OVL0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER, DISP_MODULE_RDMA0, DISP_MODULE_PWM0, DISP_MODULE_DSI0, -<span style="color: #, -<span style="color: #, -<span style="color: #},
  /*PRIMARY_RDMA0_COLOR0_DISP*/ {DISP_MODULE_RDMA0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER,DISP_MODULE_UFOE, DISP_MODULE_PWM0, DISP_MODULE_DSI0, -<span style="color: #, -<span style="color: #, -<span style="color: #},
  /*PRIMARY_RDMA0_DISP*/ {DISP_MODULE_RDMA0, DISP_MODULE_DSI0,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #},
  /*PRIMARY_BYPASS_RDMA*/ {DISP_MODULE_OVL0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER, DISP_MODULE_UFOE, DISP_MODULE_PWM0, DISP_MODULE_DSI0, -<span style="color: #, -<span style="color: #, -<span style="color: #},
  /*PRIMARY_OVL_MEMOUT*/ {DISP_MODULE_OVL0, DISP_MODULE_WDMA0, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #},
  /*PRIMARY_DITHER_MEMOUT*/ {DISP_MODULE_OVL0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER, DISP_MODULE_WDMA0, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #},
  /*PRIMARY_UFOE_MEMOUT*/ {DISP_MODULE_OVL0, DISP_MODULE_COLOR0, DISP_MODULE_CCORR,DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER, DISP_MODULE_RDMA0, DISP_MODULE_UFOE, DISP_MODULE_WDMA0,-<span style="color: #, -<span style="color: #, -<span style="color: #},
  /*SUB_DISP*/ {DISP_MODULE_OVL1, DISP_MODULE_RDMA1, DISP_MODULE_DPI, -<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #},
  /*SUB_RDMA1_DISP*/ {DISP_MODULE_RDMA1, DISP_MODULE_DPI, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #},
  /*SUB_OVL_MEMOUT*/ {DISP_MODULE_OVL1, DISP_MODULE_WDMA1, -<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #},
  /*PRIMARY_ALL*/ {DISP_MODULE_OVL0, DISP_MODULE_WDMA0, DISP_MODULE_COLOR0,DISP_MODULE_CCORR, DISP_MODULE_AAL, DISP_MODULE_GAMMA, DISP_MODULE_DITHER,DISP_MODULE_RDMA0,DISP_MODULE_PWM0, DISP_MODULE_DSI0, -<span style="color: #, -<span style="color: #},
  /*SUB_ALL*/ {DISP_MODULE_OVL1, DISP_MODULE_WDMA1, DISP_MODULE_RDMA1, DISP_MODULE_DPI, -<span style="color: #,-<span style="color: #, -<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #, -<span style="color: #,-<span style="color: #},
  /*MULTIPLE_OVL*/ {DISP_MODULE_OVL1, DISP_MODULE_OVL0, DISP_MODULE_WDMA0, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #, -<span style="color: #,-<span style="color: #,-<span style="color: #,-<span style="color: #},
3.代码分析
&3.1&找到匹配的lcm并进行disp_lcm_handle结构体初始化
mt_disp_get_vram_size();
--&DISP_GetVRamSize();
--&DISP_GetFBRamSize();
--&DISP_GetScreenWidth();
--&primary_display_get_width();            --&disp_lcm_probe(NULL, LCM_INTERFACE_NOTDEFINED);
//disp_lcm_probe,根据lcm_driver_list找到匹配的lcm,实现plcm结构体初始化disp_lcm_handle* disp_lcm_probe(char* plcm_name, LCM_INTERFACE_ID lcm_id)
if (_lcm_count() == <span style="color: #) {
DISPERR("no lcm driver defined in linux kernel driver\n");
return NULL;
} else if (_lcm_count() == <span style="color: #) {
lcm_drv = lcm_driver_list[<span style="color: #];    --这里只连接一个lcm
isLCMFound = true;
plcm = &_disp_lcm_driver[<span style="color: #];
lcm_param = &_disp_lcm_
if (plcm && lcm_param) {
plcm-&params = lcm_
plcm-&drv = lcm_  }
plcm-&drv-&get_params(plcm-&params);  --执行get_params函数,初始化plcm-&params
plcm-&lcm_if_id = plcm-&params-&lcm_  --接口id
} //其中一颗FHD IC的驱动参数
static void lcm_get_params(LCM_PARAMS * params)
memset(params, <span style="color: #, sizeof(LCM_PARAMS));
params-&type = LCM_TYPE_DSI;  --接口类型,还可以是DBI、DPI
params-&width = FRAME_WIDTH;  --显示宽度
params-&height = FRAME_HEIGHT;  --显示高度
// enable tearing-free
params-&dbi.te_mode = LCM_DBI_TE_MODE_DISABLED;  --TE模式disable
params-&dbi.te_edge_polarity = LCM_POLARITY_RISING;  --DBI相关,这里表示上升沿采样
#if (LCM_DSI_CMD_MODE)
params-&dsi.mode
= CMD_MODE;
params-&dsi.mode
= SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;  --video mode
/* Command mode setting */
params-&dsi.LANE_NUM = LCM_FOUR_LANE;  --mipi four lane//The following defined the fomat for data coming from LCD engine.
params-&dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;  --pixel的color顺序,这里是RGB,有些panel pixel是BGR排列
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;  --RGB888的排列
// Highly depends on LCD driver capability.
params-&dsi.packet_size = <span style="color: #6;  --包的最大byte数
// Video mode setting
params-&dsi.PS = LCM_PACKED_PS_24BIT_RGB888;  --24bit RGB888排列
params-&dsi.vertical_sync_active = <span style="color: #;  --vs,porch设定,需要满足driver IC spec的要求
params-&dsi.vertical_backporch = <span style="color: #;  --vbp
params-&dsi.vertical_frontporch = <span style="color: #;  --vfp
params-&dsi.vertical_active_line = FRAME_HEIGHT;  --vact
params-&dsi.horizontal_sync_active = <span style="color: #;  --hs
params-&dsi.horizontal_backporch = <span style="color: #0;  --hbp
params-&dsi.horizontal_frontporch = <span style="color: #0;  --hfp
params-&dsi.horizontal_active_pixel = FRAME_WIDTH;  --hact
params-&dsi.PLL_CLOCK = <span style="color: #1;  --mipi速率
&3.2&ddp中各个模块和lcm配置初始化
mt_disp_init((void *)g_fb_base);
&3.2.1&创建显示路径(display data path)
int primary_display_init(char *lcm_name)
& & pgc-&plcm = disp_lcm_probe( lcm_name, LCM_INTERFACE_NOTDEFINED);
if (primary_display_mode == DIRECT_LINK_MODE) {
_build_path_direct_link();
static int _build_path_direct_link(void)
DISP_MODULE_ENUM dst_module = <span style="color: #;
pgc-&mode = DIRECT_LINK_MODE;
pgc-&dpmgr_handle = dpmgr_create_path(DDP_SCENARIO_PRIMARY_DISP, pgc-&cmdq_handle_config);
--根据显示方案设置ddp_path_handle
dst_module = _get_dst_module_by_lcm(pgc-&plcm);  --根据lcm接口类型获得目标模块,这里为DISP_MODULE_DSI0
dpmgr_path_set_dst_module(pgc-&dpmgr_handle, dst_module);
--设置ddp的最后一个模块为DISP_MODULE_DSI0
dpmgr_set_lcm_utils(pgc-&dpmgr_handle, pgc-&plcm-&drv);
--设置各个模块中lcm相关的操作函数,调用ddp_dsi_set_lcm_utils,最终调用lcm_drv-&set_util_funcs(utils)将操作函数赋给lcm_util}
disp_path_handle dpmgr_create_path(DDP_SCENARIO_ENUM scenario, cmdqRecHandle cmdq_handle){& & int i =0;& & int module_& & ddp_path_handle path_handle = NULL;& & int * modules = ddp_get_scenario_list(scenario);& & int module_num = ddp_get_module_num(scenario);& & DDP_MANAGER_CONTEXT * content = _get_context();& & //path_handle = kzalloc(sizeof(uint8_t*) * sizeof(ddp_path_handle_t), GFP_KERNEL);& & memset((void*)(&g_handle), 0, sizeof(ddp_path_handle_t)); path_handle
= &g_& & if (NULL != path_handle) {path_handle-&cmdqhandle = cmdq_path_handle-&scenario =path_handle-&hwmutexid = acquire_mutex(scenario);& & & & assign_default_irqs_table(scenario,path_handle-&irq_event_map);& & & & DISP_LOG_I("create handle 0x%p on scenario %s\n",path_handle,ddp_get_scenario_name(scenario));& & & & for ( i=0; i& module_ i++) {& & & & & &module_name = modules[i];& & & & & &DISP_LOG_V(" scenario %s include module %s\n",ddp_get_scenario_name(scenario),ddp_get_module_name(module_name));& & & & & &content-&module_usage_table[module_name]++;& & & & & &content-&module_path_table[module_name] = path_& & & & }& & content-&handle_cnt ++;& & content-&handle_pool[path_handle-&hwmutexid] = path_& & } else {& & & & DISP_LOG_E("Fail to create handle on scenario %s\n",ddp_get_scenario_name(scenario));& & }& & return path_}
&3.2.2&ddp设置显示模式,video mode or command mode
dpmgr_path_set_video_mode(pgc-&dpmgr_handle, primary_display_is_video_mode());
int dpmgr_path_set_video_mode(disp_path_handle dp_handle, int is_vdo_mode)
ddp_path_handle handle = NULL;
ASSERT(dp_handle != NULL);
handle = (ddp_path_handle)dp_
handle-&mode = is_vdo_mode ?
DDP_VIDEO_MODE : DDP_CMD_MODE;
DISP_LOG_I("set scenario %s mode %s\n",ddp_get_scenario_name(handle-&scenario),
is_vdo_mode ? "Video Mode":"Cmd Mode");
return <span style="color: #;
&3.2.3&ddp上各个模块的初始化,ovl0、ovl1、rdma0、rdma1、color、aal、gamma、dither、dsi0
dpmgr_path_init(pgc-&dpmgr_handle, CMDQ_DISABLE);
//调用各个模块的init函数int
dpmgr_path_init(disp_path_handle dp_handle, int encmdq)
ddp_path_handle handle = (ddp_path_handle)dp_
int * modules = ddp_get_scenario_list(handle-&scenario);
int module_num = ddp_get_module_num(handle-&scenario);
cmdqRecHandle cmdqHandle = encmdq ? handle-&cmdqhandle : NULL;//turn off m4u
ddp_path_m4u_off();
//open top clock
ddp_path_top_clock_on();
//seting mutex
ddp_mutex_set(handle-&hwmutexid,
handle-&scenario,
handle-&mode,
cmdqHandle);
ddp_connect_path(handle-&scenario,cmdqHandle);
// each module init
for ( i=<span style="color: #; i& module_ i++) {
module_name = modules[i];
if (ddp_modules_driver[module_name] != <span style="color: #) {
if (ddp_modules_driver[module_name]-&init!= <span style="color: #) {
ddp_modules_driver[module_name]-&init(module_name, cmdqHandle);
if (ddp_modules_driver[module_name]-&set_listener!= <span style="color: #) {
ddp_modules_driver[module_name]-&set_listener(module_name,dpmgr_module_notify);
//after init thi
handle-&power_sate = <span style="color: #;
return <span style="color: #;
&3.2.4&ddp上各个模块的配置
//data_config结构体描述lcm分辨率、接口类型、数据排列等信息  disp_ddp_path_config data_
memset((void*)&data_config, <span style="color: #, sizeof(disp_ddp_path_config));
//这里只考虑DSI接口
memcpy(&(data_config.dsi_config), &(lcm_param-&dsi), sizeof(LCM_DSI_PARAMS));
data_config.dst_w = disp_lcm_width(pgc-&plcm);
data_config.dst_h = disp_lcm_height(pgc-&plcm);
if (lcm_param-&type == LCM_TYPE_DSI) {
if (lcm_param-&dsi.data_format.format == LCM_DSI_FORMAT_RGB888)
data_config.lcm_bpp = <span style="color: #;
else if (lcm_param-&dsi.data_format.format == LCM_DSI_FORMAT_RGB565)
data_config.lcm_bpp = <span style="color: #;
else if (lcm_param-&dsi.data_format.format == LCM_DSI_FORMAT_RGB666)
data_config.lcm_bpp = <span style="color: #;
} else if (lcm_param-&type == LCM_TYPE_DPI) {
if ( lcm_param-&dpi.format == LCM_DPI_FORMAT_RGB888)
data_config.lcm_bpp = <span style="color: #;
else if ( lcm_param-&dpi.format == LCM_DPI_FORMAT_RGB565)
data_config.lcm_bpp = <span style="color: #;
if ( lcm_param-&dpi.format == LCM_DPI_FORMAT_RGB666)
data_config.lcm_bpp = <span style="color: #;
data_config.dst_dirty = <span style="color: #;  --打开DSI0模块配置(config函数会对dst_dirty进行check,为0则直接返回)
ret = dpmgr_path_config(pgc-&dpmgr_handle, &data_config, CMDQ_DISABLE);
//调用各个模块的config函数int dpmgr_path_config(disp_path_handle dp_handle, disp_ddp_path_config * config, int encmdq)
int i=<span style="color: #;
int module_
ASSERT(dp_handle != NULL);
ddp_path_handle handle = (ddp_path_handle)dp_
int * modules =
ddp_get_scenario_list(handle-&scenario);
int module_num = ddp_get_module_num(handle-&scenario);
cmdqRecHandle cmdqHandle = encmdq ? handle-&cmdqhandle : NULL;
memcpy(&handle-&last_config, config, sizeof(disp_ddp_path_config));
for ( i=<span style="color: #; i& module_ i++) {
module_name = modules[i];
if (ddp_modules_driver[module_name] != <span style="color: #) {
if (ddp_modules_driver[module_name]-&config!= <span style="color: #) {
ddp_modules_driver[module_name]-&config(module_name, config, cmdqHandle);
return <span style="color: #;
&3.2.5&lcm初始化,通过回读0x0A寄存器判断lcm是否连接
//依次调用lcm的init_power和init函数,实现上电复位初始化的动作,并通过回读0x0A寄存器判断跟lcm之前是否连接OKint disp_lcm_init(disp_lcm_handle *plcm)
LCM_DRIVER *lcm_drv = NULL;
bool isLCMConnected = false;
if (_is_lcm_inited(plcm)) {
lcm_drv = plcm-&
if (lcm_drv-&init_power) {
lcm_drv-&init_power();
if (lcm_drv-&init) {
if (!disp_lcm_is_inited(plcm)) {
lcm_drv-&init();
} else {return -<span style="color: #;
if (LCM_TYPE_DSI == plcm-&params-&type) {
ret = DSI_dcs_read_lcm_reg_v2(_get_dst_module_by_lcm(plcm), NULL, <span style="color: #x0A, (UINT8 *)&buffer,<span style="color: #);
if (ret == <span style="color: #) {
isLCMConnected = <span style="color: #;
isLCMConnected = <span style="color: #;
if (plcm-&params-&dsi.edp_panel == <span style="color: #) {
isLCMConnected = <span style="color: #;
plcm-&is_connected = isLCMC
return <span style="color: #;
return -<span style="color: #;
&3.2.6&关联event与irq,并且使能event,例如一帧刷完这个event,便产生一个中断
//映射event和中断,并且使能中断事件if (primary_display_is_video_mode()) {
if (lcm_param-&dsi.lfr_enable == <span style="color: #) {
dpmgr_map_event_to_irq(pgc-&dpmgr_handle, DISP_PATH_EVENT_IF_VSYNC, DDP_IRQ_DSI0_FRAME_DONE);
dpmgr_map_event_to_irq(pgc-&dpmgr_handle, DISP_PATH_EVENT_IF_VSYNC, DDP_IRQ_RDMA0_DONE);
dpmgr_enable_event(pgc-&dpmgr_handle, DISP_PATH_EVENT_IF_VSYNC);
dpmgr_enable_event(pgc-&dpmgr_handle, DISP_PATH_EVENT_FRAME_DONE);
pgc-&state = <span style="color: #;
int dpmgr_enable_event(disp_path_handle dp_handle, DISP_PATH_EVENT event)
ASSERT(dp_handle != NULL);
ddp_path_handle handle = (ddp_path_handle)dp_
DPMGR_WQ_HANDLE *wq_handle = &handle-&wq_list[event];
ddp_get_scenario_name(handle-&scenario),
handle-&irq_event_map[event].irq_bit);
if (!wq_handle-&init) {
//init_waitqueue_head(&(wq_handle-&wq));
wq_handle-&init = <span style="color: #;
wq_handle-&data= <span style="color: #;
wq_handle-&event = event;
return <span style="color: #;
//mtk display支持16类事件
typedef enum{
DISP_PATH_EVENT_FRAME_START = <span style="color: #,
DISP_PATH_EVENT_FRAME_DONE,
DISP_PATH_EVENT_FRAME_REG_UPDATE,
DISP_PATH_EVENT_FRAME_TARGET_LINE,
DISP_PATH_EVENT_FRAME_COMPLETE,
DISP_PATH_EVENT_FRAME_STOP,
DISP_PATH_EVENT_IF_CMD_DONE,
DISP_PATH_EVENT_IF_VSYNC,
DISP_PATH_EVENT_AAL_TRIGGER,
DISP_PATH_EVENT_COLOR_TRIGGER,
DISP_PATH_EVENT_NUM,
DISP_PATH_EVENT_NONE = <span style="color: #xff,
}DISP_PATH_EVENT;
//display相关的中断类型,ddp irq由模块和其包含的中断组成
typedef enum {
DDP_IRQ_RDMA0_REG_UPDATE =
(DISP_MODULE_RDMA0 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA0_START =
(DISP_MODULE_RDMA0 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA0_DONE
(DISP_MODULE_RDMA0 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA0_UNDERFLOW =
(DISP_MODULE_RDMA0 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA0_TARGET_LINE =
(DISP_MODULE_RDMA0 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA1_REG_UPDATE =
(DISP_MODULE_RDMA1 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA1_START =
(DISP_MODULE_RDMA1 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA1_DONE
(DISP_MODULE_RDMA1 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA1_UNDERFLOW =
(DISP_MODULE_RDMA1 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA1_TARGET_LINE =
(DISP_MODULE_RDMA1 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA2_REG_UPDATE =
(DISP_MODULE_RDMA2 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA2_START =
(DISP_MODULE_RDMA2 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA2_DONE
(DISP_MODULE_RDMA2 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA2_UNDERFLOW =
(DISP_MODULE_RDMA2 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_RDMA2_TARGET_LINE =
(DISP_MODULE_RDMA2 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_WDMA0_FRAME_COMPLETE =
(DISP_MODULE_WDMA0&&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_WDMA1_FRAME_COMPLETE =
(DISP_MODULE_WDMA1&&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_DSI0_EXT_TE =
(DISP_MODULE_DSI0 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_DSI0_FRAME_DONE =
(DISP_MODULE_DSI0 &&<span style="color: #
| <span style="color: #x1&&<span style="color: #),
DDP_IRQ_UNKNOW =
(DISP_MODULE_UNKNOWN&&<span style="color: # | <span style="color: #x1&&<span style="color: #),
} DDP_IRQ_BIT;
&3.2.7&显示输入的配置--各层layer的初始化
int primary_display_config_input(disp_input_config* input)
// all dirty should be cleared in dpmgr_path_get_last_config()
memcpy((void*)&data_config, (void*)dpmgr_path_get_last_config(pgc-&dpmgr_handle), sizeof(disp_ddp_path_config));
// no need do this dirty = 0; dpmgr_path_get_last_config do this.
data_config.dst_dirty = <span style="color: #;
data_config.ovl_dirty = <span style="color: #;
data_config.rdma_dirty = <span style="color: #;
data_config.wdma_dirty = <span style="color: #;
if (pgc-&mode == DIRECT_LINK_MODE || pgc-&mode == DECOUPLE_MODE) {
if (dpmgr_path_is_busy(pgc-&dpmgr_handle)) {  --检查各个模块是否处于busy状态
if (primary_display_is_video_mode()) {
dpmgr_wait_event_timeout(pgc-&dpmgr_handle, DISP_PATH_EVENT_FRAME_DONE, HZ*<span style="color: #);
ret = _convert_disp_input_to_ovl(&(data_config.ovl_config[input-&layer]), input);
--将各层layer信息传递给overlay
data_config.ovl_dirty = <span style="color: #;  --打开overlay模块配置,执行config函数(config函数会对ovl_dirty进行check,为0则直接返回,相当于bypass)
ret = dpmgr_path_config(pgc-&dpmgr_handle, &data_config, primary_display_use_cmdq);
// this is used for decouple mode, to indicate whether we need to trigger ovl
pgc-&need_trigger_overlay = <span style="color: #;
--设置显示需要触发overlay
disp_ddp_path_config *dpmgr_path_get_last_config(disp_path_handle dp_handle)
ddp_path_handle handle = (ddp_path_handle)dp_
handle-&last_config.ovl_dirty
=<span style="color: #;
handle-&last_config.rdma_dirty =<span style="color: #;
handle-&last_config.wdma_dirty =<span style="color: #;
handle-&last_config.dst_dirty =<span style="color: #;
return &handle-&last_
&3.3&填充framebuffer并显示到lcm上
mt_disp_fill_rect(<span style="color: #, <span style="color: #, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT, <span style="color: #x0);
void mt_disp_fill_rect(UINT32 left, UINT32 top,
UINT32 right, UINT32 bottom,
UINT32 color)
dprintf(INFO, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__);
init_fb_screen();
RECT_REGION_T rect = {left, top, right, bottom};
fill_rect_with_color(mt_get_fb_addr(), rect, color, phical_screen);
void init_fb_screen()
unsigned int fb_size = mt_get_fb_size();
logo_addr = mt_get_logo_db_addr();
phical_screen.need180Adjust = <span style="color: #;
// need sync with chip driver
if (<span style="color: # == strncmp(MTK_LCM_PHYSICAL_ROTATION, "<span style="color: #0", <span style="color: #)) {
phical_screen.rotation = <span style="color: #0;
} else if (<span style="color: # == strncmp(MTK_LCM_PHYSICAL_ROTATION, "<span style="color: #", <span style="color: #)) {
phical_screen.rotation = <span style="color: #;
} else if (<span style="color: # == strncmp(MTK_LCM_PHYSICAL_ROTATION, "<span style="color: #0", <span style="color: #) && (phical_screen.need180Adjust == <span style="color: #)) {
phical_screen.rotation = <span style="color: #0;
phical_screen.rotation = <span style="color: #;
void fill_rect_with_color(void *fill_addr, RECT_REGION_T rect, unsigned int src_color, LCM_SCREEN_T phical_screen)
fill_rect_with_color_by_32bit((unsigned int *)fill_addr,
rect, src_color, phical_screen);
//根据旋转的角度填充fbvoid fill_rect_with_color_by_32bit(unsigned int *fill_addr, RECT_REGION_T rect, unsigned int src_color, LCM_SCREEN_T phical_screen)
for(i = rect. i & rect. i++)
for(j = rect. j & rect. j++)
switch (phical_screen.rotation)
case <span style="color: #:
dst_addr = fill_addr + ((virtual_width * i + virtual_width - j));
case <span style="color: #0:
dst_addr = fill_addr + ((virtual_width * (virtual_height - i - <span style="color: #)+ j));
case <span style="color: #0:
dst_addr = fill_addr + virtual_width * (virtual_height - i)- j-<span style="color: #;
dst_addr = fill_addr + virtual_width * i +
fill_point_buffer(dst_addr, src_color, phical_screen, <span style="color: #);
mt_disp_update(<span style="color: #, <span style="color: #, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
//刷新fb有关的cache,并且调用各个模块start和trigger函数将fb内容更新到lcm上void mt_disp_update(UINT32 x, UINT32 y, UINT32 width, UINT32 height)
arch_clean_cache_range((unsigned int)fb_addr, DISP_GetFBRamSize());
primary_display_trigger(TRUE);
int primary_display_trigger(int blocking)
dpmgr_path_start(pgc-&dpmgr_handle, primary_display_use_cmdq);
dpmgr_path_trigger(pgc-&dpmgr_handle, NULL,primary_display_use_cmdq);
五.替换lk开机启动画面
/dev/logo/目录下定义了一系列分辨率的logo文件夹,/project/xx.mk包含如下的宏定义,即logo画面在/dev/logo/fhd目录下
BOOT_LOGO := fhd
里面包含了充电/normal boot等类型的开机画面,可以将自己需求的画面替换之。
阅读(...) 评论()

我要回帖

更多关于 1个plc对应2个触摸屏 的文章

 

随机推荐