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_modedata = <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 datastruct 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 DTEST1qcom,dtest-output = <1>; //select DTEST1  ///
};

3 MPP 与 PWM 耦合

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

4 关闭其他模块对 DTEST1 引脚

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

 // msm-pmi8940.dtsiwled: 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 55556. 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-0echo 0xA000> addressecho 0x27FF > countcat 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)

Qcom Leds 配置相关推荐

  1. qcom sdm660 led 分析

    msm-pm660l.dtsi相关节点. qcom,leds@d000 {compatible = "qcom,leds-qpnp";reg = <0xd000 0x100& ...

  2. Qcom 相机点亮流程学习笔记

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.Kernel 代码移植 二.Vendor 代码移植 三.扩展 一.Kernel 代码移植 1. DT ...

  3. android adc,Android配置ADC接口

    文档说明 本文档以SC826-CN-01(msm8953平台)为例,说明ADC接口配置方法. ADC硬件连接 以SC826为例,预留的ADC1管脚,直连到PM8953的MPP_2管脚,如下图所示: A ...

  4. Android Qcom Display学习(十)

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

  5. 高通CameraSenorBringup

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.Kernel 代码移植 二.Vendor 代码移植 三.扩展 一.Kernel 代码移植 1. DT ...

  6. 高通平台手机开发之LCD

    4.1. LCD  参考文档:  1) 80-NA157-174_E_DSI_Programing_Guide_B-Family_Android_Devices.pdf 2) 80-NN766-1_A ...

  7. 高通平台添加屏幕驱动

    添加LK显示屏代码 修改/bootable/bootloader/lk/target/msm8952/oem_panel.c 添加屏幕厂家提供的驱动头文件,例: 将头文件添加到bootable/boo ...

  8. 基于PM8916 MPP创建一个Linux led子系统

    基于PM8916 MPP创建一个Linuxled子系统 首先,从kernel文件系统层面上创建sys文件系统节点/sys/class/leds/button-backlight/brightness的 ...

  9. SM7250(高通5G)平台LCD bringup

    写在前面的话 高通平台显示这一块,自从去年开始,高通全面使用SMxxxx命名的芯片 比如高端系列:SM8350(骁龙888),SM8250(骁龙865),SM8150(骁龙855) 中端系列:SM72 ...

最新文章

  1. mysql编程的二维数组_调出mysql中数据,输出一个二维数组的表格
  2. 【6月活动】投稿换T恤!只要你愿意分享!这件酷炫的T恤就是你的~!!
  3. 第十五届全国大学生智能汽车竞赛全国总决赛提交技术报告通知
  4. 基础知识收藏(ASP.NET的OnClientClick与OnClick事件)-2013.07.10
  5. 简单的动画函数封装(2)
  6. 冀教版五年级计算机教学计划,冀教版五年级上册教学计划资料
  7. Kafka学习(一)-------- Quickstart
  8. shell之引号嵌套引号大全
  9. dhcp服务器能为客户端提供哪些信息,为DHCP客户端提供DHCP服务器的MAC [关闭]
  10. php 其他页面获取session_PHP安全:XSS漏洞防御
  11. java supplier_Java 函数式编程
  12. halcon三种模板匹配方法
  13. 深度学习中的数据增强
  14. Ubuntu下fcitx安装。(ibus不会用)
  15. 愤怒的小鸟python代码_Python 愤怒的小鸟代码实现:物理引擎pymunk使用
  16. python3使用staf问题_python3 使用时遇到的问题
  17. 插值算法的Python实现方式
  18. 使用Pyecharts进行全国水质TDS地图可视化全过程9:构建字典,批量生成所有省份地图
  19. 使用原型骨架创建Maven项目时遇到Could not transfer metadata org.apache.maven.plugins的解决方案
  20. 奇瑞汽车用鸿蒙,奇瑞正式确认:将搭载“华为鸿蒙车机系统”,鸿蒙系统真的要来了...

热门文章

  1. 全新C#写的读取cad dxf文件,并解析显示,显示的图形可放大缩小平移
  2. 仁兄,可曾听闻OpenVINO
  3. 无心剑英译李白诗32首
  4. 单页应用SPA的优缺点
  5. 谁知道哪能下到英英字典的数据库呀?
  6. 【腾讯Bugly干货分享】人人都可以做深度学习应用:入门篇
  7. LTspice基础教程-027.自定义函数;func指令用法
  8. 学习《Linux就该这么学》第十五课
  9. 字节 位 字符 宽字符
  10. 高数:常用的函数泰勒公式