OpenHarmony:如何使用HDF驱动控制LED灯
一、程序简介
该程序是基于OpenHarmony标准系统编写的基础外设类:RGB LED。
目前已在凌蒙派-RK3568开发板跑通。详细资料请参考官网:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b02_hdf_rgb_led。
详细资料请参考OpenHarmony官网:
- GPIO平台驱动开发
- GPIO应用程序开发
二、硬件设计
RGB LED灯整体硬件电路如下图所示,硬件电路中包含了三个GPIO控制管脚控制RGB LED灯,低电平点亮LED灯,高电平熄灭LED灯。电路简单,这边不对此进行多余的说明。
三、程序解析
1、目录结构
b02_hdf_rgb_led
├── config # HDF资源配置文件目录├── config.hcs # 接口IO配置文件├── device_info.hcs # 设备信息配置文件
├── drivers # 内核HDF驱动程序目录├── rgb_led_drv.c # 内核HDF驱动程序├── Makefile # 内核HDF驱动编译脚本
├── figures # MD文档图片
├── BUILD.gn # GN文件
├── rgb_led.c # 应用层控制程序
2、内核HDF驱动程序
(1)接口函数
- 函数名:HdfRgbLedDriverInit.
- 功能说明:HDF初始化注册,读取HDF资源配置文件,获取三色灯控制GPIO管脚。
int32_t HdfRgbLedDriverInit(struct HdfDeviceObject *deviceObject)
{if (deviceObject == NULL) {HDF_LOGE("g_rgbLedDriverEntry: %s failed", __func__);return HDF_ERR_INVALID_OBJECT;}struct DeviceResourceIface *CfgOps = NULL;CfgOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);if (CfgOps == NULL || CfgOps->GetUint32 == NULL) {HDF_LOGE("%s: DeviceResourceGetIfaceInstance failed", __func__);return HDF_FAILURE;}if (CfgOps->GetUint32(deviceObject->property, "rgb_led_version", &g_rgbLedCfg.rgb_led_version, 0) != HDF_SUCCESS) {HDF_LOGE("%s: read rgb_led_version failed", __func__);return HDF_FAILURE;}if (CfgOps->GetUint32(deviceObject->property, "rgb_led_red", &g_rgbLedCfg.rgb_led_red, 0) != HDF_SUCCESS) {g_rgbLedCfg.rgb_led_version = 0;HDF_LOGE("%s: read rgb_led_red failed", __func__);return HDF_FAILURE;}if (CfgOps->GetUint32(deviceObject->property, "rgb_led_green", &g_rgbLedCfg.rgb_led_green, 0) != HDF_SUCCESS) {g_rgbLedCfg.rgb_led_version = 0;HDF_LOGE("%s: read rgb_led_green failed", __func__);return HDF_FAILURE;}if (CfgOps->GetUint32(deviceObject->property, "rgb_led_blue", &g_rgbLedCfg.rgb_led_blue, 0) != HDF_SUCCESS) {g_rgbLedCfg.rgb_led_version = 0;HDF_LOGE("%s: read rgb_led_blue failed", __func__);return HDF_FAILURE;}HDF_LOGI("g_rgbLedDriverEntry: %s success", __func__);return HDF_SUCCESS;
}
- 函数名:HdfRgbLedDriverRelease。
- 功能说明:HDF去注册。
void HdfRgbLedDriverRelease(struct HdfDeviceObject *deviceObject)
{if (deviceObject == NULL) {HDF_LOGE("g_rgbLedDriverEntry: %s failed", __func__);return;}HDF_LOGI("g_rgbLedDriverEntry: %s success", __func__);return;
}
- 函数名:HdfRgbLedDriverBind。
- 功能说明:HDF绑定解析函数。
int32_t HdfRgbLedDriverBind(struct HdfDeviceObject *deviceObject)
{if (deviceObject == NULL) {HDF_LOGE("g_rgbLedDriverEntry: %s failed", __func__);return HDF_ERR_INVALID_OBJECT;}static struct IDeviceIoService ledDriverServ = {.Dispatch = rgbLedDriverDispatch,};deviceObject->service = (struct IDeviceIoService *)(&ledDriverServ);HDF_LOGI("g_rgbLedDriverEntry: %s success NodeName[%s]", __func__,deviceObject->property->name);return HDF_SUCCESS;
}
- 函数名:rgbLedDriverDispatch。
- 功能说明:解析函数,解析应用层下发的命令,执行命令对应操作,RGB_LED_WRITE控制三色灯亮灭。
int32_t rgbLedDriverDispatch(struct HdfDeviceIoClient *client, int32_t cmdId,struct HdfSBuf *dataBuf, struct HdfSBuf *replyBuf)
{int32_t result = HDF_FAILURE;int32_t rgbLedMode = 0;if (client == NULL || client->device == NULL) {HDF_LOGE("driver device is NULL");return HDF_ERR_INVALID_OBJECT;}if (g_rgbLedCfg.rgb_led_version != RGB_LED_VERSION) {HDF_LOGE("driver rgb_led_version not match");return HDF_FAILURE;}switch (cmdId) {case RGB_LED_WRITE:result = HdfSbufReadInt32(dataBuf, &rgbLedMode);if (result) {HDF_LOGI("%s: mode:[0x%X][%s%s%s]", __func__, rgbLedMode,(rgbLedMode&RGB_LED_RED_BIT)?"R":"-",(rgbLedMode&RGB_LED_GREEN_BIT)?"G":"-",(rgbLedMode&RGB_LED_BLUE_BIT)?"B":"-");LedGpioCtrl(g_rgbLedCfg.rgb_led_red, (rgbLedMode&RGB_LED_RED_BIT)?LED_ON:LED_OFF);LedGpioCtrl(g_rgbLedCfg.rgb_led_green, (rgbLedMode&RGB_LED_GREEN_BIT)?LED_ON:LED_OFF);LedGpioCtrl(g_rgbLedCfg.rgb_led_blue, (rgbLedMode&RGB_LED_BLUE_BIT)?LED_ON:LED_OFF);}break;default:HDF_LOGE("%s: receiving unknown command", __func__);break;}return result;
}
- 函数名:LedGpioCtrl。
- 功能说明:LED GPIO控制函数,低电平点亮LED,高电平熄灭LED。
static int32_t LedGpioCtrl(uint16_t gpio, int32_t mode)
{uint16_t level = GPIO_VAL_HIGH;if (HDF_SUCCESS != GpioSetDir(gpio, GPIO_DIR_OUT)) {HDF_LOGE("%s: GpioSetDir failed", __func__);return HDF_FAILURE;}if (mode == LED_ON) {level = GPIO_VAL_LOW;} else if (mode == LED_OFF) {level = GPIO_VAL_HIGH;}if (HDF_SUCCESS != GpioWrite(gpio, level)) {HDF_LOGE("%s: GpioWrite failed", __func__);return HDF_FAILURE;}return HDF_SUCCESS;
}
3、应用层程序
(1)应用层代码分析
程序启动后获取命令行参数,如果命令行不带参数,RGB三色灯运行跑马灯;如果命令行带参数,根据传入的参数的低三位映射点亮对应的红灯、绿灯和蓝灯;通过HdfIoServiceBind绑定RGB三色灯HDF服务,获取HDF空间缓冲区,向缓冲区写入需要控制的RGB三色灯低三位数据,通过RGB_LED_WRITE命令下发到HDF驱动中,从而控制RGB三色灯亮灭。程序运行结束,回收HDF空间缓冲区和HDF服务。
int main(int argc, char* argv[])
{int ret = HDF_SUCCESS;int32_t mode = -1;if (argc == ARGS_NUM) {mode = atoi(argv[1]);/*low-3bits*/mode &= 0x7;HILOG_INFO(LOG_APP, "[%s] main enter: mode[%s%s%s][0x%X]",LOG_TAG,(mode&RGB_LED_BLUE_BIT)?"B":"-",(mode&RGB_LED_GREEN_BIT)?"G":"-",(mode&RGB_LED_RED_BIT)?"R":"-",mode);printf("RGB mode[%s%s%s][0x%X]\n",(mode&RGB_LED_BLUE_BIT)?"B":"-",(mode&RGB_LED_GREEN_BIT)?"G":"-",(mode&RGB_LED_RED_BIT)?"R":"-",mode);} else {HILOG_INFO(LOG_APP, "[%s] main enter: auto test RGB LED", LOG_TAG);printf("auto test RGB LED\n");}struct HdfIoService *serv = HdfIoServiceBind(RGB_LED_SERVICE_NAME);if (serv == NULL) {HILOG_ERROR(LOG_APP, "get service %s failed", RGB_LED_SERVICE_NAME);return -1;}struct HdfSBuf *data = HdfSbufObtainDefaultSize();if (data == NULL) {HILOG_ERROR(LOG_APP, "obtain data failed");return -1;}if (mode == -1) {mode = 0x8;while (mode) {HdfSbufFlush(data);if (!HdfSbufWriteInt32(data, --mode)) {HILOG_ERROR(LOG_APP, "write data failed");return -1;}ret = serv->dispatcher->Dispatch(&serv->object, RGB_LED_WRITE, data, NULL);sleep(1);}} else {if (!HdfSbufWriteInt32(data, mode)) {HILOG_ERROR(LOG_APP, "write data failed");return -1;}ret = serv->dispatcher->Dispatch(&serv->object, RGB_LED_WRITE, data, NULL);}HdfSbufRecycle(data);HdfIoServiceRecycle(serv);HILOG_INFO(LOG_APP, "[%s] main exit.", LOG_TAG);return ret;
}
四、运行程序
系统启动后,命令行运行命令:
rgb_led
五、运行结果
运行结果:
# rgb_led
auto test RGB LED# rgb_led 1
RGB mode[--R][0x1]
# rgb_led 2
RGB mode[-G-][0x2]
# rgb_led 3
RGB mode[-GR][0x3]
# rgb_led 4
RGB mode[B--][0x4]
# rgb_led 5
RGB mode[B-R][0x5]
# rgb_led 6
RGB mode[BG-][0x6]
# rgb_led 7
RGB mode[BGR][0x7]
最后,推荐一款应用开发神器
扯个嗓子!关于目前低代码在技术领域很活跃!
低代码是什么?一组数字技术工具平台,能基于图形化拖拽、参数化配置等更为高效的方式,实现快速构建、数据编排、连接生态、中台服务等。通过少量代码或不用代码实现数字化转型中的场景应用创新。它能缓解甚至解决庞大的市场需求与传统的开发生产力引发的供需关系矛盾问题,是数字化转型过程中降本增效趋势下的产物。
这边介绍一款好用的低代码平台——JNPF快速开发平台。近年在市场表现和产品竞争力方面表现较为突出,采用的是最新主流前后分离框架(SpringBoot+Mybatis-plus+Ant-Design+Vue3)。代码生成器依赖性低,灵活的扩展能力,可灵活实现二次开发。
以JNPF为代表的企业级低代码平台为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动,还没有了解过低代码的伙伴可以尝试了解一下。
应用:https://www.jnpfsoft.com/?csdn
有了它,开发人员在开发过程中就可以轻松上手,充分利用传统开发模式下积累的经验。所以低代码平台对于程序员来说,有着很大帮助。
相关文章:
OpenHarmony:如何使用HDF驱动控制LED灯
一、程序简介 该程序是基于OpenHarmony标准系统编写的基础外设类:RGB LED。 目前已在凌蒙派-RK3568开发板跑通。详细资料请参考官网:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b02_hdf_rgb_led。 …...
怎么在图片上编辑文字?这几种图片编辑工具了解下
在图片上编辑文字可以带来许多好处。首先,它可以更好地说明图片的内容和意义。有时候,一张图片可能不够清晰地传达想要表达的信息,但是通过在图片上添加文字说明,可以更好地让观众理解图片的意义。其次,编辑文字可以使…...
直播进入新风口:XR虚拟直播市场火爆,未来发展势不可挡
 近年来,直播行业随着技术的不断发展,呈现出了蓬勃的发展态势。在这个竞争日益激烈的直播行业中,XR虚拟直播成为了最新的风口。XR虚拟直播是一种新型的直播形式,通过虚拟现实技术,让用户置身于直播现场&a…...
安装 paddlepaddle paddleocr库,避坑指南
看到这个库我就头疼,因为换了电脑,不得不再来一遍,又是到处踩坑!拼了好几个小时,总结出来的最终解决方法!详细的傻瓜式解决! - import paddle 报错!illegal hardware instruction py…...
Java调用ChatGPT的API接口实现对话与图片生成
文章目录 步骤1:配置代理步骤2:添加依赖步骤3:编写Constants类步骤4:实现问答交互步骤5:实现图片生成 步骤1:配置代理 有些魔法是需要做配置的。否则无法正确实现代码测试。这里以我使用的工具为例说明。 …...
h5开发网站-css实现页面的背景固定定位
一、需求: 在页面滚动时,背景图片保持不变,而不是跟随滚动。 二、解决方式: 使用背景固定定位,只需要在CSS中增加一个background-attachment: fixed;属性即可。 具体代码: <div class"item_right…...
SpringBoot整合Redis完整篇
SpringBoot整合Redis完整篇 1、在springboot项目的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…...
花见Live Wallpaper Themes 4K Pro for mac(4k视频壁纸)
如果你希望让自己的Mac桌面焕发活力,那么Live Wallpaper & Themes 4K Pro正是一款值得尝试的软件。它提供了丰富的超高清4K动态壁纸和主题,可以让你轻松打造出个性化的桌面环境。 这款软件拥有众多令人惊叹的功能。其中最值得一提的是,它…...
FastJson 漏洞复现
文章目录 FastJson 漏洞复现1. FastJson 1.2.24 反序列化导致任意命令执行漏洞1.1 漏洞描述1.2 漏洞原理1.3 漏洞复现1.3.1 环境启动1.3.2 漏洞检测1.3.3 漏洞验证 1.4 漏洞利用1.5 修复方案 2. Fastjson 1.2.47 远程命令执行漏洞2.1 漏洞描述2.2 漏洞复现2.2.1 环境启动2.2.2 …...
jeesite实现excel导入功能(保姆级图文教程)
文章目录 前言一、准备工作1.准备一个excel模板,放入static目录2.application.yml文件中设置文件存储路径3.使用easyexcel插件解析excel数据,pom文件导入easyexcel二、使用步骤1.列表页添加下载模板按钮2.表单页添加文件上传3. 创建excel解析对应实体4.后台完成文件上传代码,…...
【B树 B+树】B树、B+树理论
目录 引入B树B树定义和性质m阶B树核心特性 B树B树的查找 引入B树 满足上面两个策略就是B树: m 叉查找树中,规定除了根节点外,任何结点至少有 ⌈ m / 2 ⌉ \lceil m/2 \rceil ⌈m/2⌉ 个分叉,即至少含有 ⌈ m / 2 ⌉ \lceil m/2 \…...
CRM软件系统能否监控手机的使用
CRM可以监控手机吗?答案是不可以。CRM是一款帮助企业优化业务流程,提高销售效率的工具。例如Zoho CRM,最多也就是听一下销售的通话录音,却不可以监控手机,毕竟CRM不是一款监控软件。 CRM的主要作用有以下几点…...
hutool的HttpRequest.post的使用-包括上传文档等多个传参【总结版本】
首先hutool已经为我们封装好了远程调用的接口,我们只要将对应的传参和方式对应填写即可 hutool官方文档 1实际应用 post 常见的使用json传参,contend type为application/json RequestMapping("login") ResponseBody public static String s…...
VR数字工厂,为企业工厂打造竞争新优势
工业经济中大部分行业都是制造业,为了合力助推工业经济提质增效,谋划推进制造业数字化转型就显得尤为重要了。用VR赋能工厂数字升级,打造VR数字工厂,满足各行各业沉浸式营销展示需求。 VR数字工厂是一种全新的工业模式,…...
记一次线程堵塞(挂起)导致消息队列积压
1 背景 A服务作为生产者,每天发送上千万的mq消息,每一个消息包含500个用户ids数据。B服务作为消费者,接受MQ消息并通过http调用第三方请求进行业务处理,消费组启用了rabbitmq的多线程消费组,一个实例并发40个mq消费者…...
被问实习最大的收获是什么可以怎么回答?
最大的收获? 了解大型项目的运转过程:总工程师给开发和测试串讲需求->开发编写需求的特性说明书,完成需求方案设计和评审->编码完成后对各个场景进行自测,上库后给相关模块人进行代码检视后并修改检视意见->在每个迭代转…...
如何理解图神经网络的傅里叶变换和图卷积
图神经网络(GNN)代表了一类强大的深度神经网络架构。在一个日益互联的世界里,因为信息的联通性,大部分的信息可以被建模为图。例如,化合物中的原子是节点,它们之间的键是边。图神经网络的美妙之处在于它们能…...
国家网络安全周2023时间是什么时候?有什么特点?谁举办的?
国家网络安全周2023时间是什么时候? 2023年国家网络安全宣传周将于9月11日至17日在全国范围内统一开展。其中开幕式等重要活动将在福建省福州市举行。今年网安周期间,除开幕式外,还将举行网络安全博览会、网络安全技术高峰论坛、网络安全微视…...
windows编程之线程同步万字总结(创建线程,互斥对象,互斥事件,信号量,关键段,多线程群聊服务器)
文章目录 创建线程方法一_beginthreadex函数讲解使用示例: 方法二CreateThread函数讲解:使用示例: 互斥对象:创建互斥对象CreateMutex 互斥事件介绍创建或打开一个未命名的互斥事件对象 信号量介绍信号量的相关函数使用示例 关键段相关函数错误使用示例正确使用示例…...
Git在已有的项目中引入Submodule子模块管理:添加、更新、删除(实战示例代码)
前言 在进行Git版本控制的过程中,有时候我们需要在已有的项目中引入子模块,以便复用其他独立的Git存储库的代码或文件。本文将详细介绍如何在已有项目下添加、更新和删除Git的Submodule子模块,并提供相关的示例代码。 实战场景 假设我们已…...
内网穿透实现Windows远程桌面访问Ubuntu,简单高效的远程桌面解决方案
文章目录 前言1. ubuntu安装XRDP2.局域网测试连接3.安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址 前言 XRDP是一种开源工具,它允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP外,xrdp工具还接受来自其他RDP客户端(如Fre…...
如何学习运营管理
运营管理(Operations Management)是一门管理学科,它关注如何高效地组织和管理企业的生产、服务、供应链和业务过程以达到组织的目标。运营管理是企业管理的一个重要领域,它包含了多个内容和职能: 生产管理:…...
腾讯云centos7.6安装部署备忘
1.Mysql 1.1 安装mysql wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install mysql-community-server 1.1.1 安装后重启 service mysqld restart 1.1.2 初次安装mysql,root账…...
【赠书活动】考研备考书单推荐
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...
中缀表达式 - 栈实现综合计算器
代码: package Algotithm.stackobject Calculator {def main(args: Array[String]): Unit {val expression "32*6-2"//创建两个栈:数栈、符号栈val numStack, operStack new ArrayStack2(10)//定义需要的相关变量var index, num1, num2, …...
html语音播报功能问题
语音播报有个问题,就是弹出层有时无法关闭页面的播报,如果弹出层也有语音播报,就会造成语音混者播放 解决办法就是在弹出窗口(我用的弹出层框架是layui的)之前清空语音 window.operEdit function (url, title){window.speechSynthesis.can…...
计算机重点学科评级B-,山东省属重点高校考情分析
山东科技大学(B-) 考研难度(☆☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1175字预计阅读:3分钟 2023考情概况 山东科技大学计…...
轻松搭建本地知识库的ChatGLM2-6B
近期发现了一个项目,它的前身是ChatGLM,在我之前的博客中有关于ChatGLM的部署过程,本项目在前者基础上进行了优化,可以基于当前主流的LLM模型和庞大的知识库,实现本地部署自己的ChatGPT,并可结合自己的知识…...
flink的物理DataFlow图及Slot处理槽任务分配
背景 在flink中,有几个比较重要的概念,逻辑DataFlow图,物理DataFlow图以及处理槽执行任务,本文就来讲解下这几个概念 概念详解 假设有以下代码:数据源和统计单词算子的并行度是2,数据汇算子的并行度是1&…...
与面试相关的redis
这里写自定义目录标题 📝 redis的知识点数据结构及其特性,用途和操作方法持久化高可用分布式锁发布订阅性能优化安全性数据分片缓存策略键过期删除策略内存淘汰策略 🤗 总结归纳📎 参考文章 😀 这里写文章的前言&#…...
网站建设shzanen/广告免费发布信息
摘要:语言模型即根据当前语境的上下文推断当前句子的意思。目录:1. 语言模型定义2. 基于深度学习的解决思路3. 语言模型的问题4. 未来展望一、语言模型定义1. 什么是语言模型?图1如图1所示&#x…...
网站开发vs2013/今日新闻最新头条
在 09/11/2020 时,我们再次遇到该错误 问题描述 我们再次遇到该问题,发现导致异常的原因并不是 Matcher 没有匹配到内容。如下代码可以重现错误: pipeline {agent anystages {stage(xterm testing) {steps {script {def pageContent "&…...
免费网站推广app/深圳seo顾问
开会已经成为职场的“标配”。有数据显示,企业管理层一天90%的时间需要用来沟通工作,大大小小的会议至少也要占据其中的三分之二。但是,召集困难、内容空泛、任务难以落地等,让“开会”二字成为职场中的贬义词。难道就没有一种更轻…...
网站数据维护/seo怎么做优化
本来准备上微软的SCOM 演示下system center2016的,顺便下一个windows 2016 RS15G的文件,2个小时过去了,还有2小时看样子绝对要过夜啊。然后搜了下其他开源的,发现了这货。Overview然后找了老牌监控软件MRTG, 全程Multi Router Tra…...
建设网站流程/合肥百度快速排名提升
本章内容: 1. PL/SQL的历史和背景 2. Oracle开发架构 知识点: 1. SQL和PL/SQL的关系: The SQL language is the interface to the Oracle Database 12c database engine, and Oracle extensions provide a competitive advantage. The PL…...
产品图案设计网站/搜索引擎营销特点是什么
目录 概述 安装MyQR 模块使用 模块参数介绍 简单的二维码 带图片的二维码 带动态图片的二维码 其他参数 概述 MyQR模块可以生成个性化的二维码图片。 安装MyQR 如果没有安装,那么就需要安装:pip install MyQR。 MyQR安装成功判断 模块使用 …...