该系列文章总目录链接与各部分简介: Android Qcom Display学习(零)
本章主要是基于高通平台不同的背光类型处理的学习,包含XBL和Kernel两大部分。
- qcom,mdss-dsi-bl-pmic-control-type: A string that specifies the implementation of backlightcontrol 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 externallyother: Unknown backlight control. (default)
pmic qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; DSI_BACKLIGHT_PWM
wledqcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; DSI_BACKLIGHT_WLED
amoledqcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs"; DSI_BACKLIGHT_DCS
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";
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.
dsi_panel_bl_registerswitch (bl->type) {case DSI_BACKLIGHT_WLED:rc = dsi_panel_wled_register(panel, bl);backlight_device_get_by_type(BACKLIGHT_RAW); 由wled驱动注册并获取到blacklight_deviceBACKLIGHT_RAW: The backlight is controlled using hardware registers.wled_probe -> devm_backlight_device_register qcom-spmi-wled.c -> backlight.csys/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 CABCBOOT.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 */
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_BRIGHTNESSbreak;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 -> enablepwm_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
sde_backlight_setup sde_connector.c -> backlight.cbacklight_device_register "/sys/class/backlight/panel0-backlight"static const struct backlight_ops sde_backlight_device_ops = {.update_status = sde_backlight_device_update_status,.get_brightness = sde_backlight_device_get_brightness,}static struct attribute *bl_device_attrs[] = {&dev_attr_bl_power.attr,&dev_attr_brightness.attr, &dev_attr_actual_brightness.attr,&dev_attr_max_brightness.attr,&dev_attr_type.attr,NULL,};bringtness节点控制brightness_store >> backlight_device_set_brightness backlight_update_status >> bd->ops->update_status -> sde_backlight_device_update_statusc_conn->ops.set_backlight >> dsi_display_set_backlight/sys/class/backlight/panel0-backlight # ls
actual_brightness bl_power brightness device max_brightness power subsystem type ueventhardware/qcom/display/liblight/lights.c
char const*const LCD_FILE = "/sys/class/leds/lcd-backlight/brightness"; fd architecture(mdss_fb_probe)
char const*const LCD_FILE2 = "/sys/class/backlight/panel0-backlight/brightness"; drm architecture(sde_backlight_setup)
boot_images/boot/QcomPkg/Library/MDPLib/MDPEDID.c
boot_images/boot/QcomPkg/Include/Library/MDPTypes.h
MDPDetectPanel-> pPanelXMLConfig -> XML_Parser -> sXmlTagsListXML_CREATE_TAG_ENTRY("BacklightType", XML_TAG_DATATYPE_INTEGER, gPanelConfig.sBacklightConfig.eBacklightType),XML_CREATE_TAG_ENTRY("BacklightPmicControlType", XML_TAG_DATATYPE_INTEGER, gPanelConfig.sBacklightConfig.uBacklightCntrl.eBacklightCtrl),1 //MDP_Panel_BacklightType MDP_PANEL_BACKLIGHTTYPE_PMIC2 //MDP_PmicBacklightControlType MDP_PMIC_BACKLIGHT_CONTROLTYPE_WLED
Library/MDPPlatformLib/MDPPlatformLibPanelCommon.c
Panel_Default_Brightness_Enable Panel_Default_Brightness_Level
MDP_PANEL_BACKLIGHTTYPE_PMICMDP_PMIC_BACKLIGHT_CONTROLTYPE_LPG -> EFI_QCOM_PMIC_PWM_PROTOCOLPMICPWMProtocol->PwmConfigMDP_PMIC_BACKLIGHT_CONTROLTYPE_WLED -> EFI_QCOM_PMIC_WLED_PROTOCOLPmicWledProtocol->EnableCurrentSinkPmicWledProtocol->SetLedDutyCycleMDP_PANEL_BACKLIGHTTYPE_I2Ci2c_open i2c_read i2c_write i2c_close + i2c_slave_config