该系列文章总目录链接与各部分简介: 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
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";
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.
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_RAW的device(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);
}
如果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
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,
};
hardware/qcom/display/liblight/lights.c中Android原生的节点控制,对应两类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)
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>
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