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

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_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);
  	}

如果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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值