鸿蒙HI3516-驱动开发(1.1-LTS)

代码在:https://gitee.com/kwydm/open-harmony-taurus

目录大致结构

1.驱动开发

创建目录://vendor/huawei/hdf/LED/src

新建Makefile

include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mkMODULE_NAME := hdf_led_driver
LOCAL_SRCS += led.c
LOCAL_INCLUDE := ./include
LOCAL_CFLAGS += -fstack-protector-strong -Wextra -Wall -Werror
include $(HDF_DRIVER)

打开//device/hisilicon/drivers/lite.mk 编译结果文件链接到内核镜像

## 在头部添加变量
VENDOR_HDF_DRIVERS_ROOT := $(LITEOSTOPDIR)/../../vendor/huawei/hdfLITEOS_BASELIB += -lhdf_led_driver
LIB_SUBDIRS    += $(VENDOR_HDF_DRIVERS_ROOT)/LED/src

新建led.c

#include "hdf_device_desc.h" // HDF框架对驱动开放相关能力接口的头文件
#include "hdf_log.h"         // HDF 框架提供的日志接口头文件
#include "device_resource_if.h"
#include "osal_io.h"
#include "osal_mem.h"
#include "gpio_if.h"
#include "osal_irq.h"
#include "osal_time.h"#define HDF_LOG_TAG led_driver // 打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签
#define LED_WRITE_READ 1       // 读写操作码1static int32_t CtlLED(int mode)
{int32_t ret;uint16_t valRead;/* LED的GPIO管脚号 */uint16_t gpio = 5 * 8 + 1;  // 红外补光灯// uint16_t gpio = 2 * 8 + 3;  // 绿色指示灯// uint16_t gpio = 3 * 8 + 4;  // 红色指示灯/* 将GPIO管脚配置为输出 */ret = GpioSetDir(gpio, GPIO_DIR_OUT);if (ret != 0){HDF_LOGE("GpioSerDir: failed, ret %d\n", ret);return ret;}if (mode == -1){// 翻转输出口(void)GpioRead(gpio, &valRead);ret = GpioWrite(gpio, (valRead == GPIO_VAL_LOW) ? GPIO_VAL_HIGH : GPIO_VAL_LOW);}else{ret = GpioWrite(gpio, mode);}if (ret != 0){HDF_LOGE("GpioWrite: failed, ret %d\n", ret);return ret;}return ret;
}// Dispatch是用来处理用户态发下来的消息
int32_t LedDriverDispatch(struct HdfDeviceIoClient *client, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply)
{int32_t result = HDF_FAILURE;HDF_LOGE("Led driver dispatch");if (client == NULL || client->device == NULL){HDF_LOGE("Led driver device is NULL");return HDF_ERR_INVALID_OBJECT;}switch (cmdCode){case LED_WRITE_READ:const char *recv = HdfSbufReadString(data);if (recv != NULL){//HDF_LOGI("recv: %s", recv);result = CtlLED(-1);// CtlLED(GPIO_VAL_HIGH);if (!HdfSbufWriteInt32(reply, result)){//HDF_LOGE("replay is fail");}return HdfDeviceSendEvent(client->device, cmdCode, data);}break;default:break;}return result;
}//驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架
int32_t HdfLedDriverBind(struct HdfDeviceObject *deviceObject)
{if (deviceObject == NULL){HDF_LOGE("Led driver bind failed!");return HDF_ERR_INVALID_OBJECT;}static struct IDeviceIoService ledDriver = {.Dispatch = LedDriverDispatch,};deviceObject->service = (struct IDeviceIoService *)(&ledDriver);HDF_LOGD("Led driver bind success");return HDF_SUCCESS;
}// 驱动自身业务初始的接口
int32_t HdfLedDriverInit(struct HdfDeviceObject *deviceObject)
{if (deviceObject == NULL){HDF_LOGE("Led driver Init failed!");return HDF_ERR_INVALID_OBJECT;}HDF_LOGD("Led driver Init success");return HDF_SUCCESS;
}// 驱动资源释放的接口
void HdfLedDriverRelease(struct HdfDeviceObject *deviceObject)
{if (deviceObject == NULL){HDF_LOGE("Led driver release failed!");return;}HDF_LOGD("Led driver release success");return;
}// 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量
struct HdfDriverEntry g_ledDriverEntry = {.moduleVersion = 1,.moduleName = "led_driver",.Bind = HdfLedDriverBind,.Init = HdfLedDriverInit,.Release = HdfLedDriverRelease,
};// 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。
HDF_INIT(g_ledDriverEntry);

2.用户态

\vendor\huawei\hdf\LED\dispatch\CallLED.c

#include <stdio.h>
#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"#define LED_WRITE_READ 1
#define HDF_LOG_TAG LED_APP
#define LED_SERVICE "led_service"// 接收驱动上报事件
static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data)
{const char *string = HdfSbufReadString(data);if (string == NULL){HDF_LOGE("fail to read string in event data");return HDF_FAILURE;}HDF_LOGE("%s: dev event received: %u %s", (char *)priv, id, string);return HDF_SUCCESS;
}static int SendEvent(struct HdfIoService *serv, char *eventData)
{int ret = 0;struct HdfSBuf *data = HdfSBufObtainDefaultSize();if (data == NULL){HDF_LOGE("fail to obtain sbuf data");return 1;}struct HdfSBuf *reply = HdfSBufObtainDefaultSize();if (reply == NULL){HDF_LOGE("fail to obtain sbuf reply");ret = HDF_DEV_ERR_NO_MEMORY;goto out;}if (!HdfSbufWriteString(data, eventData)){HDF_LOGE("fail to write sbuf");ret = HDF_FAILURE;goto out;}ret = serv->dispatcher->Dispatch(&serv->object, LED_WRITE_READ, data, reply);if (ret != HDF_SUCCESS){HDF_LOGE("fail to send service call");goto out;}int replyData = 0;if (!HdfSbufReadInt32(reply, &replyData)){HDF_LOGE("fail to get service call reply");ret = HDF_ERR_INVALID_OBJECT;goto out;}HDF_LOGE("Get reply is: %d", replyData);
out:HdfSBufRecycle(data);HdfSBufRecycle(reply);return ret;
}int main(void)
{struct HdfIoService *serv = HdfIoServiceBind(LED_SERVICE);// 用户态获取驱动的服务if (serv == NULL){HDF_LOGE("fail to get service %s", LED_SERVICE);return HDF_FAILURE;}static struct HdfDevEventlistener listener = {.callBack = OnDevEventReceived,.priv = "Service0"};// 用户态程序注册接收驱动上报事件的操作方法。if (HdfDeviceRegisterEventListener(serv, &listener) != HDF_SUCCESS){HDF_LOGE("fail to register event listener");return HDF_FAILURE;}char *send_cmd = "toggle LED";while (1){if (SendEvent(serv, send_cmd)){HDF_LOGE("fail to send event");return HDF_FAILURE;}sleep(1);}if (HdfDeviceUnregisterEventListener(serv, &listener)){HDF_LOGE("fail to  unregister listener");return HDF_FAILURE;}HdfIoServiceRecycle(serv);// 释放驱动服务。HDF_LOGI("exit");return HDF_SUCCESS;
}

\vendor\huawei\hdf\LED\dispatch\BUILD.gn

# Copyright (c) 2020 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.HDF_FRAMEWORKS = "//drivers/framework"# 暂时放在这里编译用户态设备驱动消息调用程序,回头在考虑移到独立组件去编译Gavin Lee
executable("CallLED") {sources = ["//vendor/huawei/hdf/LED/dispatch/CallLED.c"]include_dirs = ["//vendor/huawei/hdf/LED/include","$HDF_FRAMEWORKS/core/adapter/vnode/include","$HDF_FRAMEWORKS/core/adapter/syscall/include","$HDF_FRAMEWORKS/core/shared/include","$HDF_FRAMEWORKS/core/host/include","$HDF_FRAMEWORKS/core/manager/include","$HDF_FRAMEWORKS/ability/sbuf/include","$HDF_FRAMEWORKS/include/core","$HDF_FRAMEWORKS/include/utils","$HDF_FRAMEWORKS/utils/include","$HDF_FRAMEWORKS/include/osal","$HDF_FRAMEWORKS/../adapter/uhdf/posix/include","//third_party/bounds_checking_function/include","//base/hiviewdfx/hilog_lite/interfaces/native/innerkits",]deps = ["//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared","//drivers/adapter/uhdf/posix:hdf_posix","//drivers/adapter/uhdf/manager:hdf_core", "//drivers/adapter/uhdf/posix:hdf_posix_osal"]public_deps = ["//third_party/bounds_checking_function:libsec_shared",]defines = ["__USER__",]cflags = ["-Wall","-Wextra","-Werror",]}

vendor\huawei\hdf\LED\BUILD.gn

import("//build/lite/config/component/lite_component.gni")lite_component("led_gpio"){features = ["dispatch:CallLED"]
}

build\lite\components\drivers.json

3.烧录运行

串口发送下面的代码

./bin/CallLED

执行之后这个补光灯会1S闪一次

参考:https://harmonyos.51cto.com/posts/2820,Gavin,Dweb九弓子

鸿蒙HI3516-驱动开发(1.1-LTS)相关推荐

  1. 【LINUX驱动开发】AMG8833红外成像模块在HI3516上的应用

    文章目录 AMG8833介绍 内部框图 器件参数 点阵的排布顺序 原理图 内部寄存器 1.Power Control寄存器: 2.Reset寄存器: 4.Interrupt Control寄存器: 5 ...

  2. 新书出版:《Android深度探索(卷1):HAL与驱动开发》

    <Android深度探索(卷1):HAL与驱动开发> [1]亚马逊 [2]当当网 [3]京东商城 [4]互动网 [5]淘宝网 [6]豆瓣网 < Android深度探索(卷1):HAL ...

  3. OpenHarmony HDF LED驱动开发 基于小熊派Micro

    文章目录 一.效果展示 二.led控制程序 2.1.led驱动程序 2.1.1.驱动程序 2.1.2.驱动配置 2.2.C应用程序 2.3.JS应用 2.3.1.JS代码 2.3.2.C++接口 一. ...

  4. linux内核led驱动开发,从Linux内核LED驱动来理解字符设备驱动开发流程

    目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设 ...

  5. OpenHarmonyOs / LiteOs-a 驱动开发

    相关文章 上一篇:OpenHarmonyOs / LiteOs-a 开发环境搭建 下一篇:OpenHarmonyOs / LiteOs-a 应用开发 文章目录 相关文章 前言 一.LiteOs-a 内 ...

  6. 【正点原子MP157连载】第十九章 Buildroot根文件系统构建-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  7. 实现Android底层驱动开发并裁剪定制Android操作系统

    毕业论文 题   目实现Android底层驱动开发并裁剪定制Android操作系统 学   院电子信息与电气工程学院 姓   名牛xxx民 专   业电子信息科学与技术 学   号2012xxxxxx ...

  8. [LINUX]LINUX驱动开发最简环境搭建(适用于新手)

    LINUX驱动开发环境搭建 一. 前言 二.系统环境 Ubuntu VMWare{非必选} 三.开发环境搭建 1.用于简单学习(Header) 2.用于复杂驱动开发(源码树) a. 基本包 b. 内核 ...

  9. 01-20210222华为海思Hi3518EV300鸿蒙系统的开发环境的配置

    20210222华为海思Hi3518EV300鸿蒙系统的开发环境的配置 2021/2/23 10:15开始整理 1.百度搜索:鸿蒙 https://www.harmonyos.com/ Harmony ...

最新文章

  1. leetcode Edit Distance
  2. 一个帮助Java开发者快速学会Kotlin的开源项目
  3. c++ 对‘cv::waitKey(int)’未定义的引用
  4. SQLSERVER中如何忽略索引提示
  5. 定义和使用含有泛型的方法
  6. 黑胡桃木php,揭秘美国黑胡桃木的美
  7. ComboBox联动
  8. 广西专业技术人员职称个人版_「职称评审」机械工程专业技术人员如何写职称论文?...
  9. Netty工作笔记0071---Protobuf传输多种类型
  10. FR跨SHEET条件汇总
  11. 关于ubuntu下无线网卡经常连不上网络的问题
  12. 基于C++的校园一卡通管理系统
  13. 【数据分析】数据分析达人赛3:汽车产品聚类分析
  14. 美团校招年薪35万!老员工薪资倒挂,如何应对?
  15. PXE无人值守安装系统
  16. 7-6 王牌特工3 (15 分)
  17. PHP - AJAX 与 PHP
  18. DDNS的NAT穿越问题
  19. 公司的电脑监控软件一般能够监控到什么程度
  20. effective morden c++ 2

热门文章

  1. 同一目录下拷贝文件夹里_protobuf在C++下的安装使用
  2. python程序内存分析_python 如何测量运行中的程序内存 -- Valgrind
  3. Unity 分析器(仅专业版) Profiler (Pro only)
  4. Vue.js - Day2
  5. 可以用手机实现的移动端车牌识别功能
  6. 【总结整理】写给非技术产品经理的技术能力要求----摘自《人人都是产品经理》...
  7. angular1.x 中重要指令介绍($eval,$parse和$compile)
  8. hive数据写入elasticsearch
  9. iOS开发笔记 3、iOS基础
  10. 组件开发之Asp.net服务器控件Collection[集合]属性的设计时支持--编辑、保存