基于高通平臺的lcm的流程分析

1、 lk 階段 lcm 兼容原理

 aboot_init
  |--|target_display_init(device.display_panel);
  |--|do {   //遍歷panel_name_my數(shù)組
    |memcpy(oem.panel, (panel_name_my + panel_loop), 64);//把panel_name_my拷貝到oem.panel中
    |ret = gcdb_display_init(oem.panel, MDP_REV_50, (void *)MIPI_FB_ADDR);
    |      |--oem_panel_select(panel_name, &panelstruct, &(panel.panel_info), &dsi_video_mode_phy_db);
    |      |  |--panel_override_id = panel_name_to_id(supp_panels,ARRAY_SIZE(supp_panels), panel_name);//根據(jù)panel name返回panel_id
    |      |  |--goto panel_init;//if 從enum 枚舉,判斷panel id,打印lcm的名字,之前綁定了id和name。如果有這個lcm則跳轉(zhuǎn)到panel_init
    |      |          |--init_panel_data(panelstruct, pinfo, phy_db);
    |      |            |--switch(panel_id){
    |      |                                   ...
    |      |                                   case panel id:
    |      |                                   ...//相應(yīng)的初始化
    |      |                                }
    |      |
    |      |-- msm_display_init(&panel);
    |          |--msm_display_config();
    |              |--mdss_dsi_config(panel);
    |                 |-- mdss_dsi_panel_initialize(mipi, mipi->broadcast);//
    |                      |--mdss_dsi_read_panel_signature(mipi);
    |                          |
    |                          |
    |                          |
    |                          |   //讀取手機(jī)實(shí)際接的lcd的id號
    |                          |--chip_id = oem_panel_compare_chip_id(mipi);
    |                          |  |
    |                          |  |-- mdss_dsi_cmds_tx(mipi, mipi->panel_compare_id_page_cmds, 1, 0);
    |                          |  |
    |                          |  |--mdss_dsi_cmds_tx(mipi, mipi->panel_compare_id_read_cmds, 1, 0);
    |                          |  |
    |                          |  |--mdss_dsi_cmds_rx(mipi, &lp, 1, 1)
    |                          |  |
    |                          |  |--return (ntohl(*lp) >> 16) & 0xFF;
    |                          |//比對驅(qū)動對應(yīng)的lcd的id,與實(shí)際lcd的id做對比,compare_id在/lk / target/msm8952_A306 的 init_panel_data()定義
    |                          |--if (chip_id == mipi->compare_chipid)
    |                          |        return 0;
    |                          |--else  return1;
    |
    |
    |////當(dāng)屏幕匹配到了,或一塊沒匹配到,就跳出遍歷的循環(huán)。
    |-- if (!ret || ret == ERR_NOT_SUPPORTED) {
               break;
                } 
        } while (++panel_loop <= oem_panel_max_auto_detect_panels());

2、LCM 中驅(qū)動中背光在哪里控制,背光控制原理?哪里點(diǎn)亮背光,哪里設(shè)置背光等級?

lk階段:

     gcdb_display_init(oem.panel, MDP_REV_50, (void *)MIPI_FB_ADDR);
    |--oem_panel_select(panel_name, &panelstruct, &(panel.panel_info), &dsi_video_mode_phy_db);
    |  |--panel_override_id = panel_name_to_id(supp_panels,ARRAY_SIZE(supp_panels), panel_name);//根據(jù)panel name返回panel_id
    |  |--goto panel_init;//if 從enum 枚舉,判斷panel id,打印lcm的名字,之前綁定了id和name。如果有這個lcm則跳轉(zhuǎn)到panel_init
    |          |--init_panel_data(panelstruct, pinfo, phy_db);
    |            |--switch(panel_id){
    |                                   ...
    |                                   case panel id:
    |                                   panelstruct->backlightinfo = &HX83102_B_720p_hsd_video_backlight;//背光相應(yīng)的信息填充
    |                           }
    |--mdss_dsi_bl_enable //背光使能函數(shù)
    |--ret = panel_backlight_ctrl(enable);
            |--ret = target_backlight_ctrl(panelstruct.backlightinfo, enable);
                    |--msm8952_wled_backlight_ctrl(enable);
                            |--qpnp_wled_enable_backlight(enable);     //使能
                            |--qpnp_wled_set_level(gwled, QPNP_WLED_MAX_BR_LEVEL);  //設(shè)置背光等級

kernel階段:在屏驅(qū)動下

     //一些描述leds參數(shù)的信息結(jié)構(gòu)體和枚舉
            enum led_brightness {
                    LED_OFF     = 0,
                    LED_HALF    = 127,
                    LED_FULL    = 255,
                            };//背光的強(qiáng)度
            struct led_classdev {
            const char      *name;
            enum led_brightness  brightness;
            enum led_brightness  max_brightness;
            ...
            }
                    
    W:\work\TP_A306_0410\kernel\msm-3.18\drivers\video\msm\mdss\mdss_fb.c
    module_init(mdss_fb_init);
     |--int __init mdss_fb_init(void)
          |--static struct platform_driver mdss_fb_driver = {
           .probe = mdss_fb_probe,...}
            |--static int mdss_fb_probe(struct platform_device *pdev)
               |--led_classdev_register(&pdev->dev, &backlight_led);
                    |--.brightness_set = mdss_fb_set_bl_brightness,
                          |--mdss_fb_set_backlight(mfd, bl_lvl);
                            if (value > mfd->panel_info->brightness_max)
                            value = mfd->panel_info->brightness_max;        //value值為屏幕獲取的亮度條的值,這里可以定制亮度
                              |--pdata->set_backlight;                     //調(diào)用set_backlight,設(shè)置背光,搜索set_backlight,看在哪里綁定了函數(shù)
                                    ctrl_pdata->panel_data.set_backlight = mdss_dsi_panel_bl_ctrl;
                                            |--static void mdss_dsi_panel_bl_ctrl(struct mdss_panel_data *pdata,u32 bl_level)
                                                    |--led_trigger_event(bl_led_trigger, bl_level);//控制PMI的WLED引腳控制背光

3、LCM ESD check 是什么意思?代碼位置?如何修改 esd check 的頻率?

答:是一種釋放lcm靜電的防護(hù)機(jī)制,在相應(yīng)的屏幕的設(shè)備樹文件中添加esd check
的代碼即可。驅(qū)動流程如下:

  int mdss_dsi_panel_init(struct device_node *node,struct mdss_dsi_ctrl_pdata 
  *ctrl_pdata,int ndx)
  |--static int mdss_panel_parse_dt(struct device_node *np,struct 
  mdss_dsi_ctrl_pdata *ctrl_pdata)
  |--rc = mdss_dsi_parse_panel_features(np, ctrl_pdata);
    |--mdss_dsi_parse_esd_params(np, ctrl);
       |--static void mdss_dsi_parse_esd_params(struct device_node *np,struct 
mdss_dsi_ctrl_pdata *ctrl)
           |--rc = of_property_read_string(np,"qcom,mdss-dsi-panel-status-check-mode", &string);//讀取dts中的節(jié)點(diǎn)名字匹配到"reg_read"時執(zhí)行ESD檢查
                |--ctrl->check_read_status =mdss_dsi_gen_read_status;
                         |--static int mdss_dsi_gen_read_status(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
                                 |--static bool mdss_dsi_cmp_panel_reg_v2(struct mdss_dsi_ctrl_pdata *ctrl)

   static int mdss_mdp_register_driver(void);
    |--.probe = mdss_mdp_probe,>>static int mdss_mdp_probe(struct platform_device *pdev)
            |--rc = mdss_fb_register_mdp_instance(&mdp5);
                    |--.check_dsi_status = mdss_check_dsi_ctrl_status,
                            |--ret = ctrl_pdata->check_status(ctrl_pdata);>>mdss_dsi_reg_status_check;
                                    |--if (ret > 0) {
                                                    printk("lcd esd check success %s %d\n", __func__, __LINE__);
                                                    schedule_delayed_work(&pstatus_data->check_status,
                                                    msecs_to_jiffies(interval));
                                            }

調(diào)試過程中,可以通過相關(guān)log看esd機(jī)制有沒有生效。如下:搜索關(guān)鍵字(lcd esd)


image.png
可以看到esd機(jī)制是有生效的,當(dāng)讀出esd寄存器的值和dtsi的值不匹配時就會觸發(fā)esd防護(hù)機(jī)制,是ic進(jìn)行重啟,屏幕會閃一下。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容