点击打开链接
高通平台LCD模块大致分为两部分:KERNEL和LK。在进行点屏之前,应该认真查看LCD原理图,弄清楚LCD亮屏需要满足的条件和上电时序,同时可以跟LCD IC原厂拿到初始化代码。
首先点亮KERNEL。
在点亮KERNEL之前,先进入bootable/bootloader/lk/target/msm****/rules.mk文件,将DEFINES += DISPLAY_SPLASH_SCREEN=1置0,disable掉LK中的显示。然后正式进入内核开始点亮LCD。对于一个新的项目,建议先进入msm****-mtp.dtsi或者msm****-mdss.dtsi文件,找到它include的相应的屏配置文件,因为这个是平台默认使用的LCD,我们可以借鉴它来实现点亮屏。我这里项目中默认使用的是#include "dsi-panel-sharp-dualmipi0-wqxga-video.dtsi",而我需要点亮的是信利CMD屏,于是复制dsi-panel-sharp-dualmipi0-wqxga-video.dtsi并重命名为dsi-panel-truly-dualmipi0-wqxga-cmd.dtsi,因为是双DSI,所以需要重命名两个dtsi文件。进入重命名后的dsi-panel-truly-dualmipi0-wqxga-cmd.dtsi文件,将sharp修改为truly,将video修改为cmd,将“qcom,mdss-dsi-panel-width” 和“qcom,mdss-dsi-panel-height” 修改成相应的分辨率(其他比如hfp属性可以先不修改),将屏初始化代码写入“qcom,mdss-dsi-on-command”,同时大致浏览一下其他属性值,比如broadcast,如果双dsi使用的只有一个IC,那么这个属性必须去掉,否则会导致系统进入Android动画之后,机器挂掉。具体去掉方法是在dualmipi0中删除“qcom,cmd-sync-wait-broadcast”,在dualmipi1中删除“qcom,cmd-sync-wait-broadcast”和“qcom,cmd-sync-wait-trigger”。当然这个还是不会影响LCD的显示的。接着进入msm****-mtp.dtsi文件,将屏的dtsi文件include进来,比如#include "dsi-panel-truly-dualmipi0-wqxga-cmd.dtsi"和#include "dsi-panel-truly-dualmipi1-wqxga-cmd.dtsi",然后将DSI设置成主要接口,即qcom,mdss-pref-prim-intf = "dsi",再设置PANEL NODE,即qcom,dsi-pref-prim-pan = <&dsi_dual_truly_cmd_0>和qcom,dsi-pref-prim-pan = <&dsi_dual_truly_cmd_1>,注意的是这个值需要和屏dtsi文件里面的值保持一致。然后再添加&dsi_dual_truly_cmd_0相关代码,注意由于LK中disable掉显示的,这里面的qcom,cont-splash-enabled也应该disabled掉。接下来就需要根据原理图来设置LCD和背光的各路电压了,一般系统默认是有添加Reset的gpio口的,找到qcom,platform-reset-gpio的位置,仿照添加其他gpio口,比如lcd_reg_en供电1.8v,tps的正负5V,背光的使能口等等。这个时候注意各GPIO口的分类,PMU端和CPU端的GPIO口配置是不一样的。到此dtsi文件就处理完毕了,接下来进入MDSS文件夹下,打开mdss_dsi.c文件,还是仿照Reset口,获取其他gpio相应的属性节点,同时在mdss_dsi.h中声明。然后进入mdss_dsi_panel.c文件,在mdss_dsi_request_gpios中模仿Reset口申请其余gpio口,接下来就是重中之中的复位函数mdss_dsi_panel_reset了,这里面一定要根据上电时序来设置各路gpio口的高低电平的有效值以及下电时关闭各路电压。
到此理论上来说,KERNEL应该可以点亮了。接下来介绍下LK的点亮,记得先将将DEFINES += DISPLAY_SPLASH_SCREEN=1,再将qcom,cont-splash-enabled。
在bootable\bootloader\lk\dev\gcdb\display\include目录下,复制panel_sharp_wqxga_dualdsi_video.h并重命名panel_truly_wqxga_dualdsi_cmd.h,进入文件将sharp改为truly,video改为cmd,这里需要注意几点,一是结构体panel_config中的panel_node_id,需要跟dtsi中的名称保持一致;二是panel_config中的panel_type,video是MIPI_VIDEO_PANEL(0),cmd是MIPI_CMD_PANEL(1);三是初始化代码,小于或等于2个参数的,数据占一行,参数写在前面,datatype写在后面,dtsi里面datatype是29的且只有2个数值的,在LK里面如果只写成一行,则datatype写成23,写成二行就用29,并补0xff;大于2个参数的,第一行第一个数和第二个数之和是数值的个数(第2个一般是0x00),后面两个是datatype,第二行开始写数值,结尾一行不足4个的填写0xff. (23,15,05对应80,29和39对应c0).四是在结构体mipi_dsi_cmd中,第一个参数是相应数组的总个数,包括填充的oxff在内,同时初始化命令的个数一定要修改正确,否则会导致屏不亮。在点亮LK时,建议打开命令发送完成的打印信息mipi_dsi.c--》mdss_dual_dsi_cmd_dma_trigger_for_panel--》dprintf(INFO, "Panel CMD: command mode dma tested successfully\n");有多少条命令发送成功,就有多少个successfully打印的信息。然后将此panel_truly_wqxga_dualdsi_cmd.h文件include进oem_panel.c文件,然后仿照参考的panel_sharp_wqxga_dualdsi_video.h文件对应的SHARP_WQXGA_DUALDSI_VIDEO_PANEL添加相应的truly代码,主要是oem_panel_select和init_panel_data两个函数,添加case TRULY_WQXGA_DUALDSI_CMD_PANEL和修改panel_id;接下来就是在display.h中仿照Reset添加各路gpio口,等同于内核中mtp文件中的添加gpio口代码。最后就是target_display.c文件中的target_panel_reset复位函数,还是仿照Reset的配置和电平设置,来配置和设置其他各路GPIO相应的高低电平,注意gpio口的分类即可,这个和内核中的复位有点类似,只是LK和KERNEL中使用的函数可能有差异。
此致,点亮LCD的相关代码已经完成,这个时候LK和KERNEL应该都已经可以点亮了,如果不行,连接串口查看打印信息,解决跟LCD相关的异常信息;将各路GPIO口飞线测量各路电压是否正常;使用示波器测试reset时序是否正常。
当然,首先需要观察的就是背光是否起来,如果背光不亮,也可以先使背光常亮,来排除其他的问题。