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

开发
首先本文章的源码是2021.11.25拉的openharmony的master分支。之前也有一些大神基于3516应用态打通到了内核态,不过都很久远了。

[[436949]]

想了解更多内容,请访问:

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

https://harmonyos.51cto.com

老规矩还是将最终希望跑出来的效果放出来。如下:

 

HDF驱动框架探路2:

前言

1.首先本文章的源码是2021.11.25拉的openharmony的master分支。之前也有一些大神基于3516应用态打通到了内核态,不过都很久远了,尤其是3.0LTS发布之后,整个框架都改动过了,按照大神们的操作我这边基于最新的源码都没有测试成功。有大佬可以留言指导一拨儿。

2.本文章是基于Hi3516轻量系统来打造的。

应用态打通内核态的总体框架图

从上图可以很直观的看出驱动开发的过程中基于linux开发和基于openharmony开发的最大区别

1.linux驱动开发中会涉及到应用层的glic等,以及驱动层的内核函数调用,但是在openharmony这些以及都被HDF框架给隐藏起来了,所以我们只需要根据HDF框架来进行openharmony框架开发,就可以了。

2.openharmony应用层其实是调用了HDF框架的驱动消息机制

1.应用程序

1.1 应用层业务代码

1.在源码根目录下新建myapp目录

2.然后进入myapp目录新建helloworld_test.c,然后将下列代码拷贝入内

  1. #include <fcntl.h> 
  2. #include <sys/stat.h> 
  3. #include <sys/ioctl.h> 
  4. #include <unistd.h> 
  5. #include "hdf_log.h" 
  6. #include "hdf_sbuf.h" 
  7. #include "hdf_io_service_if.h" 
  8.  
  9. #define HDF_LOG_TAG "sample_test" 
  10. #define SAMPLE_SERVICE_NAME "GPIO_TEST" 
  11.  
  12. #define SAMPLE_WRITE_READ 0 
  13.  
  14. int g_replyFlag = 0; 
  15.  
  16. static int OnDevEventReceived(void *priv,  uint32_t id, struct HdfSBuf *data) 
  17.     const char *string = HdfSbufReadString(data); 
  18.     if (string == NULL) { 
  19.         HDF_LOGE("fail to read string in event data"); 
  20.         g_replyFlag = 1; 
  21.         return HDF_FAILURE; 
  22.     } 
  23.     HDF_LOGE("%s: dev event received: %u %s",  (char *)priv, id, string); 
  24.     g_replyFlag = 1; 
  25.     return HDF_SUCCESS; 
  26.  
  27. static int SendEvent(struct HdfIoService *serv, char *eventData) 
  28.     int ret = 0; 
  29.     struct HdfSBuf *data = HdfSBufObtainDefaultSize(); 
  30.     if (data == NULL) { 
  31.         HDF_LOGE("fail to obtain sbuf data"); 
  32.         return 1; 
  33.     } 
  34.  
  35.     struct HdfSBuf *reply = HdfSBufObtainDefaultSize(); 
  36.     if (reply == NULL) { 
  37.         HDF_LOGE("fail to obtain sbuf reply"); 
  38.         ret = HDF_DEV_ERR_NO_MEMORY; 
  39.         goto out
  40.     } 
  41.  
  42.     if (!HdfSbufWriteString(data, eventData)) { 
  43.         HDF_LOGE("fail to write sbuf"); 
  44.         ret = HDF_FAILURE; 
  45.         goto out
  46.     } 
  47.  
  48.     ret = serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply); 
  49.     if (ret != HDF_SUCCESS) { 
  50.         HDF_LOGE("fail to send service call"); 
  51.         goto out
  52.     } 
  53.  
  54.     int replyData = 0; 
  55.     if (!HdfSbufReadInt32(reply, &replyData)) { 
  56.         HDF_LOGE("fail to get service call reply"); 
  57.         ret = HDF_ERR_INVALID_OBJECT; 
  58.         goto out
  59.     } 
  60.     HDF_LOGE("Get reply is: %d", replyData); 
  61. out
  62.     HdfSBufRecycle(data); 
  63.     HdfSBufRecycle(reply); 
  64.     return ret; 
  65.  
  66. int main() 
  67.     char *sendData = "hi"
  68.     struct HdfIoService *serv = HdfIoServiceBind(SAMPLE_SERVICE_NAME); 
  69.     if (serv == NULL) { 
  70.         HDF_LOGE("fail to get service %s", SAMPLE_SERVICE_NAME); 
  71.         return HDF_FAILURE; 
  72.     } 
  73.     HDF_LOGE("success to get service %s", SAMPLE_SERVICE_NAME); 
  74.  
  75.     static struct HdfDevEventlistener listener = { 
  76.         .callBack = OnDevEventReceived, 
  77.         .priv ="Service0" 
  78.     }; 
  79.  
  80.     if (HdfDeviceRegisterEventListener(serv, &listener) != HDF_SUCCESS) { 
  81.         HDF_LOGE("fail to register event listener"); 
  82.         return HDF_FAILURE; 
  83.     } 
  84.     HDF_LOGE("success to register event listener"); 
  85.     if (SendEvent(serv, sendData)) { 
  86.         HDF_LOGE("fail to send event"); 
  87.         return HDF_FAILURE; 
  88.     } 
  89.  
  90.     /* wait for event receive event finishing */ 
  91.     while (g_replyFlag == 0) { 
  92.         sleep(1); 
  93.     } 
  94.  
  95.     if (HdfDeviceUnregisterEventListener(serv, &listener)) { 
  96.         HDF_LOGE("fail to  unregister listener"); 
  97.         return HDF_FAILURE; 
  98.     } 
  99.  
  100.     HdfIoServiceRecycle(serv); 
  101.     return HDF_SUCCESS; 

1.2 应用层业务代码以可执行文件编译进系统

进入源码目录找到drivers/adapter/uhdf/manager/BUILD.gn 文件,然后在文件末尾拷贝下述代码。

  1. HDF_FRAMEWORKS = "//drivers/framework" 
  2.  
  3. executable("helloworld_test") { 
  4.   sources = ["//myapp/helloworld_test.c" ] 
  5.   include_dirs = [ 
  6.     "$HDF_FRAMEWORKS/ability/sbuf/include"
  7.     "$HDF_FRAMEWORKS/core/shared/include"
  8.     "$HDF_FRAMEWORKS/core/host/include"
  9.     "$HDF_FRAMEWORKS/core/master/include"
  10.     "$HDF_FRAMEWORKS/include/core"
  11.     "$HDF_FRAMEWORKS/include/utils"
  12.     "$HDF_FRAMEWORKS/utils/include"
  13.     "$HDF_FRAMEWORKS/include/osal"
  14.     "//drivers/adapter/uhdf/posix/include"
  15.     "//third_party/bounds_checking_function/include"
  16.     "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits"
  17.   ] 
  18.  
  19.   deps = [ 
  20.     "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared"
  21.     "//drivers/adapter/uhdf/manager:hdf_core"
  22.     "//drivers/adapter/uhdf/posix:hdf_posix_osal"
  23.   ] 
  24.  
  25.   public_deps = [ "//third_party/bounds_checking_function:libsec_shared" ] 
  26.   defines = [ "__USER__" ] 
  27.  
  28.   cflags = [ 
  29.     "-Wall",  
  30.     "-Wextra"
  31.     "-Wno-format"
  32.     "-Wno-format-extra-args"
  33.   ] 

2.驱动代码

这里驱动是直接引用了源码中已经存在的一个驱动程序:GPIO_TEST

2.1 驱动业务层代码

进入源码目录,找到drivers/framework/test/unittest/platform/common/gpio_driver_test.c文件,然后对比下图进行修改。

执行hb build -f进行编译,然后烧录,接着打开串口就可以看到效果了

想了解更多内容,请访问:

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

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2022-04-21 11:26:31

鸿蒙操作系统

2021-11-30 14:52:41

鸿蒙HarmonyOS应用

2023-10-26 11:39:54

Linux系统CPU

2021-12-20 09:53:51

用户态内核态应用程序

2021-09-07 15:48:28

鸿蒙HarmonyOS应用

2017-08-16 16:20:01

Linux内核态抢占用户态抢占

2021-11-22 16:46:59

鸿蒙HarmonyOS应用

2021-12-15 15:30:38

鸿蒙HarmonyOS应用

2022-04-20 20:28:40

HDF 驱动框架鸿蒙操作系统

2021-08-31 07:54:24

TCPIP协议

2020-11-10 10:00:10

HarmonyOS

2021-12-15 10:02:25

鸿蒙HarmonyOS应用

2021-12-23 10:02:58

鸿蒙HarmonyOS应用

2023-09-06 15:35:14

2023-01-06 08:04:10

GPU容器虚拟化

2023-09-14 15:49:42

PWM鸿蒙

2021-09-10 15:12:04

鸿蒙HarmonyOS应用

2022-04-01 15:18:04

HarmonyHDF 驱动鸿蒙

2022-05-16 11:50:45

HDF驱动框架
点赞
收藏

51CTO技术栈公众号