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

1、 lk 阶段 lcm 兼容原理

 aboot_init
  |--|target_display_init(device.display_panel);
  |--|do {   //遍历panel_name_my数组
    |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);//根据panel name返回panel_id
    |      |  |--goto panel_init;//if 从enum 枚举,判断panel id,打印lcm的名字,之前绑定了id和name。如果有这个lcm则跳转到panel_init
    |      |          |--init_panel_data(panelstruct, pinfo, phy_db);
    |      |            |--switch(panel_id){
    |      |                                   ...
    |      |                                   case panel id:
    |      |                                   ...//相应的初始化
    |      |                                }
    |      |
    |      |-- msm_display_init(&panel);
    |          |--msm_display_config();
    |              |--mdss_dsi_config(panel);
    |                 |-- mdss_dsi_panel_initialize(mipi, mipi->broadcast);//
    |                      |--mdss_dsi_read_panel_signature(mipi);
    |                          |
    |                          |
    |                          |
    |                          |   //读取手机实际接的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;
    |                          |//比对驱动对应的lcd的id,与实际lcd的id做对比,compare_id在/lk / target/msm8952_A306 的 init_panel_data()定义
    |                          |--if (chip_id == mipi->compare_chipid)
    |                          |        return 0;
    |                          |--else  return1;
    |
    |
    |////当屏幕匹配到了,或一块没匹配到,就跳出遍历的循环。
    |-- if (!ret || ret == ERR_NOT_SUPPORTED) {
               break;
                } 
        } while (++panel_loop <= oem_panel_max_auto_detect_panels());

2、LCM 中驱动中背光在哪里控制,背光控制原理?哪里点亮背光,哪里设置背光等级?

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);//根据panel name返回panel_id
    |  |--goto panel_init;//if 从enum 枚举,判断panel id,打印lcm的名字,之前绑定了id和name。如果有这个lcm则跳转到panel_init
    |          |--init_panel_data(panelstruct, pinfo, phy_db);
    |            |--switch(panel_id){
    |                                   ...
    |                                   case panel id:
    |                                   panelstruct->backlightinfo = &HX83102_B_720p_hsd_video_backlight;//背光相应的信息填充
    |                           }
    |--mdss_dsi_bl_enable //背光使能函数
    |--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);  //设置背光等级

kernel阶段:在屏驱动下

     //一些描述leds参数的信息结构体和枚举
            enum led_brightness {
                    LED_OFF     = 0,
                    LED_HALF    = 127,
                    LED_FULL    = 255,
                            };//背光的强度
            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;                     //调用set_backlight,设置背光,搜索set_backlight,看在哪里绑定了函数
                                    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静电的防护机制,在相应的屏幕的设备树文件中添加esd check
的代码即可。驱动流程如下:

  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中的节点名字匹配到"reg_read"时执行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));
                                            }

调试过程中,可以通过相关log看esd机制有没有生效。如下:搜索关键字(lcd esd)


image.png
可以看到esd机制是有生效的,当读出esd寄存器的值和dtsi的值不匹配时就会触发esd防护机制,是ic进行重启,屏幕会闪一下。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容