SDM660平台PWM配置

2023-10-10 11:10
文章标签 配置 平台 pwm sdm660

本文主要是介绍SDM660平台PWM配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述:高通sdm660平台代码默认配置为WLED,支持OLED,而我们的硬件设置为PWM,刚开始配置,我直接让跑了wled,但并没有输出,当手动拉高pwm输出,屏可以正常显示,所以就需要配置pwm,分为xbl和kernel两个阶段的配置。

1、xbl配置

根据硬件,两个控制引脚背光使能gpio76和PWM(pm660a_gpio6),首先我们需要将gpio6复用为pwm,另外,xbl采用了lpg模式控制背光(lpg=pwm),添加如下:

diff --git a/boot_images/QcomPkg/Sdm660Pkg/Library/MDPPlatformLib/MDPPlatformLib.c b/boot_images/QcomPkg/Sdm660Pkg/Library/MDPPlatformLib/MDPPlatformLib.c
index 874e14d90..221127074 100755
--- a/boot_images/QcomPkg/Sdm660Pkg/Library/MDPPlatformLib/MDPPlatformLib.c
+++ b/boot_images/QcomPkg/Sdm660Pkg/Library/MDPPlatformLib/MDPPlatformLib.c
@@ -65,6 +65,7 @@ extern "C" {*/#define CDP_DISP_RESET_GPIO               53      //GPIO number for LCD0_RESET_N#define CDP_DISP_TE_GPIO                  59      //GPIO number for TE
+#define CDP_DISP_BL_EN_GPIO               76/* Helper macro for supported panels table entry PanelInfoType */#define PANEL_CREATE_ENTRY(_name_,_id_,_dtlable_,_interface_,_xml_,_cfg_,_pll_, _top0_, _top1_, _top2_)     \
@@ -535,7 +536,7 @@ const static int8 CM546B1_1080p_video_xmldata[] ="</DSITermSequence>\n""<Group id='Backlight Configuration'>"" <BacklightType units='MDP_Panel_BacklightType'>1</BacklightType>\n"
-" <BacklightPmicControlType units='MDP_PmicBacklightControlType'>2</BacklightPmicControlType>\n"
+" <BacklightPmicControlType units='MDP_PmicBacklightControlType'>1</BacklightPmicControlType>\n"" <DisplayResetInfo>0 10 10000 10000 0</DisplayResetInfo>\n""</Group>\n";/*added by cyl for lcd bring up JIRA:MC0310-2 --end*/
@@ -2140,6 +2141,11 @@ static MDP_Status Panel_CDP_PowerUp(MDP_Display_IDType eDisplayId, Panel_PowerCt{DEBUG((EFI_D_WARN, "DisplayDxe: Configure GPIO %d for TE line failed %d\n", CDP_DISP_TE_GPIO));}
+
+    TLMMProtocol->ConfigGpio((UINT32)EFI_GPIO_CFG(CDP_DISP_BL_EN_GPIO, 0, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_2MA), TLMM_GPIO_ENABLE);
+    TLMMProtocol->GpioOut((UINT32)EFI_GPIO_CFG(CDP_DISP_BL_EN_GPIO, 0, GPIO_OUTPUT, GPIO_NO_PULL, GPIO_2MA), GPIO_HIGH_VALUE);}return Status;
@@ -2497,6 +2503,45 @@ static MDP_Status Panel_CDP_BacklightLevel(MDP_Display_IDType eDisplayId, Panel_}}break;
+    case MDP_PMIC_BACKLIGHT_CONTROLTYPE_LPG:
+         {
+           EFI_QCOM_PMIC_LPG_PROTOCOL *PmicLpgProtocol = NULL;
+               EFI_QCOM_PMIC_GPIO_PROTOCOL *PmicGpioProtocol = NULL;
+
+               if (EFI_SUCCESS != gBS->LocateProtocol(&gQcomPmicGpioProtocolGuid, NULL, (VOID **)&PmicGpioProtocol))
+               {
+                       Status = MDP_STATUS_NO_RESOURCES;
+               }
+               else
+               {
+                       Status = PmicGpioProtocol->ConfigDigitalOutput(PMIC_PMI_DEV_INDEX,
+                                                                           EFI_PM_GPIO_6,
+                                                                           EFI_PM_GPIO_OUT_BUFFER_CONFIG_CMOS,
+                                                                           EFI_PM_GPIO_VIN0,
+                                                                           EFI_PM_GPIO_SOURCE_SPECIAL_FUNCTION1,
+                                                                           EFI_PM_GPIO_OUT_BUFFER_LOW,
+                                                                           1);
+                       if (EFI_SUCCESS != Status)
+                       {
+                               Status = MDP_STATUS_FAILED;
+                       }
+               }
+
+        if (EFI_SUCCESS != gBS->LocateProtocol(&gQcomPmicLpgProtocolGuid, NULL, (VOID **)&PmicLpgProtocol))
+               {
+                 Status = MDP_STATUS_NO_RESOURCES;
+               }
+               else
+               {
+                 if (EFI_SUCCESS != PmicLpgProtocol->LpgConfig(PMIC_PMI_DEV_INDEX, EFI_PM_LPG_CHAN_4, 102, EFI_PM_LPG_PWM_PRE_DIV_6, EFI_PM_LPG_PWM_FREQ_EXPO_7, EFI_PM_LPG_PWM_CLOCK_19_2_MHZ
, EFI_PM_LPG_PWM_9BIT))
+                 {
+                   DEBUG((EFI_D_ERROR, "LPG Protocol LpgConfig failed\n"));
+                 }
+               }
+         }
+         break;default:break;}
diff --git a/boot_images/QcomPkg/Sdm660Pkg/Library/MDPPlatformLib/MDPPlatformLib.inf b/boot_images/QcomPkg/Sdm660Pkg/Library/MDPPlatformLib/MDPPlatformLib.inf
index 48a53320e..67f9a82bf 100755
--- a/boot_images/QcomPkg/Sdm660Pkg/Library/MDPPlatformLib/MDPPlatformLib.inf
+++ b/boot_images/QcomPkg/Sdm660Pkg/Library/MDPPlatformLib/MDPPlatformLib.inf
@@ -38,12 +38,14 @@[Protocols]gEfiPlatformInfoProtocolGuidgEfiChipInfoProtocolGuid
+ gQcomPmicLpgProtocolGuidgQcomPmicWledProtocolGuidgQcomPmicIbbProtocolGuidgQcomPmicLabProtocolGuidgQcomPmicVersionProtocolGuidgQcomPmicLcdbProtocolGuidgQcomPmicOledbProtocolGuid
+ gQcomPmicGpioProtocolGuidgEfiTLMMProtocolGuid

lpg模式配置中参数说明:

PmicLpgProtocol->LpgConfig(PMIC_PMI_DEV_INDEX, EFI_PM_LPG_CHAN_4, 102, EFI_PM_LPG_PWM_PRE_DIV_6, EFI_PM_LPG_PWM_FREQ_EXPO_7, EFI_PM_LPG_PWM_CLOCK_19_2_MHZ, EFI_PM_LPG_PWM_9BIT)

PMIC_PMI_DEV_INDEX:PMIC接口设备(LCD / OLED)这里配置为1

EFI_PM_LPG_CHAN_4 :lpg通道,由所接gpio决定(芯片手册中可查看),选择channel4

EFI_PM_LPG_PWM_PRE_DIV_6 :脉宽调制前置分频器值

EFI_PM_LPG_PWM_FREQ_EXPO_7:LPG脉宽调制频率指数值

EFI_PM_LPG_PWM_CLOCK_19_2_MHZ:脉宽调制时钟

EFI_PM_LPG_PWM_9BIT:脉宽调制比特大小

这里如果想配置PWM,如下:

+ uint32 uWLEDValue = (0x1FF * pBacklightConfig->uLevel) / 100; // Calculate duty cycle based on 12 bit mode
+
+               eLocalStatus = PMICPWMProtocol->PwmConfig(0,
+                                            EFI_PM_PWM_RSRC_PWM_1,
+                                            uWLEDValue,
+                                            1,
+                                            2,
+                                            EFI_PM_PWM_CLK_19_2_MHZ,
+                                            EFI_PM_PWM_SIZE_9BIT);

2、kernel配置

kernel配置如xbl,首先配置了gpio6的func,设备树添加pwms,驱动中通过of_pwm_get(np, NULL)获取设备树信息,然后通过pwm_config()函数即可调用。

diff --git a/fibo/common/kernel/msm-4.19/arch/arm64/boot/dts/qcom/sc218-evk/pm660l.dtsi b/fibo/common/kernel/msm-4.19/arch/arm64/boot/dts/qcom/sc218-evk/pm660l.dtsi
index e5fa849ac..255b5d002 100755
--- a/fibo/common/kernel/msm-4.19/arch/arm64/boot/dts/qcom/sc218-evk/pm660l.dtsi
+++ b/fibo/common/kernel/msm-4.19/arch/arm64/boot/dts/qcom/sc218-evk/pm660l.dtsi
@@ -58,6 +58,18 @@"pm660l_gpio11", "pm660l_gpio12";gpio-controller;#gpio-cells = <2>;
+
+                       pwm_bl {
+                               pwm_bl_default: pwm_bl_default {
+                                       pins = "gpio6";
+                                       function = "func1";
+                                       bias-disable;
+                                       power-source = <0>;
+                                       output-low;
+                                       qcom,drive-strength = <3>;
+                                       drive-push-pull;
+                               };
+                       };};};diff --git a/fibo/common/kernel/msm-4.19/arch/arm64/boot/dts/qcom/sc218-evk/sdm660-mtp.dtsi b/fibo/common/kernel/msm-4.19/arch/arm64/boot/dts/qcom/sc218-evk/sdm660-mtp.dtsi
index e24afcc00..eee65bee1 100755
--- a/fibo/common/kernel/msm-4.19/arch/arm64/boot/dts/qcom/sc218-evk/sdm660-mtp.dtsi
+++ b/fibo/common/kernel/msm-4.19/arch/arm64/boot/dts/qcom/sc218-evk/sdm660-mtp.dtsi
@@ -119,10 +119,11 @@&mdss_dsi0 {qcom,dsi-pref-prim-pan = <&dsi_CM546B1_1080p_video>;pinctrl-names = "mdss_default", "mdss_sleep";
-        pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
+        pinctrl-0 = <&mdss_dsi_active &mdss_te_active &pwm_bl_default>;pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;qcom,platform-reset-gpio = <&tlmm 53 0>;qcom,platform-te-gpio = <&tlmm 59 0>;
+       qcom,platform-bklight-en-gpio = <&tlmm 76 0>;};@@ -188,9 +189,13 @@&dsi_CM546B1_1080p_video {
-        qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled";
-        qcom,mdss-dsi-bl-min-level = <1>;
-        qcom,mdss-dsi-bl-max-level = <4095>;
+        qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm";
+       qcom,mdss-dsi-bl-pwm-pmi;
+       pwms = <&pm660l_pwm 0 1000000>;
+       qcom,bl-pmic-pwm-period-usecs = <100>;
+       qcom,mdss-dsi-bl-pmic-pwm-frequency = <1000000>;
+       qcom,mdss-dsi-bl-min-level = <1>;
+       qcom,mdss-dsi-bl-max-level = <4095>;qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;};

参数说明:

pwms = <&pm660l_pwm 0 1000000>;

第一个参数 表示此背光接在 pm660l_pwm 上;
第二个参数 表示 index 为 0,pm660l_pwm下只有 1个 pwm,所以填 0
第三个参数 表示周期为 1000000ns(1ms)

3、pwm背光简单debug

cd pwmchip3
echo 0 > export
echo 1000000 > period
echo 500000 > duty_cycle
echo 1 > enable  //背光可亮

这篇关于SDM660平台PWM配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/180036

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短