高通平台LCD调试
Posted bobuddy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高通平台LCD调试相关的知识,希望对你有一定的参考价值。
一、移植前注意事项:
1. LCD移植会分为二部分, Kernel 和 bootloader, Kernel侧主要管理开机后的正常显示功能, Bootloader侧主要管理开机过程中的显示工作,所以移植时不能忽略Bootloader处。
2. 看原理图或者与硬件确定是用什么接口。常用的有RGB接口,MIPI接口。
RGB:18根并口数据线,SPI作为控制线。
MIPI:低速模式下为控制线,高速模式下为数据线。
二、LCD的移植:
KERNEL部分:
1. Lcd kernel驱动相关文件:
ap-src\\kernel\\arch\\arm\\mach-msm\\board-msm7627a-display.c //LCD板级文件
ap-src\\kernel\\drivers\\video\\msm\\mipi_XXXX.c //与屏相关的驱动文件
ap-src\\kernel\\drivers\\video\\msm\\mipi_XXXX.h
ap-src\\kernel\\drivers\\video\\msm\\mipi_XXXX_video_xga_pt.c //与基带相关的驱动文件
ap-src\\kernel\\drivers\\video\\msm\\msm_dss_io_7x27a.c //与MIPI时序等相关的文件
将上面的文件加入到相应的目录下,并修改 Makefile和Kconfig文件,使其编译进内核中。
2. ap-src\\kernel\\arch\\arm\\mach-msm\\board-msm7627a-display.c //LCD板级文件 配置与主板相关的
配置LCD RESET引脚
#define GPIO_SKUD_LCD_BRDG_RESET_N 78 //根据原理图来配置
static unsigned skud_mipi_dsi_gpio[] =
GPIO_CFG(GPIO_SKUD_LCD_BRDG_RESET_N,0,GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL,GPIO_CFG_2MA),
;
static int msm_fb_dsi_client_skud_reset(void)
int rc = 0;
rc=gpio_request(GPIO_SKUD_LCD_BRDG_RESET_N,"skud_lcd_brdg_reset_n");
if (rc < 0)
pr_err("failed to request skud lcd brdg reset_n\\n");
return rc;
return rc;
上电复位
static int mipi_dsi_panel_power(int on)
----->mipi_dsi_panel_skud_power(int on)
添加到FB设备
void __init msm_fb_add_devices(void)
int rc = 0;
msm7x27a_set_display_params("mipi_video_xxx_xxx");
……
上面红色标记的字符串必须与驱动中的msm_fb_detect_client("mipi_video_xxx_xxx") 一致,用于匹配使用的驱动程序,具体如下:
static int mipi_video_xxx_xxx_pt_init(void)
int ret;
if (msm_fb_detect_client("mipi_video_xxx_xxx"))
return 0;
……
}
3.ap-src\\kernel\\drivers\\video\\msm\\mipi_XXXX.c
主要用来初始化屏的IC,实现休眠、唤醒、背光的控制。
static char video0[] =
0x00,0x00
;
表示向屏IC的00寄存器写入值00
4.ap-src\\kernel\\drivers\\video\\msm\\mipi_XXXX_video_xga_pt.c
按照屏的规格书来填写即可。
5.ap-src\\kernel\\drivers\\video\\msm\\msm_dss_io_7x27a.c
与MIPI时序相关的部分,一般不需要修改。
Bootloader部分: LK 开机过程中的显示
1.LCD驱动相关文件
ap-src\\bootable\\bootloader\\lk\\dev\\panel\\msm\\mipi_XXXX.c
ap-src\\bootable\\bootloader\\lk\\dev\\panel\\msm\\mipi_XXXX_video_XXX.c
ap-src\\bootable\\bootloader\\lk\\target\\msm7627a\\target_display.c
2.ap-src\\bootable\\bootloader\\lk\\dev\\panel\\msm\\mipi_XXXX.c
int mipi_B080XAN02_panel_dsi_config_skud(int on)
if (on)
gpio_config(78, 0x1);
gpio_set(78, 0x1);
mdelay(20);
gpio_set(78, 0x0);
mdelay(20);
gpio_set(78, 0x1);
mdelay(20);
else
if (!target_cont_splash_screen())
gpio_set(78, 0x0);
pcom_set_backlight(0);
return 0;
按照原理图将78修改为lcd的reset的引脚。
3.ap-src\\bootable\\bootloader\\lk\\dev\\panel\\msm\\mipi_XXXX_video_XXX.c
与kernel中的ap-src\\kernel\\drivers\\video\\msm\\mipi_XXXX.c类似,按照其配置即可。
static char video0[8] =
0x02, 0x00, 0x39, 0xC0,
0x00, 0x00, 0xff, 0xff,
;
0x02表示有效数据的数量(寄存器地址+写入的数据),第一个0x00是固定的,0x39和0xc0是mipi打包的方式,不用修改,第二个0x00表示寄存器地址,第三个0x00表示写入的值,最后两个0xff为填充位。
4.ap-src\\bootable\\bootloader\\lk\\target\\msm7627a\\target_display.c
case MSM8X25Q_SKUD:
mipi_xxx_video_xxx_init(&(panel.panel_info));
panel.clk_func = msm7627a_mdp_clock_init;
panel.fb.base = base_addr;
panel.fb.width = panel.panel_info.xres;
panel.fb.height = panel.panel_info.yres;
panel.fb.stride = panel.panel_info.xres;
panel.fb.bpp = panel.panel_info.bpp;
panel.fb.format = FB_FORMAT_RGB888;
panel.mdp_rev = MDP_REV_303;
/* Lane and board config. is different for SKUD prime
* and QPR boards */
if (mach_type == MSM8X25Q_EVBD || cpu_is_msm8625q())
panel.panel_info.mipi.lane_swap= 0;
else
panel.panel_info.mipi.lane_swap= 1;
if (mach_type == MSM8X25Q_EVBD)
panel.power_func =mipi_xxx_panel_dsi_config_evbd;
else
panel.power_func=mipi_xxx_panel_dsi_config_skud; break;
按照上面两个文件修改红色部分。
5.bootable\\bootloader\\lk\\target\\msm7627a\\rules.mk
DEFINES +=DISPLAY_TYPE_MDDI=0
DEFINES +=DISPLAY_TYPE_MIPI=1 //mipi通信模式
DEFINES +=DISPLAY_TYPE_LCDC=0 //DPI通信模式
打开上述宏,会初始化相应的LCD通信接口
至此,LCD屏驱动部分修改完成,接下来就是具体的调试。
调试总结:
如果上面的操作成功后依然无显示,请注意以下几点:
1.先确定跑了正确的驱动程序,通过在驱动程序中probe函数里面用printk打印语句来判断。
2.确定初始化代码是否正确。
3.用示波器查看reset脚是否被正确的上拉下拉。(一般为高低高)
4.查看屏的规格书或与FAE联系,获得一组可以点亮屏的porch值。
以上是关于高通平台LCD调试的主要内容,如果未能解决你的问题,请参考以下文章