• Android Qcom Display学习(十)


    该系列文章总目录链接与各部分简介: Android Qcom Display学习(零)
    本章主要是基于高通平台不同的背光类型处理的学习,包含XBL和Kernel两大部分。

    Kernel

    - qcom,mdss-dsi-bl-pmic-control-type:	A string that specifies the implementation of backlight
     					control for this panel.
     					"bl_ctrl_pwm" = Backlight controlled by PWM gpio.         
     					"bl_ctrl_wled" = Backlight controlled by WLED.
    					"bl_ctrl_dcs" = Backlight controlled by DCS commands.
     					"bl_ctrl_external" = Backlight controlled by externally
     					other: Unknown backlight control. (default)
    pmic 
     qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm";    DSI_BACKLIGHT_PWM       
    wled
     qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled";   DSI_BACKLIGHT_WLED       
    amoled
     qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs";    DSI_BACKLIGHT_DCS
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    LPG是Light PulseGenerator 光脉冲波,对应PWM ,qcom-spmi-pmic.c pwm-qti-lpg.c
    WLED是White Light Emitting Diode(白光二极管) qcom-spmi-wled.c + leds-qpnp-wled.c

    PMI632 Display LCDB only, WLED need externl driver 
    qcom,pmi632@2 {
         compatible = "qcom,spmi-pmic";	
    	 pmi632_lcdb: qpnp-lcdb@ec00 
    	     compatible = "qcom,qpnp-lcdb-regulator";
    
    PMI6150 或 PM660等 Support WLED 需要看平台芯片支持,不支持需外接
    pm660l_3: qcom,pm660l@3 {
     	compatible ="qcom,spmi-pmic";
    	pm660l_wled: qcom,leds@d800 {
            compatible = "qcom,pm660l-spmi-wled";   
            label = "backlight";		
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    backlight ic

    Android Qcom Display学习(一)原理图中的背光IC就是LV52207,单纯的转换芯片,非I2C,非PMIC,单路输出,如果仅使用CABC那么上层无法使用亮度控制,如果要支持CABC,还是使用平台的PMIC WLED或者I2C器件 AW99703或LM36922双路控制的背光IC

    LV52207 only support pwm input, not I2C,
    
    AW99703CSR  
        The LED current is adjusted via an I2C interface or through a logic level PWM input. 
    
    LM36922 Brightness mode: 00 I2C only/ 01 PWM only/ 10 I2C + PWM / 11 I2C + PWM 结合方式有所不同
        In brightness control mode 00 the I2C Brightness registers control LED current, and the PWM input is disabled.
        In brightness control mode 11 both the I2C brightness code and the PWM duty cycle control the LED current. 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    register backlight

    由wled驱动中通过backlight_device_register注册了BACKLIGHT_RAW(The backlight is controlled using hardware registers)的device,需要注意DSI_BACKLIGHT_WLED不仅仅可用于高通的wled,如果pmic上不支持,外接的gpio型或者i2c型都可以通过这个类型来实现调节光度,也是通过backlight_device_register注册了BACKLIGHT_RAW的device。另外由于dsi中也注册了BACKLIGHT_RAWdevice(panel0-backlight),需要在backlight_device_get_by_type需要注意是否能调用到我们想要的驱动中去,如果我们的驱动在注册时没有用到BACKLIGHT_RAW,则会调用到panel0,如果是BACKLIGHT_RAW,backlight_dev_list这个链表list_add,后添加的在head,一般添加的驱动都是后加载,所以就能调用到我们的驱动

    dsi_panel_bl_register
        switch (bl->type) {
      	case DSI_BACKLIGHT_WLED:
      		rc = dsi_panel_wled_register(panel, bl);
    		    backlight_device_get_by_type(BACKLIGHT_RAW);  
    		wled_probe -> devm_backlight_device_register	qcom-spmi-wled.c -> backlight.c
    		sys/class/backlight/backlight  (wled->name = dtsi lable = backlight)			
      		break;
      	case DSI_BACKLIGHT_DCS:
      		break;
      	case DSI_BACKLIGHT_EXTERNAL:
      		break;
      	case DSI_BACKLIGHT_PWM:
      		rc = dsi_panel_pwm_register(panel);
    		devm_of_pwm_get(panel->parent, panel->panel_of_node, NULL);
    		of_pwm_get -> of_parse_phandle_with_args(np, "pwms", "#pwm-cells", index, &args);
    
    		cells_name = "#pwm-cells" phandle 指向的节点所含的 cells 个数;index代表索引
    		pm6125_pwm 中 #pwm-cells = 2 对应 所以devicetree: pwms = <&pm6125_pwm 0 0>
    
    		pmi632_gpios 6 BLK_EN   
    		pm6125_gpios 8 WLED_PWM  WLED_PWM can be replaced by CABC
    		BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/KamortaPkg/Settings/PMIC/pm_spmi_config.c
            {0, 0xC7, SPMI_OWNER_APPS,    SPMI_OWNER_APPS},   /* GPIO08 PWM_OUT FOR BACKLIGHT */
    
    pwm suppot:
    &sde_dsi {
    	pinctrl-names = "panel_active", "panel_suspend", "pwm_pin";
    	pinctrl-2 = <&lcd_backlight_ctrl_default>;
    	qcom,dsi-default-panel = <&dsi_1080_video>;
    };
    
    panel->pinctrl.pwm_pin = pinctrl_lookup_state(panel->pinctrl.pinctrl, "pwm_pin");
    	
    dsi_panel_pwm_register	
    	if (panel->pinctrl.pwm_pin) {
      		rc = pinctrl_select_state(panel->pinctrl.pinctrl,
      			panel->pinctrl.pwm_pin);
      		if (rc)
      			DSI_ERR("[%s] failed to set pwm pinctrl, rc=%d\n",
      				panel->name, rc);
      	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    如果wled存在注册问题,就是模块加载的问题,我们的驱动还未加载到backlight_dev_list,可以试试提高模块的优先级或者在dsi_panel_set_backlight中再去拿一次raw_bd(通过type来实现,如果还不是gki的kernel,可以改为用name(bd->dev.kobj.name)

    set backlight

    raw_bd就是我们前面提到的,一定backlight_device_get_by_type拿到我们注册的驱动

    dsi_panel_set_backlight		
    	switch (bl->type) {
      	case DSI_BACKLIGHT_WLED:
      		rc = backlight_device_set_brightness(bl->raw_bd, bl_lvl);
    		    backlight_update_status ->  bd->ops->update_status -> wled_update_status	
      		break;
      	case DSI_BACKLIGHT_DCS:
      		rc = dsi_panel_update_backlight(panel, bl_lvl);
    		    mipi_dsi_dcs_set_display_brightness + MIPI_DCS_SET_DISPLAY_BRIGHTNESS
      		break;
      	case DSI_BACKLIGHT_EXTERNAL:
      		break;
      	case DSI_BACKLIGHT_PWM:
      		rc = dsi_panel_update_pwm_backlight(panel, bl_lvl);
    		    pwm_enable -> pwm_apply_state -> pwm->chip->ops -> enable
    		    pwm_config -> pwm_apply_state -> pwm->chip->ops -> config_extend ↓↓↓ 
            devicetree:pm6125_pwm 
    	        compatible = "qcom,pwm-lpg";  -> pwm-qti-lpg.c  -> qpnp_lpg_pwm_config_extend
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    backlight node

    不同驱动可能会生成不同的节点 所以echo cat对应的驱动ops也会对应不同

    1./sys/class/backlight/panel0-backlight  (sde_connector.c)
    snprintf(bl_node_name, BL_NODE_NAME_SIZE, "panel%u-backlight", display_count);
    c_conn->bl_device = backlight_device_register(bl_node_name, dev->dev, c_conn, &sde_backlight_device_ops, &props);
    
    static const struct backlight_ops sde_backlight_device_ops = {
        .update_status = sde_backlight_device_update_status,
      	.get_brightness = sde_backlight_device_get_brightness,
    }
    
    bringtness节点控制
    brightness_store  -> backlight_device_set_brightness  -> backlight_update_status -> bd->ops->update_status
                                                                            
    2./sys/class/backlight/aw99703-bl (leds_aw99703.c)
    #define AW99703_NAME "aw99703-bl"  
    bl_dev = backlight_device_register(AW99703_NAME, &client->dev, drvdata, &aw99703_bl_ops, &props);
    
    static const struct backlight_ops aw99703_bl_ops = {
      		.update_status = aw99703_bl_update_status,
      		.get_brightness = aw99703_bl_get_brightness,
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    hardware/qcom/display/liblight/lights.cAndroid原生的节点控制,对应两类display的架构

    char const*const LCD_FILE = "/sys/class/leds/lcd-backlight/brightness";             fd  (mdss_fb_probe)
    char const*const LCD_FILE2  = "/sys/class/backlight/panel0-backlight/brightness";   drm (sde_backlight_setup)
    
    • 1
    • 2

    XBL

    configue define

    boot_images/boot/QcomPkg/Library/MDPLib/MDPEDID.c   
    boot_images/boot/QcomPkg/Include/Library/MDPTypes.h 
    MDPDetectPanel-> pPanelXMLConfig ->  XML_Parser -> sXmlTagsList
    
     XML_CREATE_TAG_ENTRY("BacklightType",              
     					  XML_TAG_DATATYPE_INTEGER, gPanelConfig.sBacklightConfig.eBacklightType),
     XML_CREATE_TAG_ENTRY("BacklightPmicControlType",  
     					  XML_TAG_DATATYPE_INTEGER, gPanelConfig.sBacklightConfig.uBacklightCntrl.eBacklightCtrl),
    
    <Group id='Backlight Configuration'>
      <BacklightType>1</BacklightType>                             //MDP_Panel_BacklightType      MDP_PANEL_BACKLIGHTTYPE_PMIC
      <BacklightPmicControlType>2</BacklightPmicControlType>       //MDP_PmicBacklightControlType MDP_PMIC_BACKLIGHT_CONTROLTYPE_WLED
    </Group>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    control interface

    Library/MDPPlatformLib/MDPPlatformLibPanelCommon.c 
    Panel_Default_Brightness_Enable  Panel_Default_Brightness_Level
    MDP_PANEL_BACKLIGHTTYPE_PMIC
        MDP_PMIC_BACKLIGHT_CONTROLTYPE_LPG    -> EFI_QCOM_PMIC_PWM_PROTOCOL
            PMICPWMProtocol->PwmConfig
    
        MDP_PMIC_BACKLIGHT_CONTROLTYPE_WLED   ->  EFI_QCOM_PMIC_WLED_PROTOCOL
            PmicWledProtocol->EnableCurrentSink
            PmicWledProtocol->SetLedDutyCycle
    
    MDP_PANEL_BACKLIGHTTYPE_I2C
        i2c_open i2c_read i2c_write i2c_close + i2c_slave_config
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    【AI视野·今日Sound 声学论文速览 第十五期】Fri, 29 Sep 2023
    死磕solidity之如何有效的节省gas.md
    MySql的索引与算法-B+树索引
    2023年中国功效护肤品市场发展概况分析:行业市场成熟度高[图]
    React Hooks的理解
    2023-10-11 python-windows平台-安装-记录
    流的基本概念以及常见应用
    【Flink读写外部系统】Flink异步访问外部系统_mysql
    Springboot整合AOP实现日志的保存
    微信小程序小白易入门基础教程1
  • 原文地址:https://blog.csdn.net/qq_40405527/article/details/127981199