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

有了它,开发人员在开发过程中就可以轻松上手,充分利用传统开发模式下积累的经验。所以低代码平台对于程序员来说,有着很大帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机基础知识8】深入理解OSI七层模型

目录 一、前言 二、OSI七层模型概述 三、第一层:物理层 四、第二层:数据链路层 五、第三层:网络层 六、第四层:传输层 七、第五层:会话层 八、第六层:表示层 九、第七层:应用层 十、O…

QT QFrame控件使用详解

本文详细的介绍了QFrame控件的各种操作,例如:设置框架形状、设置框架阴影、设置线宽、中间线宽、设置框架样式、设置大小策略、设置样式表、其它文章等等操作。 实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时…

20.添加HTTP模块

添加一个简单的静态HTTP。 这里默认读者是熟悉http协议的。 来看看http请求Request的例子 客户端发送一个HTTP请求到服务器的请求消息,其包括:请求行、请求头部、空行、请求数据。 HTTP之响应消息Response 服务器接收并处理客户端发过来的请求后会返…

【Linux】工具Gdb调试轻度使用(C++)

目录 一、Gdb背景 二、Gdb基本命令 【2.1】list | l 【2.2】break | b 【2.5】delete | d 【2.6】disable 【2.7】enable 【2.3】info 【2.4】info locals 【2.6】run | r 【2.7】next | n 【2.8】step | s 【2.9】 continue | c 【2.10】bt 【2.11】finish 三…

DHTMLX Gantt 8.0.5 Crack -甘特图

8.0.5 2023 年 9 月 1 日。错误修复版本 修复 修复通过gantt.getGanttInstance配置启用扩展而触发的错误警告修复启用skip_off_time配置时gantt.exportToExcel()的不正确工作示例查看器的改进 8.0.4 2023 年 7 月 31 日。错误修复版本 修复 修复数据处理器不跟踪资源数据…

MNIST手写数字辨识-cnn网路 (机器学习中的hello world,加油)

用PyTorch实现MNIST手写数字识别(非常详细) - 知乎 (zhihu.com) 参考来源(这篇文章非常适合入门来看,每个细节都讲解得很到位) 一、模块函数用法-查漏补缺: 1.关于torch.nn.functional.max_pool2d()的用法: 上述示例…

优化VUE Element UI的上传插件

默认ElmentUI的文件列表只有一个删除按钮&#xff0c;我需要加预览、下载、编辑等&#xff0c;就需要优化显示结果。 优化后没用上传进度条&#xff0c;又加了一个进度条效果 代码 <template><div><el-uploadclass"upload-demo"action"/"…

OPPO/真我手机ColorOS13系统解账户锁-移除手机密码图案锁方法

在搞机之前&#xff0c;请确定自己的手机不是非法获取&#xff0c;本文只讲叙ColorOS13系统解锁方法&#xff0c;仅为个人测试研究出来的经验&#xff0c;未对官方系统进行任何修改。只推荐专业维修师傅从维修的角度进行解锁&#xff0c;不推荐个人用户对非自己的手机进行非法破…

传输层-TCP 的安全机制和高效策略

可靠性&#xff1a; 之前我们在UDP中谈到了&#xff0c;UDP不可靠但是简单&#xff0c;TCP可靠但是也要做更多的工作&#xff0c;那这些工作具体是什么呢&#xff1f;接下来让我们详细了解一下。 确认应答机制&#xff08;ACK机制&#xff09; 序号&#xff1a;我们可以把TCP…

如何按文件名称自动归类,助您轻松管理文件

在日常工作和生活中&#xff0c;我们经常会遇到大量的文件需要管理。如果这些文件没有得到良好的归类和整理&#xff0c;不仅会浪费我们的时间和精力&#xff0c;还会给我们带来困扰和混乱。今天我们一起来看看怎么按文件名称来自动归类&#xff0c;批量整理文件&#xff0c;让…

云数据库知识学习——概述

一、云计算是云数据库兴起的基础 云计算是分布式计算、并行计算、效用计算、网络存储、虚拟化、负载均衡等计算机和网络技术发展融合的产物。云计算是由一系列可以动态升级和被虚拟化的资源组成的&#xff0c;用户无需掌握云计算的技术&#xff0c;只要通过网络就可以访问这些资…

图床项目性能测试

文章目录 一、FastDFS文件性能测试1.1 上传文件测试1.2 下载测试1.3 删除文件测试1.4 如何提高 二、图床项目wrklua性能测试2.1 wrk2.2 MySQL索引优化2.2 注册测试2.2.1 无索引性能2.2.2 有索引性能 2.3 登录测试2.3.1 无索引性能2.3.2 有索引性能 2.4 读取文件测试2.4.1 无索引…