Openharmony - HDF驱动小示例和测试程序

本文详细介绍了在OpenHarmony 3.2版本中创建和测试KHDF驱动的过程,包括驱动项目的创建、HDF驱动程序的实现、配置文件的编辑以及驱动的编译烧录。此外,还探讨了HDF驱动的按需加载和按序加载特性,以及HCS在驱动配置中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

By: fulinux
E-mail: [email protected]
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

在这里插入图片描述

最近在学习鸿蒙系统,首当其冲是学习HDF,这里有很多文章可以阅读:
https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/driver/driver-overview-foundation.md/
但是千言万语,不如一个好示例。下面就是一个示例,不过适配的是3.1,在我的3.2上有比较多的问题,于是将修改后的内容提出来供大家一起学习。
https://blog.csdn.net/procedurecode/article/details/128906246

1. 创建KHDF示例驱动

本例中基于Openharmony的V3.2版本,创建KHDF驱动程序。

1.1. 创建KHDF项目

创建KHDF驱动程序步骤如下:

  • 添加目录: drivers/hdf_core/adapter/khdf/linux/中创建目录myhdfsample;
  • 添加文件: drivers/hdf_core/adapter/khdf/linux/myhdfsample添加文件myhdfsample.c与Makefile;
  • 添加配置: vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs;
  • 编译烧录运行;

1.2. HDF驱动程序实现

通过HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出:

//myhdfsample.c
#include <linux/rtc.h>
#include "device_resource_if.h"
#include "hdf_device_desc.h"
#include "hdf_log.h"
......
struct HdfDriverEntry g_MyHDFSampleEntry = {
   
   
    .moduleVersion = 1,
    .Bind = MyHDFSampleBind,
    .Init = MyHDFSampleInit,
    .Release = MyHDFSampleRelease,
    .moduleName = "myhdfsample",
};

HDF_INIT(g_MyHDFSampleEntry);

1.2.1. 驱动入口

通过指定Bind,MyHDFSampleBind将相关的服务接口绑定到HDF框架,通过Dispatch对用户态应用的消息进行处理:

//myhdfsample.c
......
#define TEST_WRITE_DATA 1234
static int32_t MyHDFSampleIoServiceDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply)
{
   
   
......
}

static struct IDeviceIoService MyHDFSampleService = {
   
   
        .Open = NULL,
        .Dispatch = MyHDFSampleIoServiceDispatch,
        .Release = NULL,
};

static int32_t MyHDFSampleBind(struct HdfDeviceObject *deviceObject)
{
   
   
        HDF_LOGD("enter %s", __func__);
        deviceObject->service = &MyHDFSampleService;
    return HDF_SUCCESS;
}
......

1.2.2. 实现Dispatch方法

定义TEST_WRITE_DATA的cmdId号,对写入的数据进行打印,并返回应答数据。HdfDeviceSendEvent对应用端通过HdfDeviceRegisterEventListener方法注册的监听器HdfDevEventlistener对象均可以接受到cmdId消息。HdfDevEventlistener将会应用端进行说明:

#define TEST_WRITE_DATA 1234
static int32_t MyHDFSampleIoServiceDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply)
{
   
   
    HDF_LOGD("enter %s: received cmd %d", __func__, cmdId);
    if (cmdId == TEST_WRITE_DATA) {
   
   
        const char *readData = HdfSbufReadString(data);
        if (readData != NULL) {
   
   
            HDF_LOGD("%s: read data is:%s", __func__, readData);
        }

        if (HdfSbufWriteString(reply, "I am driver's reply string!")) {
   
   
            return HdfDeviceSendEvent(client->device, cmdId, data);
        }
    }

    HDF_LOGE("%s: return fail", __func__);
    return HDF_FAILURE;
}

1.2.3. 硬件业务初始化与释放

HdfNewdeviceInit实现驱动自身业务初始的接口,HdfNewdeviceRelease实现驱动资源释放的接口:

static int32_t MyHDFSampleInit(struct HdfDeviceObject *device)
{
   
   
    HDF_LOGD("%s: Hdf dev service:%s init success", __func__, HdfDeviceGetServiceName(device));
    return HDF_SUCCESS;
}

static void MyHDFSampleRelease(struct HdfDeviceObject *device)
{
   
   
    HDF_LOGD("%s: Hdf dev service:%s release success", __func__, HdfDeviceGetServiceName(device));
}

1.2.4. 驱动完整展示

下面完整展示drivers/hdf_core/adapter/khdf/linux/myhdfsample/myhdfsample.c文件:

#include <linux/rtc.h>
#include "device_resource_if.h"
#include "hdf_device_desc.h"
#include "hdf_log.h"

#define TEST_WRITE_DATA 1234
static int32_t MyHDFSampleIoServiceDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fulinux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值