鸿蒙南向开发—PWM背光(OpenHarmony技术)

news2024/11/16 5:58:48

背光驱动模型也是基于HDF框架开发的,整个框架如下:

现在以RK3568为例,来看看PWM背光整个驱动,这里使用的是PWM占空比控制的背光,默认基于hdf的pwm驱动已经OK!

需要注意的是:这里是基于HDF实现的PWM和PWM背光,所以Linux内核里面原生的PWM和PWM背光相关配置需要关闭

hcs

device_info

CODE
display :: host {
    hostName = "display_host";


    device_pwm_bl :: device {
        device0 :: deviceNode {
            policy = 0;
            priority = 95;
            preload = 0;
            moduleName = "PWM_BL";
            deviceMatchAttr = "pwm_bl_dev";
        }
    }
    device_backlight :: device {
        device0 :: deviceNode {
            policy = 2;
            priority = 90;
            preload = 0;
            permission = 0660;
            moduleName = "HDF_BL";
            serviceName = "hdf_bl";
        }
    }
}

config

lcd_config.hcs

CODE
root {
    backlightConfig {
        pwmBacklightConfig {
            match_attr = "pwm_bl_dev";
            pwmDevNum = 1;
            pwmMaxPeriod = 25000;
            backlightDevName = "hdf_pwm";
            minBrightness = 0;
            defBrightness = 127;
            maxBrightness = 255;
        }
    }
}

源码分析

PWM_BL驱动

PWM_BL驱动(pwm_bl.c)加载后在初始化时主要做了如下几个工作:

//初始化相关PWM模块,主要包括打开相应pwm模块,从hcs获取pwm的配置,并更新配置,
//主要调用pwm相关的驱动接口,如PwmOpen,PwmSetConfig等
ret = BlPwmDevInit(object, blPwmDev);


//注册Backlight设备,具体实现在后面的HDF_BL驱动,这里最重要的就是注册的操作函数集 g_blDevOps,后面有展开 
blDev = RegisterBlDev(blPwmDev->name, &blPwmDev->props, &g_blDevOps, blPwmDev);


//更新Backlight状态
if (UpdateBacklightState(blDev, FB_POWER_ON) != HDF_SUCCESS) {
    HDF_LOGE("%s: UpdateBacklightState fail", __func__);
}


//更新Backlight亮度
if (UpdateBrightness(blDev, blPwmDev->props.defBrightness) != HDF_SUCCESS) {
    HDF_LOGE("%s: UpdateBrightness fail", __func__);
}

g_blDevOps函数集,里面只有一个更新亮度的操作函数,该函数会调用更底层的pwm的HDF驱动接口去更新PWM的占空比,从而控制背光的亮度,具体如下:

static int32_t BlPwmUpdateBrightness(struct BacklightDev *blDev, uint32_t brightness)
{
    int32_t ret;
    uint32_t duty;
    struct BlPwmDev *blPwmDev = NULL;


    blPwmDev = ToBlDevPriv(blDev);
    if (blPwmDev == NULL) {
        HDF_LOGE("%s blPwmDev is null", __func__);
        return HDF_FAILURE;
    }
    if (blPwmDev->props.maxBrightness == 0) {
        HDF_LOGE("%s maxBrightness is 0", __func__);
        return HDF_FAILURE;
    }
    if (brightness == 0) {
        return PwmDisable(blPwmDev->pwmHandle);
    }
    duty = (brightness * blPwmDev->config.period) / blPwmDev->props.maxBrightness;
    ret = PwmSetDuty(blPwmDev->pwmHandle, duty);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("%s: PwmSetDuty failed, ret %d", __func__, ret);
        return HDF_FAILURE;
    }
    return PwmEnable(blPwmDev->pwmHandle);
}


static struct BacklightOps g_blDevOps = {
    .updateBrightness = BlPwmUpdateBrightness,
};

HDF_BL驱动

HDF_BL驱动(hdf_bl.c)功能主要有2大块:

对外提供IoService的 Dispatch 接口

主要涉及到一些对外命令的处理,包括:

static BlCmdHandle g_blDevCmdHandle[] = {
     HdfGetMinBrightness,    /*获取最小亮度*/
     HdfGetCurrBrightness,   /*获取当前亮度*/
     HdfGetDefBrightness,    /*获取默认亮度*/
     HdfGetMaxBrightness,    /*获取最大亮度*/
     HdfGetBlDevList,        /*获取背光设备列表*/
     HdfSetBrightness,       /*设置亮度*/
 };

RegisterBlDev()函数实现

主要是 BlDevManager 和 BacklightDev 的内存分配,赋值等,这里就略过了。

本文主要是对鸿蒙南向开发当中的部分技术解析,更多的鸿蒙OpenHarmony南北向开发技术可以前往主页查找,更多鸿蒙技术分布如下:(略缩图)

高清完整版可前往主页或思信。附文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1353851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 多态向下转型详解

文章目录 1 . 前言2 . 多态3 . 向下转型3.1 子类没有改进父类的方法下,去调用该方法3.2 子类有改进父类的方法下,去调用该方法3.3 子类没有改进父类虚函数的方法下,去调用改方法3.4 子类有改进父类虚函数的方法下,去调用改方法3.5…

捕捉“五彩斑斓的黑”:锗基短波红外相机的多种成像应用

红外处于人眼可观察范围以外,为我们了解未知领域提供了新的途径。红外又可以根据波段范围,分为短波红外、中波红外与长波红外。较短的SWIR波长——大约900nm-1700nm——与可见光范围内的光子表现相似。虽然在SWIR中目标的光谱含量不同,但所产…

JRT控制打印机

本次测试打印机控制和纸张方向控制。 打印机状态 选择打印机 控制纸张 定义纸张 旋转纸张 不旋转纸张 A4

java代码规范(适合写程序之前先了解有助于开发协同)

目录 一、类定义 二、方法定义 三、接口定义 四、变量定义 1、命名规范: 2、类型规范: 3、常量规范: 五、static关键字 1、静态变量(类变量): 2、静态方法(类方法)&#x…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C#) Baumer工业相机Baumer工业相机的图像剪切(ROI)功能的技术背景CameraExplorer如何使用图像剪切(ROI)…

Netty使用SSL实现双向通信加密

最近项目有个需求,TCP服务器实现基于证书通信加密,之前没做过,花了一些时间调研,今天整理下。 SSL(Secure Sockets Layer 安全套接字协议) 1、原理 算法原理 简而言之就是非对称加密算法 私钥自己持有,公钥发给对方,对方在发送信息的时候使用公钥进行加密数据,当接收到…

C++-类和对象(2)

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下 6 个默认成员 函数。 默认成员函数:用户没有显式实现,编译…

【AI】DETR模型可视化操作

Detr作为目标检测的算法,不同于之前算法的就是注意力机制,注意力机制能够直观看出来模型对图像关注的点,这个直观到底怎么直观呢,我们只听别人说肯定是不行的,上手测试才是最好的方式,像论文中插图那样的使…

【网络流】最大流与Ford–Fulkerson算法

目录 一、引言1.1 网络流问题1.2 “流”的定义1.3 “割”的定义 二、最大流最小割2.1 最大流2.2 最小割2.3 最大流最小割定理2.4 最大流最小割定理证明 三、Ford–Fulkerson算法3.1 增广路径3.2 剩余图3.3 算法代码3.4 FordFulkerson Demo 一、引言 1.1 网络流问题 网络流问题…

【教学类-43-13】 20240103 (4宫格数独:错误版:768套) 不重复的基础模板数量:768套

作品展示:——4宫格 768套不重复模板(64页*12套题) 有错误,实际数量小于768套 背景需求: 测试4宫格数独基础模板有几种。 写个程序,验算是不是真的是乘阶法的288种。 代码展示: 768套4宫格题…

AI原生应用开发“三板斧”亮相WAVE SUMMIT+2023

面对AI应用创新的风口跃跃欲试,满脑子idea,却苦于缺乏技术背景,不得不望而却步,这曾是许多开发者的苦恼,如今正在成为过去。 12月28日,WAVE SUMMIT深度学习开发者大会2023在北京举办。百度AI技术生态总经理…

【Java 基础】-- 实例化

1、定义 创建对象的过程就叫实例化。这个过程中会在堆中开辟内存,将一些非静态的方法,变量存放在里面。在程序执行的过程中,可以创建多个对象,既多次实例化。每次实例化都会开辟一块新的内存。 2、实例化的几种方法 new 关键字创…

STM32学习笔记十七:WS2812制作像素游戏屏-飞行射击游戏(7)探索动画之故事板,复杂动画

要让物体沿着路径移动,必须同时修改X/Y两个值,用两个连续插值动画行不行? 在单片机这种单线程设备,两个TICK会前后脚进行修改,具有相同的时间跨度,所以似乎也是可以的。但是在支持多线程的设备&#xff0c…

【CVPR2023】使用轻量 ToF 传感器的单目密集SLAM的多模态神经辐射场

目录 导读 本文贡献 本文方法 轻量级ToF传感器的感知原理 多模态隐式场景表示 时间滤波技术 实验 实验结果 消融实验 结论 未来工作 论文标题:Multi-Modal Neural Radiance Field for Monocular Dense SLAM with a Light-Weight ToF Sensor 论文链接&am…

Java程序设计阶段测试1

一、单选题(共15题; 共30.0分) 2.0分 1、以下哪个是Java应用程序main方法的有效定义? A.public static void main(); B.public static void main( String args ); C.public static void main( String args[] ); D.public static boolea…

交换机02_共享式交换式

1、共享式网络 早期的以太网是共享式网络,它是由集线器(HUB)相连,由一个HUB相连了两台主机,形成一个冲突域也称广播域。 (1)相关名词解释 集线器 HUB中心的意思,集线器就是对接收…

VINS-MONO拓展1----手写后端求解器,LM3种阻尼因子策略,DogLeg,构建Hessian矩阵

文章目录 0. 目标及思路1. 非线性优化求解器2. 基于VINS-MONO的Marginalization框架构建Hessian矩阵2.1 estimator.cpp移植2.2 solve.cpp/preMakeHessian()2.3 solve.cpp/makeHessian() 3. solve.cpp/solveLinearSystem()求解正规方程4. 更新状态5. 迭代求解6. EVO评估结果7. 待…

drf知识--10

接口文档 # 后端把接口写好后: 登录接口:/api/v1/login ---> post---name pwd 注册接口 查询所有图书带过滤接口 # 前后端需要做对接,对接第一个东西就是这个接口文档,前端照着接口文档开发 公司3个人&#xff…

LaTeX语法、工具及模板大全(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 我之前把Markdown和LaTeX的语法写在一个博文里了,但是现在感觉还是应该拆开来比较合适,因为LaTeX太复杂了…… LaTex核心其实是套模板,但是为了套好模版,也需要学习一些具体的语法。 文章目录 1.…

14 简约登录页

效果演示 实现了一个简单的登录表单的样式,包括背景颜色、边框、字体颜色、字体大小、字体粗细、输入框样式、提交按钮样式等。当用户在输入框中输入内容时,输入框下方的提示文字会动态地变化,以提示用户输入正确的信息。当用户点击提交按钮时…