Qcom Leds 配置

Qcom LED 相关配置

高通的 Led 配置本质上与 MTK 上的 LED 配置没有什么不同,都是通过修改 DTS 中相关属性节点来进行客制化的,
但是相比 MTK,高通上的配置更灵活,支持的模式更多,所以导致配置起来更复杂,也更难理解与上手,所以这篇档首先会回顾下 MTK 上的 LED 配置

MTK LED 配置

硬件原理

MTK 上 LED 的连接是有特定的 LED 引脚,所以连接上相对固定配置上也相对简单,图为 PMIC6353 上的 LED 连接示意图
在这里插入图片描述
  从图中可以看出,此 LED 是由 PWM 控制的,所以在 DTS 属性配置中,主要就是配置 PWM 相关属性。

软件配置

E266L.dts (kernel-3.18\arch\arm64\boot\dts)
/ {
        .....
        
        // 红绿蓝三色灯
        led0:led@0 {
            compatible = "mediatek,red";
            led_mode = <3>;								// 即 mt65xx_led_mode
            data = <1>;
            pwm_config = <0 0 0 0 0>;                   // 即 PWM_config 数据结构
        };
        led1:led@1 {
            compatible = "mediatek,green";
            led_mode = <3>;
            data = <2>;
            pwm_config = <0 0 0 0 0>;
        };
        led2:led@2 {
            compatible = "mediatek,blue";
            led_mode = <0>;
            data = <1>;
            pwm_config = <0 0 0 0 0>;
        };
        ///////////////////////////////////////////////
        // 手柄背光?
        led3:led@3 {
            compatible = "mediatek,jogball-backlight";
            led_mode = <0>;
            data = <1>;
            pwm_config = <0 0 0 0 0>;
        };
        ///////////////////////////////////////////////
        // 键盘背光
        led4:led@4 {
            compatible = "mediatek,keyboard-backlight";
            led_mode = <0>;
            data = <1>;
            pwm_config = <0 0 0 0 0>;
        };
        ///////////////////////////////////////////////
        // 按键背光
        led5:led@5 {
            compatible = "mediatek,button-backlight";
            led_mode = <0>;
            data = <1>;
            pwm_config = <0 0 0 0 0>;
        };
        ///////////////////////////////////////////////
        // 屏幕背光
        led6:led@6 {
            compatible = "mediatek,lcd-backlight";
            led_mode = <5>;
            data = <1>;
            pwm_config = <0 0 0 0 0>;
        };
        ....
    };

相关结构体

///////////////////////////////////////////////////////////////////////////////
// 相关数据结构体:Leds_sw.h (kernel-3.18\drivers\misc\mediatek\leds\mt6755)
///////////////////////////////////////////////
* led customization data structure
* name : must the same as lights HAL
* mode : control mode
* data :
*    PWM:  pwm number
*    GPIO: gpio id
*    PMIC: enum mt65xx_led_pmic
*    CUST: custom set brightness function pointer
* config_data: pwm config data
////////////////////////////////////////////
struct cust_mt65xx_led {
    char *name;
    enum mt65xx_led_mode mode;
                /////////////////////////////////////
                // enum mt65xx_led_mode {
                //     MT65XX_LED_MODE_NONE,
                //     MT65XX_LED_MODE_PWM,
                //     MT65XX_LED_MODE_GPIO,
                //     MT65XX_LED_MODE_PMIC,
                //     MT65XX_LED_MODE_CUST_LCM,
                //     MT65XX_LED_MODE_CUST_BLS_PWM
                // };
    long data;
                ////////////////////////////////////////
                // 还有其他设置,比如是一个函数地址,下面是 PWM led 设置  
                //
                // enum mt65xx_led_pmic {
                //     MT65XX_LED_PMIC_LCD_ISINK = 0,
                //     MT65XX_LED_PMIC_NLED_ISINK_MIN = MT65XX_LED_PMIC_LCD_ISINK,
                //     MT65XX_LED_PMIC_NLED_ISINK0,
                //     MT65XX_LED_PMIC_NLED_ISINK1,
                //     MT65XX_LED_PMIC_NLED_ISINK2,
                //     MT65XX_LED_PMIC_NLED_ISINK3,
                //     MT65XX_LED_PMIC_NLED_ISINK_MAX,
                // };
                // 针对 MTK 的 PMIC LED,还有如下可设置选项
                //      enum MT65XX_PMIC_ISINK_MODE {
                //          ISINK_PWM_MODE = 0,
                //          ISINK_BREATH_MODE = 1,
                //          ISINK_REGISTER_MODE = 2
                //      };
                //    
                //      enum MT65XX_PMIC_ISINK_STEP {
                //          ISINK_0 = 0,		/* 4mA //
                //          ISINK_1 = 1,		/* 8mA //
                //          ISINK_2 = 2,		/* 12mA //
                //          ISINK_3 = 3,		/* 16mA //
                //          ISINK_4 = 4,		/* 20mA //
                //          ISINK_5 = 5		/* 24mA //
                //      };
                //    
                //      enum MT65XX_PMIC_ISINK_FSEL {
                //          /* 32K clock //
                //          ISINK_1KHZ = 0,
                //          ISINK_200HZ = 4,
                //          ISINK_5HZ = 199,
                //          ISINK_2HZ = 499,
                //          ISINK_1HZ = 999,
                //          ISINK_05HZ = 1999,
                //          ISINK_02HZ = 4999,
                //          ISINK_01HZ = 9999,
                //          /* 2M clock //
                //          ISINK_2M_20KHZ = 2,
                //          ISINK_2M_1KHZ = 61,
                //          ISINK_2M_200HZ = 311,
                //          ISINK_2M_5HZ = 12499,
                //          ISINK_2M_2HZ = 31249,
                //          ISINK_2M_1HZ = 62499
                //      };
    struct PWM_config config_data;
                //////////////////////////////////////
                // struct PWM_config {
                //     int clock_source;
                //     int div;
                //     int low_duration;
                //     int High_duration;
                //     bool pmic_pad;
                // };
};

具体的细节就不细表了,相关的 DTS 上值的选取就对应于相关数据结构体的赋值范围,可以酌值选择。

[MTK LED 驱动详细流程](file:PIC/MTK_Kernel_Led.txt)

Qcom LED 配置

高通平台相对来说与 MTK 平台功能上大同小异,但是因为使用的 MSM1937/17 + PMI8940 + PMI8937 平台没有独立的 LED 相关引脚,所以在配置时,需要将其他功能引脚配置为 LED 使用,目前高通可以配置为 LED 使用的引脚有如下类型:

  • RGB: 类似于 MTK 平台上的 ISINK 引脚
  • MPP(Multipurpose pin): 多功能复用引脚,可以配置使用 PWM/LUT/GPIO 模式驱动 LED
  • GPIO:通用输入输出引脚,类似 MPP,具体差异暂时未知,DTS 配置与 MPP 有较大差异

硬件原理

在这里插入图片描述

可以看到,Qcom 平台可作为 LED 引脚来源有很多,所以配置起来也比较麻烦,后面的软件配置针对最终使用的 MPP2 引脚的 DTS 配置来做一下讲解。

软件配置

MPP2 使用 PWM 输出驱动 LED

1. MPP 引用端配置
qcom,leds@a100 {
	compatible = "qcom,leds-qpnp";
	reg = <0xa100 0x100>;
	label = "mpp";
	
	///////////////////////////////////////////////////
	qcom,led_mpp_2 {
		label = "mpp";
		linux,name = "green"; 			//led的name为green 
		qcom,max-current = <40>;		//最大电流 
		qcom,id = <6>;
		
		qcom,current-setting = <5>;		//当前设置电流 
		qcom,source-sel = <8>;			// MPP 引脚输入源选择
		qcom,mode-ctrl = <0x60>;
		
		qcom,mode = "pwm";
		pwms = <&pmi8940_pwm 0 0>;
		qcom,pwm-us = <2000000>;		//led闪烁周期 
		qcom,pwm-channel = <0>;
		linux,default-trigger = "none"; //触发方式为none, 可以配置为"battery-charging","battery-full","notification"等.
		qcom,default-state = "off"; 	//led灯的默认状态 
		pwm-names = "green"; 
	
	};
	///////////////////////////////////////////////////
}

在这里插入图片描述

2. PWM 端配置
pmi8940_pwm: pwm@b000 {		
	compatible = "qcom,qpnp-pwm";
	reg = <0xb000 0x100>;
	reg-names = "qpnp-lpg-channel-base";
	qcom,channel-id = <0>;
	qcom,supported-sizes = <6>, <9>;
	#pwm-cells = <2>;
	///////////////////////////////////////////////////
	qcom,dtest-line = <1>;   //select DTEST1
	qcom,dtest-output = <1>; //select DTEST1  
	///////////////////////////////////////////////////
};

在这里插入图片描述

3 MPP 与 PWM 耦合

MPP 模块与 PWM 模块是两个独立的模块,他们是通过一个叫做 DTEST Line 的方式连接在一块的,所以需要在各自的 DTS 节点中做相应的配置,硬件示意图如下:

在这里插入图片描述

4 关闭其他模块对 DTEST1 引脚

开始调试了很长时间,怎么样 PWM 都无法输出,后来咨询高通,关闭如下位置即可

	// msm-pmi8940.dtsi
	wled: qcom,leds@d800 {
		compatible = "qcom,qpnp-wled";
		reg = <0xd800 0x100>,
			<0xd900 0x100>;
		reg-names = "qpnp-wled-ctrl-base",
				"qpnp-wled-sink-base";
		interrupts = <0x3 0xd8 0x2>;
		interrupt-names = "sc-irq";
		status = "okay";
		linux,name = "wled";
		linux,default-trigger = "bkl-trigger";
		qcom,fdbk-output = "auto";
		qcom,vref-mv = <350>;
		qcom,switch-freq-khz = <800>;
		qcom,ovp-mv = <29500>;
		qcom,ilim-ma = <980>;
		qcom,boost-duty-ns = <26>;
		qcom,mod-freq-khz = <9600>;
		qcom,dim-mode = "hybrid";
		qcom,dim-method = "linear";
		qcom,hyb-thres = <625>;
		qcom,sync-dly-us = <800>;
		qcom,fs-curr-ua = <20000>;
		qcom,en-phase-stag;
		qcom,led-strings-list = [00 01];
        ///////////////////////////////////////////////////
		// qcom,en-ext-pfet-sc-pro;
     	 ///////////////////////////////////////////////////
		qcom,cons-sync-write-delay-us = <1000>;
	};

在 WLED 背光中使用到了 DTEST1 这一路,查了下相关 PDF, 此配置是针对 OLED 的,我们用不下,就关闭了

参考示例

  • PMI8940+CHG_LED

      // Msm8937-pmi8940-mtp.dtsi (kernel\msm-3.18\arch\arm64\boot\dts\qcom)
      &pmi8940_charger {
          qcom,battery-data = <&mtp_batterydata>;
          qcom,chg-led-sw-controls;
          qcom,chg-led-support;		// 创建 sys 下节点
      };
    
  • PMI8940+MPP2(GPIO)

      // Msm-pmi8940.dtsi (kernel\msm-3.18\arch\arm64\boot\dts\qcom)
            qcom,leds@a100 {                            // 在需要添加 LED 的文件中添加
            	compatible = "qcom,leds-qpnp";
            	reg = <0xa100 0x100>;                   // 寄存器地址,映射长度
            	label = "mpp";
                
                ///////////////////////////////////////////////////
                qcom,led_mpp_2 {
            		label = "mpp";
            		linux,name = "green";               // sys 下节点名称
            		linux,default-trigger = "none";
            		qcom,default-state = "on";
            		qcom,max-current = <40>;
            		qcom,current-setting = <5>;
            		qcom,id = <6>;                  // qpnp_leds 中的值
                                // enum qpnp_leds {
                                //     QPNP_ID_WLED = 0,
                                //     QPNP_ID_FLASH1_LED0,
                                //     QPNP_ID_FLASH1_LED1,
                                //     QPNP_ID_RGB_RED,
                                //     QPNP_ID_RGB_GREEN,
                                //     QPNP_ID_RGB_BLUE,        // 5
                                //     QPNP_ID_LED_MPP,
                                //     QPNP_ID_KPDBL,
                                //     QPNP_ID_LED_GPIO,
                                //     QPNP_ID_MAX,
                                // };
            		qcom,mode = "manual";           // 不支持闪烁
            		qcom,source-sel = <1>;
            		qcom,mode-ctrl = <0x60>;
            	};
            
                ///////////////////////////////////////////////////
    
  • PM8937+GPIO6

      //  kernel\msm-3.18\arch\arm64\boot\dts\qcom\msm-pm8937.dtsi      
            ///////////////////////////////////////////////////
            qcom,leds@c500 {
                compatible = "qcom,leds-qpnp";
                reg = <0xc500 0x100>;
                status = "okay";
                qcom,led_gpio_6 {
                    label = "gpio";
                    linux,name = "red";
                    qcom,max-current = <40>;
                    qcom,id = <8>;
                    linux,default-trigger = "none";
                    qcom,default-state = "on";
                    qcom,turn-off-delay-ms = <1000>;
                    qcom,source-sel = <1>;
                    qcom,mode-ctrl = <0x10>;
                    qcom,vin-ctrl = <0x02>;
                };
            };
            ///////////////////////////////////////////////////
    

调试方法

  • wifi 连接 ADB

      // 由于 LED 受插拔 USB 线影响,所以可以使用 Wifi 连接 ADB 方式调试
      1. Connect the device to Wi-Fi.
      2. In device settings, go to Wi-Fi /WLAN.
      3. Select the network name to get the IP address.
      4. Connect the PC to the same wireless network.
      5. Connect the PC to the device via USB and do the following:
      	adb shell "setprop persist.adb.tcp.port 5555"
      	adb tcpip 5555
      6. Disconnect USB from the device and do the following:
      	adb connect <device’s IP address>
      	adb shell
    

  • ADB 操作 LED

      // sys 接口,用于底层接口调试使用
      	To enable the RGB LEDs via sysfs, echo a nonzero number to the brightness node:
      		adb shell "echo 255 > /sys/class/leds/red/brightness"
      		adb shell "echo 255 > /sys/class/leds/green/brightness"
      		adb shell "echo 255 > /sys/class/leds/blue/brightness"
    
      	To disable the RGB LEDs via sysfs, echo 0 to the brightness nodes:
      		adb shell "echo 0 > /sys/class/leds/red/brightness"
      		adb shell "echo 0 > /sys/class/leds/green/brightness"
      		adb shell "echo 0 > /sys/class/leds/blue/brightness"
    

  • ADB 读写 PMIC

      // 读写 PMIC 相关 sys 接口,目前用不上,暂时记在这里 
      // 读接口
      cd /sys/kernel/debug/spmi/spmi-0
      echo 0xA000> address
      echo 0x27FF > count
      cat data
    

  • ADB 自动补全

配置 Putyy

1.adb usb 配置

在这里插入图片描述

2.adb wifi 配置

在这里插入图片描述

3.快捷方式配置
在这里插入图片描述

相关资料

【非常好】PM8937PM8940_PMI8937PMI8940 Power Management IC.PMIC 相关框图.pdf

【非常好】80-p2564-2x_b_pm8937_hardware_register_description.寄存器表.pdf

【非常好】80-p2564-1_g_pm8937_pm8940_power_management_ic_device_specification.引脚功能介绍.pdf

【非常好】80-p2563-2x_b_pmi8937_pmi8940_hardware_register_description.寄存器表.pdf

【非常好】80-p2563-1_d_pmi8937_pmi8940_power_management_ic_device_specification.芯片描述.pdf

【非常好】80-p2468-2x_b_msm8937_hardware_register_description.硬件寄存器.pdf

【非常好】80_NM328_29_LINUX_PMIC_LIGHTING_DRIVER_USER_GUIDE.背光相关介绍.pdf

【非常好】80_NM328_35_LINUX_PMIC_LIGHT_PULSE_GENERATOR_USER_GUIDE.PWM_LPG 相关配置.pdf

【非常好】80-nv610-48_h_pmic_gpio_and_mpp_software_user_guide.pdf

Pwm-qpnp.c (kernel\msm-3.18\drivers\pwm)

Pwm-qpnp.txt (kernel\msm-3.18\documentation\devicetree\bindings\pwm)

Leds-qpnp.c (kernel\msm-3.18\drivers\leds)

Leds-qpnp.txt (kernel\msm-3.18\documentation\devicetree\bindings\leds)

Qpnp-smbcharger.c (kernel\msm-3.18\drivers\power)

猜你喜欢

转载自blog.csdn.net/wangjun7121/article/details/88120142