产品中心PRDUCTS DISPLAY

联系我们

联系人:张生

咨询热线:400-123-4657

传真:+86-123-4567

手机:13800000000

邮箱:admin@youweb.com

地址:广东省广州市天河区88号

在线咨询

公司动态

您现在的位置是: 首页 > 新闻动态 > 公司动态

树莓派4B编写HDF驱动示例

欲了解更多详情,请访问:

51CTO与华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

前言

不久前已成功在树莓派4B上加入了HDF驱动框架,帖子链接。 需要使用HDF编写一个个性化的驱动程序,以测试移植效果。不说了,看代码最实在。内核态驱动代码

的一个基本测试驱动,类似于串口驱动。由于该驱动是针对Linux内核开发的,因此放置在Linux\platform\uart目录下。树莓派4B编写HDF驱动示例-鸿蒙HarmonyOS技术社区

驱动程序\适配器\khdf\linux\平台\uart\my_hdf_uart.c

\n#include "hdf_device_desc.h"    // HDF框架提供的驱动设备描述头文件 \n#include "hdf_log.h"   // HDF框架提供的日志接口头文件 \n#define HDF_LOG_TAG "my_hdf_uart"   // 用于日志打印的标签若未定义,则使用默认定义的HDF_TAG标签 // 【3.1 驱动消息机制管理】Dispatch用于处理用户空间发来的消息 int32_t MyUartDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply){    HDF_LOGE("%s::进入" __func__);     HDF_LOGE("获取cmdId::%d",cmdId);     return HDF_SUCCESS; }  // 【1.开发驱动】驱动向外提供的服务能力,将相关的服务接口绑定到HDF框架上 int32_t MyHdfUartDriverBind(struct HdfDeviceObject *deviceObject) {     HDF_LOGE("%s::进入", // 【2.驱动服务管理】deviceObject是由HDF框架为每个驱动程序创建的设备对象,它保存设备相关的私有数据和服务接口      if ( !deviceObject) {         HDF_LOGE("我的 Uart 设备对象为空!");}}     return deviceObject;  //返回设备对象}         返回 HDF_FAILURE;     }     static struct IDeviceIoService 测试服务 = {         .调度 = 我的串口驱动调度,   // 【3.2驱动消息机制管理】在实现服务的过程中,在实现服务基类成员IDeviceIoService中的Dispatch方法时,调用.Open时将其设为NULL,这表示驱动提供了其他服务。释放指针为空。服务A为SampleDriverServiceA。     };     deviceObject->service = &testService;      return HDF_SUCCESS; }  // 【1.驱动开发】驱动初始化自身业务的接口 int32_t MyHdfUartDriverInit(struct HdfDeviceObject *deviceObject) {     HDF_LOGE("%s::进入", __func__); return 0; HDF_LOGD("Uart driver bind success");       static int32_t MyUartParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) {     HDF_LOGE("%s 进入", __func__);     return 0; }   // 【1.驱动开发】释放设备资源的接口 void MyHdfUartDriverRelease(struct HdfDeviceObject *deviceObject) {     HDF_LOGE("%s 进入", 声明驱动入口的对象,并指定为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量g_myhdfUartDriverEntry。这个全局变量必须是一个struct结构体,并包含moduleVersion和moduleName字段,moduleVersion设为1,moduleName设为"my_hdf_uart"。使用 HDF_INIT 注册驱动入口到 HDF 框架中,可以调用 Bind 函数将该驱动加载入 HDF 框架,随后调用 Init 函数加载驱动。若在调用 Init 函数时发生异常,HDF 框架会调用 Release 函数释放驱动资源并退出。具体代码如下:     .Bind = MyHdfUartDriverBind,     .Init = MyHdfUartDriverInit,     .Release = MyHdfUartDriverRelease, };  // 【1.驱动开发】HDF_INIT(g_myhdfUartDriverEntry);\n在drivers\adapter\khdf\linux\platform\uart\Makefile中加入以下驱动编译:\n- uart_adapter.o\n+ uart_adapter.o\n+ my_hdf_uart.o\n添加驱动配置文件路径:\nvendor\raspberrypi\RPI4B\hdf_config\khdf\device_info\device_info.hcs\n在device_uart::device下添加device2::deviceNode:\n{\n policy=2;\n permission=0644;\n priority=40;\n moduleName="my_hdf_uart";\n serviceName="my_hdf_uart_service";\ \n用户态HDF驱动交互验证在applications\standard\app\myuarttest.c文件中进行。已经给主要的代码加了注释。

#包括

工具/hdf_log.h

#包括

核心/hdf_io_service_if.h

#包括" hdf_sbuf.h"

#定义

HDF_LOG_TAG

" my_hdf_uart"

#定义

SAMPLE_SERVICE_NAME

" my_hdf_uart_service"

#定义

SAMPLE_WRITE_READ

1001

//

【 驱动消息机制管理】读写操作码,在消息处理函数中,cmd类型是被定义的。主函数为:  int main() {     HDF_LOGE("%s::进入", __func__);     int ret = 0;      // 用户态获取驱动的服务,获取该服务之后通过服务中的Dispatch方法向驱动发送消息。struct HdfIoService *serv = HdfIoServiceBind(SAMPLE_SERVICE_NAME); //【3.驱动消息机制管理】用户态(通过服务名)获取服务接口 if (serv == NULL) { HDF_LOGE("无法获取服务%s", SAMPLE_SERVICE_NAME);此文本非常不连贯,需要重新组织和修正。下面是改编后的文本:\n在调用 SAMPLE_SERVICE_NAME 的函数时,返回值为 HDF_FAILURE 。此外,我们初始化一个 sendData 指针,用于存放将要发送的数据。我们还通过 HdfSBufObtainDefaultSize() 函数创建了一个结构体 HdfSBuf 类型的数据块,用于存放数据。HDF文件写入使用eString函数处理data, 发送数据时出现错误,将内容进行赋值。记录日志("写入sbuf失败")。返回失败状态。创建HdfSBuf结构体的reply指针并分配默认大小。存储返回的数据。调用serv的dispatcher的Dispatch方法。 示例_写入_读取, 数据, 回复);        // 将消息发送到驱动程序     如果 (返回值 !如果result=HDF_SUCCESS){则{HDF_LOGE("发送服务调用失败"); }HdfIoServiceRecycle(serv);return HDF_SUCCESS;}

applications\standard\app\BUILD.gn:编写构建脚本

import("//build/ohos.gni") import("//drivers/adapter/uhdf2/uhdf.gni")  ohos_executable("myuarttest") {   sources = [     "myuarttest.c"   ]   include_dirs = [         "//drivers/framework/include",                                   # <工具/hdf日志.h> <核心/hdf_io_service_if.h>     "//驱动/适配器/uhdf2/osal/包含",```\n文件路径"hdf_log_adapter.h"位于"//base/hiviewdfx/hilog/interfaces/native/innerkits/include"目录下。\n包含了<hilog/log.h>文件。\n另一个文件路径"//drivers/framework/ability/sbuf/include"。\n```//drivers/framework/include/utils"中的hdf_sbuf.h。需要将一些技术细节从“hdf_base.h”文件导入“libhdf_utils”的驱动程序/适配器/uhdf2/osal依赖项。#include "hdf_log_adapter.h"\n#include "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog"\n#include \nsubsystem_name = "applications"\npart_name = "prebuilt_hap"\napplications\standard\hap\ohos.build: 最终将应用程序添加到编译框架\n+ "//applications/standard/app:myuarttest",4. 运行用户态的myuarttest程序来进行最终测试,以验证驱动是否成功加载。用户只需发送cmdId,例如1001,然后内核驱动程序将根据cmdID执行相应的操作。用户只需发送cmdId,例如1001,内核驱动程序将根据cmdID执行相应的操作。如欲了解更多信息,请访问由51CTO和华为官方合作共建的鸿蒙技术社区:https://harmonyos.51cto.com

树莓派4B编写HDF驱动示例-鸿蒙HarmonyOS技术社区

在线客服

关注我们 在线咨询 投诉建议 返回顶部