高通平台MSM8916 LCM ID读取方法

高通默认的LCM 兼容做法是通过ADC实现的。

相关代码:
bootable/bootloader/lk/target/M9PLUS/oem_panel.c
函数oem_panel_select中:
    pm8x41_enable_mpp_as_adc(LCM_MPP_ID -1);
    lcd_id_v = pm8x41_adc_channel_read(VADC_LCD_ID);

这种LCM兼容方式的代码设计比较简单,很容易实现LCM兼容,但是存在一些局限,首先需要硬件和平台上 的支
持,还有就是,其可兼容的LCM数量很有限。
下面说说另一种识别LCM的方式,即通过MIPI通信读LCM ID。
首先看一下高通平台上LK部分LCM驱动的初始化流程。LK部分的LCM驱动比较关键,它不仅仅要负责开机过程的
显示任务,还要传参给kernel的LCM驱动,指导kernel选择对应的LCM参数。
高通平台MSM8916 LCM ID读取方法_第1张图片

整个流程里面,要做LCM兼容,我们主要关注这两个函数:oem_panel_select()和mdss_dsi_panel_initialize()。
另外还要添加一个读LCM ID的函数mdss_dsi_read_panel_id(),该函数由mdss_dsi_panel_initialize()调用。

以屏otm8018b和st7701做兼容为例。
oem_panel_select()函数在android/bootloader/lk/target/$pro/oem_panel.c文件中,里面加入代码:
    if(0xffff == lk_lcd_id || OTM8018B_MANUFACTURER_ID == lk_lcd_id) {
        dprintf(CRITICAL, " **otm8018b**\n");
        panel_id = OTM8018B_BONA_SD_VIDEO_PANEL;
    }else if(ST7701_MANUFACTURER_ID == lk_lcd_id){
        dprintf(CRITICAL, " **st7710**\n");
        panel_id = ST7701_BONA_SD_VIDEO_PANEL;
    }

lk_lcd_id变量是全局变量,在oem_panel.c中定义:
     uint32_t lk_lcd_id = 0xffff;

mdss_dsi_panel_initialize()函数在bootable/bootloader/lk/platform/msm_shared/mipi_dsi.c中定义,代码添加如下:
int mdss_dsi_panel_initialize(struct mipi_dsi_panel_config *pinfo, uint32_t
                broadcast)
{
        int status = 0;
#if (DISPLAY_TYPE_MDSS == 1)
/*add by raindi begin */
    if(0xffff == lk_lcd_id) {
        lk_lcd_id = mdss_dsi_read_panel_id();
        /*otm8018b is default selected in func oem_panel_select().       */
        /*if return 1 ,it will reselect panel by new lk_lcd_id in func oem_panel_select().   */
        if(OTM8018B_MANUFACTURER_ID != lk_lcd_id)
            return 1;
    }
/*add by raindi end */
        if (pinfo->panel_cmds) {
                if (broadcast) {
                        status = mdss_dual_dsi_cmds_tx(pinfo->panel_cmds,
                                        pinfo->num_of_panel_cmds);

                } else {
                        status = mipi_dsi_cmds_tx(pinfo->panel_cmds,
                                        pinfo->num_of_panel_cmds);
                        if (!status && target_panel_auto_detect_enabled())
                                status =
                                        mdss_dsi_read_panel_signature(pinfo->signature);
                }
        }
#endif
        return status;
}

在文件mipi_dsi.c中添加读LCM ID的函数 mdss_dsi_read_panel_id()。
/*add by raindi begin*/
extern uint32_t lk_lcd_id;

static char panel_manufacture_id[] = {0xDA, 0x00, 0x06, 0xA0};

static struct mipi_dsi_cmd panel_manufacture_id_cmd[] = {
{sizeof(panel_manufacture_id), panel_manufacture_id},};

static uint32_t mdss_dsi_read_panel_id(void)
{
    char rec_buf[24];
    char *rp = rec_buf;
    uint32_t *lp,ret,data= 0;
    ret = mipi_dsi_cmds_tx(panel_manufacture_id_cmd, ARRAY_SIZE(panel_manufacture_id_cmd));
    //mdelay(5);
    ret = mipi_dsi_cmds_rx(&rp, 3);
    if(ret < 0) {
        dprintf(CRITICAL,"mipi read panel id faild\n");
    }
    lp = (uint32_t *)rp;
    data = (uint32_t)*lp;
    dprintf(CRITICAL, "[PHC]: panel ID: 0x%x\n", data);
    return data;
}
/*add by raindi end*/

整个兼容方法的思路是,在LCM进行第一遍初始化的时候,使用默认的LCM参数进行初始化,但进行到mipi_dsi.c文件
中的mdss_dsi_panel_initialize()函数的时候,读取当前使用的LCM IC 的ID,如果和默认的屏幕ID一样,则不进行第二
次初始化,若不一样,则重新初始化,这个时候全局变量lk_lcd_id已经被赋值,当第二遍初始化到了oem_panel.c文件
的oem_panel_select()函数中,函数根据lk_lcd_id的值来匹配正确的屏幕变量。匹配完成之后继续未完成的屏幕初始化,
至此整个流程走完,屏幕点亮!

有一个要注意的地方是,当需要第二次初始化时,也就是重新执行函数:
void target_display_init(const char *panel_name)
{
        uint32_t panel_loop = 0;
        uint32_t ret = 0;
        do {
                ret = gcdb_display_init(panel_name, MDP_REV_50, MIPI_FB_ADDR);
                if (!ret || ret == ERR_NOT_SUPPORTED) {
                        break;
                } else {
                        target_force_cont_splash_disable(true);
                        msm_display_off();
                        target_force_cont_splash_disable(false);
                }
        } while (++panel_loop <= oem_panel_max_auto_detect_panels());
}
我们要确保oem_panel_max_auto_detect_panels()的返回值大于或等于2,否则系统无法进行第二次初始化工作,导致
开机过程屏幕不能正常显示。

你可能感兴趣的:(高通平台MSM8916 LCM ID读取方法)