当前位置: 首页 > 科技观察

HDF驱动框架探路(二):openharmony最新源码,打通应用态到内核态

时间:2023-03-14 14:23:36 科技观察

HDF驱动框架探路(二):openharmony最新源码,从应用态到内核态老规矩就是最后要跑出来的效果要放出来。如下:HDF驱动框架探索之二:前言1、首先,本文源码是2021.11.25拉取的openharmony的master分支。以前也有高手在3516应用态的基础上向内核态开放,但那是很久以前的事了,尤其是3.0LTS发布后,整个框架都变了。根据高手们的操作,我没有根据最新的源码进行测试。有大佬可以留言指导。2、本文基于Hi3516轻量级系统。应用态打通内核态的整体框架图从上图我们可以直观的看出基于Linux开发和基于OpenHarmony开发在驱动开发过程中最大的区别1.Linux驱动开发会涉及到应用层glic等层内核函数调用,但是这些在openharmony中被HDF框架隐藏了,所以我们只需要根据HDF框架开发openharmony框架即可。二、openharmony应用层实际调用HDF框架的驱动消息机制1、应用程序1.1应用层业务代码1、在源码根目录下新建myapp目录2、然后进入myapp目录创建一个新建helloworld_test.c,然后复制以下代码输入#include#include#include#include#include"hdf_log.h"#include"hdf_sbuf.h"#include"hdf_io_service_if.h"#defineHDF_LOG_TAG"sample_test"#defineSAMPLE_SERVICE_NAME"GPIO_TEST"#defineSAMPLE_WRITE_READ0intg_replyFlag=0;staticintOnDevEventReceived(void*priv,uint32_tid,structHdfSBustfcharS=数据读取字符串));if(string==NULL){HDF_LOGE("failtoreadstringineventdata");g_replyFlag=1;returnHDF_FAILURE;}HDF_LOGE("%s:deveventreceived:%u%s",(char*)priv,id,string);g_replyFlag=1;returnHDF_SUCCESS;}staticintSendEvent(structHdfIoService*serv,char*e??ventData){intret=0;structHdfSBuf*data=HdfSBufObtainDefaultSize();if(data==NULL){HDF_LOGE("failtoobtainsbufdata");return1;}structHdfSBuf*reply=HdfSBufObtainDefaultSize();if(reply==NULL){HDF_LOGE("failtoobtainsbufreply");ret=HDF_DEV_ERR_NO_MEMORY;gotoout;}if(!HdfSbufWriteString(data,eventData)){HDF_LOGE("failtowritesbuf");ret=HDF_FAILURE;gotoout;}ret=serv->dispatcher->Dispatch(&serv->object,SAMPLE_WRITE_READ,data,reply);if(ret!=HDF_SUCCESS){HDF_LOGE("failtosendservicecall");gotoout;}intreplyData=0;if(!HdfSbufReadInt32(reply,&replyData)){HDF_LOGE("failtogetservicecallreply");ret=HDF_ERR_INVALID_OBJECT;gotoout;}HDF_LOGE("Getreplyis:%d",replyData);out:HdfSBufRecycle(数据);HdfSBufRecycle(回复);returnret;}intmain(){char*sendData="hi";structHdfIoService*serv=HdfIoServiceBind(SAMPLE_SERVICE_NAME);if(serv==NULL){HDF_LOGE("failtogetservice%s",SAMPLE_SERVICE_NAME);returnHDF_FAILURE;}HDF_LOGE("successtogetservice%s",SAMPLE_SERVICE_NAME);staticstructHdfDevEventlistenerlistener={.callBack=OnDevEventReceived,.priv="Service0"};if(HdfDeviceRegisterEventListener(serv,&listener)!=HDF_SUCCESS){HDF_LOGE("failtoregistereventlistener");returnHDF_FAILURE;}HDF_LOGE("successtoregistereventlistener");if(SendEvent(serv,sendData)){HDF_LOGE("failtosendevent");returnHDF_FAILURE;}/*waitforeventreceiveeventfinishing*/while(g_replyFlag==0){sleep(1);}if(HdfDeviceUnregisterEventListener(serv,&listener)){HDF_LOGE("failtounregisterlistener");returnHDF_FAILURE(ILUREo;);returnHDF_SUCCESS;}1.2将应用层业务代码编译成系统可执行文件,进入源代码目录,找到drivers/adapter/uhdf/manager/BUILD.gn文件,然后在末尾复制如下代码文件HDF_FRAMEWORKS="//drivers/framework"executable("helloworld_test"){sources=["//myapp/helloworld_test.c"]include_dirs=["$HDF_FRAMEWORKS/ability/sbuf/include","$HDF_FRAMEWORKS/core/shared/include","$HDF_FRAMEWORKS/core/host/include","$HDF_FRAMEWORKS/core/master/include","$HDF_FRAMEWORKS/include/core","$HDF_FRAMEWORKS/include/utils","$HDF_FRAMEWORKS/utils/include","$HDF_FRAMEWORKS/include/osal","//drivers/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/manager:hdf_core","//drivers/adapter/uhdf/posix:hdf_posix_osal",]public_deps=["//third_party/bounds_checking_function:libsec_shared"]defines=["__USER__"]cflags=["-Wall","-Wextra","-Wno-format","-Wno-format-extra-args",]}2.驱动代码这里的驱动直接引用源码code已有驱动:GPIO_TEST2.1驱动业务层代码进入源码目录,找到drivers/framework/test/unittest/platform/common/gpio_driver_test.c文件,然后对照下图修改执行hbbuild-f编译,然后烧录,然后打开串口查看效果,更多信息请访问:https://harmonyos.51cto.com,与华为共建的鸿蒙技术社区。