OpenHarmony GPIO应用开发-LED

学习于:
https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-develop.md
https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-des.md
通过OpenHarmony官方文档指导可获知:芯片厂商应当按照系统的平台驱动接口实现GPIO控制器驱动后,设备开发人员就可以按照系统GPIO的HDI接口使用GPIO,具体接口函数有:
在这里插入图片描述
其中函数参数gpioName指定IO口名,gpio指定IO口的ID,参数具体值由芯片厂商在.hcs配置文件中描述,如海思Hi3516中GPIO控制器驱动的描述:
在这里插入图片描述
Hi3516 GPIO控制器驱动自定义属性的描述:
在这里插入图片描述
其中属性groupNum指定Hi3516共有12组IO口,bitNum指定每组有8个IO口,由0 ~ 95数值分别表示96个IO,如GPIO2_3,则由数值19表示(2*8 + 3 = 19)。
属性gpioCustomName指定IO口的名称,依此名称可通过函数GpioGetByName获取IO口对应的ID。

接下来通过应用GPIO实现LED驱动:
开发板LED原理图
在这里插入图片描述
在这里插入图片描述
通过原理图可发现有: GPIO2_3 GPIO3_4 GPIO5_1控制LED的工作。

简单的LED驱动
在上篇简单的HDF驱动驱动源码基础上加入控制一个LED的代码,具体驱动源码:

#include <hdf_device_desc.h>
#include <hdf_log.h>
#include <hdf_base.h>
#include <gpio_if.h>  // GPIO驱动调用接口static int idGpio = 0;static int32_t myDispatch(struct HdfDeviceIoClient *client, int id, struct HdfSBuf *data, struct HdfSBuf *reply)
{HDF_LOGD("### in %s : %d\n", __func__, id);GpioWrite(idGpio, id%2); //配置GPIO输出高低电平return HDF_SUCCESS;
}int32_t myBind(struct HdfDeviceObject *obj)
{static struct IDeviceIoService testService = {.Dispatch = myDispatch,};obj->service = &testService;HDF_LOGD("#### in %s\n", __func__);idGpio = GpioGetByName("GPIO2_3"); //获取GPIO的IDGpioSetDir(idGpio, GPIO_DIR_OUT); //配置GPIO作输出用途return HDF_SUCCESS;
}
int32_t myInit(struct HdfDeviceObject *obj)
{HDF_LOGD("#### in %s\n", __func__);return HDF_SUCCESS;
}
void myRelease(struct HdfDeviceObject *obj)
{HDF_LOGD("#### in %s\n", __func__);
}struct HdfDriverEntry myTestEntry = {.Bind = myBind,.Init = myInit,.Release = myRelease,.moduleName = "myTestDriver",.moduleVersion = 1
};
HDF_INIT(myTestEntry);

沿用上篇里的应用程序,当应用程序执行起来后,开发板的LED会在GPIO输出高电平时亮,低电平时熄。

硬件资源分离与可重用的LED驱动
按照OpenHarmony文档指导,硬件相关的资源应当在.hcs配置文件中描述。这里三个LED分别作为一个设备进行描述 :
在这里插入图片描述
然后在vendor/hisilicon/hispark_taurus/hdf_config/目录下创建myLight文件夹,并在文件夹里创建myLight.hcs配置文件,描述设备自定义的属性:
在这里插入图片描述
每个节点通过match_attr与设备节点的deviceMatchAttr进行匹配,相同值表示此节点资源由对应的设备使用。 gpioName自定义属性向LED驱动提供LED设备的控制IO。
然后修改vendor/hisilicon/hispark_taurus/hdf_config/hdf.hcs配置文件,增加myLight.hcs文件的使用:
在这里插入图片描述

驱动源文件myTestDriver.c代码修改为:

#include <hdf_device_desc.h>
#include <hdf_log.h>
#include <hdf_base.h>
#include <gpio_if.h>
#include <device_resource_if.h>
#include <osal_mem.h>struct myLightService {struct IDeviceIoService service;int idGpio;const char *gpioName;
};static int32_t myDispatch(struct HdfDeviceIoClient *client, int id, struct HdfSBuf *data, struct HdfSBuf *reply)
{struct HdfDeviceObject *obj = client->device;struct myLightService *srv = (struct myLightService *)(obj->service);HDF_LOGD("### in %s, %s  %d\n", __func__,  srv->gpioName, id);GpioWrite(srv->idGpio, !!id);return HDF_SUCCESS;
}int32_t myBind(struct HdfDeviceObject *obj)
{struct myLightService *srv = NULL;struct DeviceResourceIface *dr = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);srv = OsalMemCalloc(sizeof(struct myLightService));dr->GetString(obj->property, "gpioName", &srv->gpioName, NULL);srv->service.Dispatch = myDispatch;srv->idGpio = GpioGetByName(srv->gpioName);GpioSetDir(srv->idGpio, GPIO_DIR_OUT);obj->service = &srv->service;return HDF_SUCCESS;
}
int32_t myInit(struct HdfDeviceObject *obj)
{return HDF_SUCCESS;
}
void myRelease(struct HdfDeviceObject *obj)
{struct myLightService *srv = (struct myLightService *)(obj->service);OsalMemFree(srv);
}struct HdfDriverEntry myTestEntry = {.Bind = myBind,.Init = myInit,.Release = myRelease,.moduleName = "myTestDriver",.moduleVersion = 1
};
HDF_INIT(myTestEntry);

应用程序mytest.c代码修改为:

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "hdf_log.h"
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"int main(int argc, char *argv[])
{if (3 != argc){printf("usage: %s  serviceName  num \n", argv[0]);return 1;}struct HdfIoService *srv = HdfIoServiceBind(argv[1]);if (srv == NULL) {printf("fail to get service\n");return 1;}int ret = srv->dispatcher->Dispatch(&srv->object, atoi(argv[2]), NULL, NULL);printf("test end\n");HdfIoServiceRecycle(srv);return 0;
}

应用程序执行时通过指定不同的服务名与电平值控制LED,如:

  ./bin/mytest  myTestService0   1      ./bin/mytest  myTestService1   1    

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

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

相关文章

XILINX原语之——xpm_fifo_async(异步FIFO灵活设置位宽、深度)

目录 一、"fwft"模式&#xff08;First-Word-Fall-Through read mode&#xff09; 1、写FIFO 2、读FIFO 二、"std"模式&#xff08;standard read mode&#xff09; 1、写FIFO 2、读FIFO 调用方式和xpm_fifo_sync基本一致&#xff1a; XILINX原语之…

系统学习算法:动态规划(斐波那契+路径问题)

题目一&#xff1a; 思路&#xff1a; 作为动态规划的第一道题&#xff0c;这个题很有代表性且很简单&#xff0c;适合入门 先理解题意&#xff0c;很简单&#xff0c;就是斐波那契数列的加强版&#xff0c;从前两个数变为前三个数 算法原理&#xff1a; 这五步可以说是所有…

《让内容“活”起来:Flutter社交应用瀑布流布局的破界实践》

用户动态的展示方式如同舞台的布景&#xff0c;直接影响着观众——用户的体验。而瀑布流布局&#xff0c;以其独特的美感和高效的信息展示能力&#xff0c;成为众多社交应用的心头好。当我们滑动着Instagram、Pinterest&#xff0c;或是国内热门的小红书&#xff0c;那种内容如…

微机控制技术复习【一】

填空题&#xff1a; 简答题&#xff1a; 1、什么是计算机控制系统?其典型形式有哪些? 2、给出 DDC &#xff08;直接数字控制&#xff09;控制系统结构框图&#xff0c;并说明各组成部分的作用&#xff1f; 3、采样周期选择的理论依据是什么?工程应用中应如何选择?选择采样…

前端学习基础—VScode环境配置及html基础知识

作为初学者&#xff0c;一个好的开发环境能极大地提高理解与学习的效率&#xff0c;本文分享我的VScode环境配置方法&#xff0c;涵盖插件、主题、快捷键等&#xff0c;希望能助你快速搭建舒适边界的前端学习环境。 一、VSCode环境配置 首先找到vscode插件商店&#xff0c;在这…

【一】 基本概念与应用领域【830数字图像处理】

考纲 文章目录 1 概念2005甄题【名词解释】2008、2012甄题【名词解释】可考题【简答题】可考题【简答题】 2 应用领域【了解】2.1 伽马射线成像【核医学影像】☆2.2 X射线成像2.3 紫外波段成像2.4 可见光和红外波段成像2.5 微波波段成像2.6 无线电波段成像2.7 电子显微镜成像2…

QuecPython错误码汇总

QuecPython中定义的各种错误代码常量 错误码常量错误码释义QUEC_PY_FAIL-1Generic failure codesQUEC_PY_OK0Quec_py value indicating success (no error)QUEC_PY_EPERM1Operation not permittedQUEC_PY_ENOENT2No such file or directoryQUEC_PY_ESRCH3No such processQUEC_…

C++学习-入门到精通-【4】函数与递归入门

C学习-入门到精通-【4】函数与递归入门 函数与递归入门 C学习-入门到精通-【4】函数与递归入门一、 数学库函数sqrt()ceil()cos()exp()fabs()floor()fmod()log()log10()pow()sin()tan()总结 二、具有多个形参的函数定义三、函数原型、函数签名和实参的强制类型转换函数原型函数…

天线测试报告解读学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、无源测试和有源测试二、无源测试报告1.驻波2.回损3.史密斯圆图4.效率5.增益6.天线方向图7.天线隔离度8.无源测试总结 三、有源测试报告1.TRP与TIS2.测试指标…

GEC6818蜂鸣器驱动开发

相关知识&#xff1a;Linux设备驱动开发 insmod 编译好的.ko文件后再运行beep_app.c编译完成的可执行文件即可使板子蜂鸣。 beep_drv.c: #include <linux/module.h> //包含了加载模块时需要使用的大量符号和函数声明 #include <linux/kernel.h> //包含了printk内…

电脑定时管家!Wise Auto Shutdown 深度测评:多任务执行 + 灵活定时

各位电脑小达人&#xff0c;今天给大家介绍一款超厉害的Windows系统定时任务管理工具——Wise Auto Shutdown&#xff01;这玩意儿就像电脑的贴心小管家&#xff0c;能自动执行关机、重启这些操作&#xff0c;时间设定灵活得很&#xff0c;还有提醒机制呢。下面我给大家好好唠唠…

vscode 配置qt

工具&#xff1a;vscode、qttools、qtconfigure Search Mode改成基于cmake的。 # 在项目中指定Qt的路径 set(Qt5_DIR "/home/jp/qt-everywhere-src-5.12.9/arm-qt/lib/cmake/Qt5") # 用于指定 Qt5 的安装路径 find_package(Qt5 REQUIRED COMPONENTS Widgets)这样就…

基于Boost库、Jsoncpp、cppjieba、cpp-httplib等构建Boost搜索引擎

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;项目 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 项目背景技术栈和项目环境正排索引和倒排索引数据去标签与清洗下载数据源去标签 建立索引构建正排索引构建倒排索引 建立搜索引擎h…

QMK机械键盘固件开发指南:从源码到实践

QMK机械键盘固件开发指南&#xff1a;从源码到实践 前言 QMK&#xff08;Quantum Mechanical Keyboard&#xff09;是一款开源的键盘固件&#xff0c;支持众多自定义键盘的功能配置。通过QMK&#xff0c;您可以完全掌控键盘的每一个按键&#xff0c;实现复杂的宏指令、多层按…

WPF 导航

WPF 导航相关控件/机制 控件 / 类说明常用属性/方法Frame用来承载不同的页面 (Page) 并在它们之间切换的容器。Source&#xff08;导航到的 URI&#xff09; Navigate()&#xff08;导航方法&#xff09; CanGoBack / GoBack() CanGoForward / GoForward()Page表示一个单独的可…

时序建模演进之路:从 MLP、RNN 到 LSTM 与 GRU

时序建模演进之路&#xff1a;从 MLP、RNN 到 LSTM 与 GRU 您是否好奇机器如何能像人类一样理解、生成流畅的文本&#xff0c;甚至是从海量代码中自动生成文档&#xff1f;这些自然语言处理 (NLP) 领域的迷人挑战&#xff0c;其核心在于模型处理和记忆 序列数据 的能力。 然而…

【Redis——数据类型和内部编码和Redis使用单线程模型的分析】

文章目录 Redis的数据类型和内部编码单线程模型的工作过程Redis在处理命令时虽然是一个单线程模型&#xff0c;为啥效率那么高&#xff0c;速度快呢&#xff1f; 总而言之&#xff0c;Redis提供的哈希表容器并不一定真的是真的哈希表&#xff0c;而是在特点的场景下&#xff0c…

鸿蒙NEXT开发动画(风格的旋转加载动画组件)

1.创建空白项目 2.Page文件夹下面新建Spin.ets文件&#xff0c;代码如下&#xff1a; /*** SpinKit 风格的旋转加载动画组件。** component* param spinSize - 动画容器大小&#xff08;必须为正数&#xff09;* param spinColor - 动画颜色&#xff08;支持资源引用&#xf…

后端接口请求http改为https

1、使用 OpenSSL 生成自签名证书 在Linxu服务器上执行如下命令&#xff1a; openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes 运行此命令后&#xff0c;会提示输入一些信息&#xff08;如国家、省份、城市、组织名称等&#xff09;&…

工作记录 2017-12-12 + 在IIS下发布wordpress

工作记录 2017-12-12 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 在IIS下发布wordpress。 郝 服务器更新 RD服务器更新了&#xff0c;更新的文件放在190的D:\Temp\CHTeam\fnehr_update_20171212\下了。 数据库更新: 数据库没有更新 更新的文件&#xf…