自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HDF驅(qū)動框架探路(二):openharmony最新源碼,打通應用態(tài)到內(nèi)核態(tài)

開發(fā)
首先本文章的源碼是2021.11.25拉的openharmony的master分支。之前也有一些大神基于3516應用態(tài)打通到了內(nèi)核態(tài),不過都很久遠了。

[[436949]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

老規(guī)矩還是將最終希望跑出來的效果放出來。如下:

 

HDF驅(qū)動框架探路2:

前言

1.首先本文章的源碼是2021.11.25拉的openharmony的master分支。之前也有一些大神基于3516應用態(tài)打通到了內(nèi)核態(tài),不過都很久遠了,尤其是3.0LTS發(fā)布之后,整個框架都改動過了,按照大神們的操作我這邊基于最新的源碼都沒有測試成功。有大佬可以留言指導一撥兒。

2.本文章是基于Hi3516輕量系統(tǒng)來打造的。

應用態(tài)打通內(nèi)核態(tài)的總體框架圖

從上圖可以很直觀的看出驅(qū)動開發(fā)的過程中基于linux開發(fā)和基于openharmony開發(fā)的最大區(qū)別

1.linux驅(qū)動開發(fā)中會涉及到應用層的glic等,以及驅(qū)動層的內(nèi)核函數(shù)調(diào)用,但是在openharmony這些以及都被HDF框架給隱藏起來了,所以我們只需要根據(jù)HDF框架來進行openharmony框架開發(fā),就可以了。

2.openharmony應用層其實是調(diào)用了HDF框架的驅(qū)動消息機制

1.應用程序

1.1 應用層業(yè)務代碼

1.在源碼根目錄下新建myapp目錄

2.然后進入myapp目錄新建helloworld_test.c,然后將下列代碼拷貝入內(nèi)

  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 應用層業(yè)務代碼以可執(zhí)行文件編譯進系統(tǒng)

進入源碼目錄找到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.驅(qū)動代碼

這里驅(qū)動是直接引用了源碼中已經(jīng)存在的一個驅(qū)動程序:GPIO_TEST

2.1 驅(qū)動業(yè)務層代碼

進入源碼目錄,找到drivers/framework/test/unittest/platform/common/gpio_driver_test.c文件,然后對比下圖進行修改。

執(zhí)行hb build -f進行編譯,然后燒錄,接著打開串口就可以看到效果了

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2022-04-21 11:26:31

鴻蒙操作系統(tǒng)

2021-11-30 14:52:41

鴻蒙HarmonyOS應用

2021-12-20 09:53:51

用戶態(tài)內(nèi)核態(tài)應用程序

2023-10-26 11:39:54

Linux系統(tǒng)CPU

2021-09-07 15:48:28

鴻蒙HarmonyOS應用

2017-08-16 16:20:01

Linux內(nèi)核態(tài)搶占用戶態(tài)搶占

2021-11-22 16:46:59

鴻蒙HarmonyOS應用

2022-04-20 20:28:40

HDF 驅(qū)動框架鴻蒙操作系統(tǒng)

2021-12-15 15:30:38

鴻蒙HarmonyOS應用

2021-08-31 07:54:24

TCPIP協(xié)議

2020-11-10 10:00:10

HarmonyOS

2021-12-15 10:02:25

鴻蒙HarmonyOS應用

2023-09-06 15:35:14

2023-01-06 08:04:10

GPU容器虛擬化

2021-12-23 10:02:58

鴻蒙HarmonyOS應用

2021-09-10 15:12:04

鴻蒙HarmonyOS應用

2023-09-14 15:49:42

PWM鴻蒙

2022-04-01 15:18:04

HarmonyHDF 驅(qū)動鴻蒙

2022-05-16 11:50:45

HDF驅(qū)動框架
點贊
收藏

51CTO技術(shù)棧公眾號