OpenHarmony GPIO应用开发-LED

鸿蒙OpenHarmony【平台驱动开发之GPIO】 子系统 GPIO(General-purpose input/output)即通用型输入输出。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个或多个寄存器与之关联,通过读写寄存器完成对GPIO管脚的操作。 阅读详情
AI摘要

本文依据OpenHarmony官方文档,介绍了芯片厂商实现GPIO控制器驱动后,设备开发人员使用系统GPIO的HDI接口的方法。还阐述了Hi3516 GPIO控制器驱动自定义属性,通过应用GPIO实现LED驱动,包括简单LED驱动和硬件资源分离与可重用的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的代码,具体drivers/hdf_core/adapter/khdf/liteos/platform/src/myTestDriver.c驱动源码内容如下:

#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的ID
    GpioSetDir(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);



在applications/sample/camera/myhello/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;
}

同目录下的BUILD.gn内容如下:

hdf_framework_path = "../../../../../framework"

executable("mytest") {
  sources = [ "mytest.c" ]

  include_dirs = [
    "$hdf_framework_path/ability/sbuf/include",
    "$hdf_framework_path/core/shared/include",
    "$hdf_framework_path/core/host/include",
    "$hdf_framework_path/core/master/include",
    "$hdf_framework_path/include/core",
    "$hdf_framework_path/include/utils",
    "$hdf_framework_path/utils/include",
    "$hdf_framework_path/include/osal",
    "//third_party/bounds_checking_function/include",
    "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits",
  ]

  deps = [
    "//drivers/hdf_core/adapter/uhdf/manager:hdf_core",
    "//drivers/hdf_core/adapter/uhdf/posix:hdf_posix_osal",
    "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
  ]

  public_deps = [ "//third_party/bounds_checking_function:libsec_shared" ]
  defines = [ "__USER__" ]
}

然后修改applications/sample/camera/bundle.json文件增加内容:
在这里插入图片描述
完成后编译系统,并重新烧录OHOS_Image.bin与rootfs_vfat.img

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

  ./bin/mytest  myTestService0   1      
  ./bin/mytest  myTestService1   1    
鸿蒙OpenHarmony【LED外设控制】 (基于Hi3861开发板) OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力,包含I2C、I2S、ADC、UART、SPI、SDIO、GPIO、PWM、FLASH等。本文介绍如何通过调用OpenHarmony的NDK接口,实现对GPIO控制,达到LED闪烁的效果。其他的IOT外设控制,开发者可根据API指导文档完成,此处不逐一介绍。 阅读详情

相关推荐

OpenHarmony南向设备开发:轻量和小型系统-LED外设控制

本文介绍如何通过调用OpenHarmony的NDK接口,实现对GPIO控制,达到LED闪烁的效果。

初一十五的博客 1011

OpenHarmony轻量系统实验--GPIO点灯

此文主要记录了OpenHarmony的GPIO点灯实验的步骤,遇到的问题及解决方案;主要跟着连志安老师的教程进行学习

naturly的博客 1515

鸿蒙OpenHarmony【LED外设控制】 轻量和小型系统设备

OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力,包含I2C、I2S、ADC、UART、SPI、SDIO、GPIO、PWM、FLASH等。本文介绍如何通过调用OpenHarmony的NDK接口,实现对GPIO控制,达到LED闪烁的效果。其他的IOT外设控制,开发者可根据API指导文档完成,此处不逐一介绍。

adsjgfjha123123的博客 890

OpenHarmony驱动子系统开发—GPIO

GPIO(General-purpose input/output)即通用型输入输出。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个或多个寄存器与之关联,通过读写寄存器完成对GPIO管脚的操作。设置管脚方向: 方向可以是输入或者输出(暂不支持高阻态)读写管脚电平值: 电平值可以是低电平或高电平设置管脚中断服务函数:设置一个管脚的中断响应函数,以及中断触发方式使能和禁止管脚中断:禁止或使能管脚中断GPIO接口定义在文件中。

1 1421

基于 OpenHarmony 5.0 的星闪轻量型设备应用开发——Ch3 设备驱动开发

“设备”是相对于 WS63E 模组而言的其他硬件资源。这些“设备”可以是 LED 灯,也可以是蜂鸣器,亦或是温湿度传感器。如果想通过编写运行在 WS63E 上的 OpenHarmony 框架代码,用于控制这些设备的工作状态或能力,就需要进行设备驱动的开发。对 WS63E 而言,这些设备与之进行数据交互的通道就是 IO 引脚。基于 OpenHarmony 的 WS63E 设备驱动开发就是通过对相应 IO 引脚进行模式配置,数据赋值,数据读取,中断配置等一系列的操作。从本章开始,将以石院星闪物联网教学开发板为例

北斗星的杂志 2489

鸿蒙OH实战开发:OpenHarmony驱动子系统开发—GPIO按键事件中断

本案例程序是演示GPIO中断接口的基本使用,案例操作结果是通过按键切换开发板上的LED的点亮和熄灭效果。

liuhaojiabin的博客 1056

openharmony GPIO 驱动开发

GPIO:通用和专用 IO 的区别、不同平台下的 GPIO 的分组和编号、GPIO 常用调试手段HDF 驱动:GPIO 接口的配置方式、读写操作、中断,两种方式实现应用和驱动的通信,缓冲区的基本操作,基本覆盖了全部的 GPIO 接口提供一套完整的驱动程序和应用程序,并给出其目录结构。

跑不了的你的博客 2219

OpenHarmony驱动子系统开发—GPIO按键事件中断

本案例程序是演示GPIO中断接口的基本使用,案例操作结果是通过按键切换开发板上的LED的点亮和熄灭效果。本案例使用的按键根据开发板原理图可以得到,接入的是GPIO5号引脚。所以本次开发驱动的GPIO引脚是GPIO5。

m0_70748458的博客 1089

OpenHarmony-4.GPIO驱动(1)

GPIO又俗称为I/O口,I指的是输入(in),O指的是输出(out)。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个或多个寄存器与之关联,通过读写寄存器完成对GPIO管脚的操作。在HDF框架中,同类型设备对象较多时(可能同时存在十几个同类型配置器),若采用独立服务模式,则需要配置更多的设备节点,且相关服务会占据更多的内存资源。核心层主要提供GPIO管脚资源匹配,GPIO管脚控制器的添加、移除以及管理的能力,通过钩子函数与适配层交互,供芯片厂家快速接入HDF框架。

weixin_41028621的博客 1176

OpenHarmony轻量系统开发-驱动之GPIO点灯

**摘要**:本文简单介绍如何操作GPIO去点灯 **适合群体**:适用于Hi3861开发板,L0轻量系统驱动开发

HarmonyOS_666的博客 860

【OpenHarmony硬件操作】led灯和key的操作

在嵌入式系统开发中,与硬件设备的交互操作至关重要。本文将介绍如何使用OpenHarmony操作两种常见的硬件设备:key(按键)和风扇。通过对这两种设备的操作,读者将了解如何在OpenHarmony环境下实现基本的硬件控制,为更广泛的嵌入式系统开发提供基础知识和指导。通过本文的介绍,读者可以学习到如何在OpenHarmony环境下操作两种常见的硬件设备:key(按键)和风扇。针对按键,我们介绍了如何通过注册按键回调函数来实现按键事件的处理,从而实现按键的响应功能。

m0_62599305的博客 1700

第五章 OpenHarmony标准系统全栈开发第一例:开关工作状态灯

本案例作为OpenHarmony标准系统全栈开发的典型范例,完整展示了从硬件驱动到应用调用的全流程开发方法。开发过程主要包含以下关键环节:首先通过分析原理图确定LED连接的GPIO引脚(如GPIO2_C4)并进行驱动初始化;其次基于HDF驱动框架实现硬件抽象层,通过配置HCS文件定义设备节点与驱动的匹配关系;最后在应用层通过NAPI接口调用驱动服务,完成对LED灯的开关控制。该案例不仅演示了GPIO设备的基础控制逻辑,还体现了OpenHarmony系统**”一次开发、多端部署"**的设计理念。

jixufan的博客 1290

电路板功能测试系统-FCT for PCBA

电路板功能测试系统用于电路板组件(PCBA)的功能测试(FCT),满足自动化大批量生产的要求。  ● 用户根据自己需要定义测试步骤,灵活方便  ● 适合工业自动化大批量生产应用  ● 系统测试精度高,稳定可靠   一、电路板功能测试系统概述 电路板测试过程通常由多个步骤组成,每单个步骤中需要对多个物理量(电压、电流、电阻、频率、波形等)进行测试。在每个步骤测试时

6811

OpenHarmony学习笔记——点亮你的LED

OpenHarmony学习之Hi3861的IO口输出控制。

qq_41954556的博客 3718

不用变压器也能联网?手把手教你PHY芯片直连的3种实用方案

本文详细介绍了PHY芯片直连的3种实用方案,帮助开发者在物联网设备中实现更经济、更精简的网络连接设计。通过分析电压驱动型和电流驱动型PHY的核心原理,提供具体的电路配置和优化建议,确保信号质量的同时节省成本和空间。

smartcontract5的博客 332

基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

基于face_recognition库实现人脸考勤系统功能。利用Python的tkinter模块来设计考勤系统的图形化界面,此外结合openpyxl模块,实现将学生的信息和考勤打卡数据保存到表格中,方便查看和调用。该系统具备“刷脸打卡”、“新学生注册”等功能。............

lyx4949的博客 6965

OpenHarmony设备开发实战-基于DAYU800的GPIO点灯

DAYU800开发板有一组20pin 的GPIO板载 2x10pin 插针,其中有 16 个原生 IO,包括 4个普通 IO,4 对串口,一个 SPI。另外有2个GND,一个5V,一个3.3V。本文主要介绍在DAYU800开发板上实现在openharmony3.2系统上进行点灯的代码案例。

lxs_vip的博客 1286

LangGraph的容错机制:从节点失败到图级回滚

核心概念铺垫:讲解LLM应用容错与事务性的核心概念(幂等性、重试策略、降级策略、快照、回滚、原子性、一致性、隔离性、持久性、最终一致性),对比LangGraph容错机制与传统数据库ACID事务、Apache Airflow/Kubernetes Workflow/Kubeflow Pipelines容错机制的异同;LangGraph容错机制的演进历史:用markdown表格梳理LangGraph从0.0.1到1.5.0(截止202X年X月)的容错机制发展历程;节点级别的容错:重试与降级。

AI Python 编程之道的博客 172

【入门到实战】OpenHarmony轻量和小型系统设备开发:LED外设控制

本文介绍如何通过调用OpenHarmony的NDK接口....

Androidbye的博客 1137

别再只看K线了!用Python自制筹码分布图,可视化Winner函数帮你判断支撑压力

本文详细介绍了如何用Python自制筹码分布图,通过数据清洗、算法实现和动态可视化,帮助投资者更准确地判断股票支撑压力位。文章重点讲解了Winner函数的应用,结合筹码分布与交易策略,提升交易决策的精准度。

weixin_42520796的博客 313

保姆级教程:用Fiddler+夜神模拟器搞定抖音App抓包(附SSL Pinning绕过实战)

本文提供了一套完整的移动端抓包解决方案,详细介绍了如何使用Fiddler和夜神模拟器进行抖音App抓包,并重点讲解了SSL Pinning绕过技术。通过Xposed框架和JustTrustMe模块的组合,实现高效抓包,适用于产品分析、竞品研究和安全测试等场景。

weixin_30855099的博客 421

OpenHarmony轻量系统开发【5】驱动之GPIO点灯

摘要:本文简单介绍如何操作GPIO去点灯 适合群体:适用于Hi3861开发板,L0轻量系统驱动开发 5.1点灯例程源码 先看最简单得LED灯闪烁操作 源码结构如下: 第一个BUILD.gn文件内容: static_library("led_demo") { sources = [ "led_demo.c" ] include_dirs = [ "//utils/native/lite/include",

连志安 1943

开关变换器分析:大信号模型与小信号模型

是电力电子系统建模中的两类基本方法,分别用于描述系统在不同工作条件下的动态行为。它们的核心区别在于是否对变量进行线性化近似,以及适用的分析场景。

创新改变世界! 1907

龙芯OpenHarmony课程 【3】GPIO操作 点亮LED

1 LED线程 LED相关代码位于device\loongson\ls1c300b_hrst\test\sample_gpio.c文件中。 首先create_gpio_task创建一个线程,该线程为 gpio_task 。 接下来,进入 gpio_task 线程后,会调用led_init初始化我们的led灯,对应的IO口为 32。 2 LED初始化 事实上,就是通过调用 gpio_init 将引脚初始化为 输出模式,并将引脚设置为高电平。 LED的点亮和熄灭操作,也是通过调用gpi

连志安 1953

【3】 灰度变换(1)

第三章(1)【总三】

课题分离 659

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: OpenHarmony-简单的HDF驱动
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值