偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

樹莓派4B編寫HDF驅動示例

系統(tǒng)
前段時間已經(jīng)在樹莓派4B成功加入了HDF驅動框架,帖子鏈接。得用HDF編寫個自己的驅動來測試下移植的效果。

想了解更多內容,請訪問:

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

https://harmonyos.51cto.com

前言

前段時間已經(jīng)在樹莓派4B成功加入了HDF驅動框架,帖子鏈接。得用HDF編寫個自己的驅動來測試下移植的效果。不說了代碼最實在,看代碼吧。

樹莓派4B編寫HDF驅動示例-鴻蒙HarmonyOS技術社區(qū)

1.內核態(tài)驅動代碼

一個簡單的測試驅動,可以認為是串口驅動。因為在linux內核下,所以驅動放置在linux\platform\uart目錄下。

drivers\adapter\khdf\linux\platform\uart\my_hdf_uart.c

  1. #include "hdf_device_desc.h"    // HDF框架對驅動開發(fā)相關能力接口的頭文件 
  2. #include "hdf_log.h"            // HDF 框架提供的日志接口頭文件 
  3.  
  4. #define HDF_LOG_TAG "my_hdf_uart"   // 打印日志所包含的標簽,如果不定義則用默認定義的HDF_TAG標簽 
  5.  
  6. // 【3.1驅動消息機制管理】Dispatch是用來處理用戶態(tài)發(fā)下來的消息 
  7. int32_t MyUartDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) 
  8.     HDF_LOGE("%s::enter", __func__); 
  9.     HDF_LOGE("get cmdId::%d",cmdId); 
  10.     return HDF_SUCCESS; 
  11.  
  12. // 【1.驅動開發(fā)】驅動對外提供的服務能力,將相關的服務接口綁定到HDF框架 
  13. int32_t MyHdfUartDriverBind(struct HdfDeviceObject *deviceObject) 
  14.     HDF_LOGE("%s::enter", __func__); 
  15.  
  16.     // 【2.驅動服務管理】deviceObject為HDF框架給每一個驅動創(chuàng)建的設備對象,用來保存設備相關的私有數(shù)據(jù)和服務接口 
  17.     if (deviceObject == NULL) { 
  18.         HDF_LOGE("My Uart device object is null!"); 
  19.         return HDF_FAILURE; 
  20.     } 
  21.     static struct IDeviceIoService testService = { 
  22.         .Dispatch = MyUartDriverDispatch,   // 【3.2驅動消息機制管理】在服務實現(xiàn)過程中,實現(xiàn)服務基類成員IDeviceIoService中的Dispatch方法 
  23.         .Open = NULL,                       // 【2.驅動服務管理】驅動提供的其他服務。 
  24.         .Release = NULL
  25.         // .ServiceA = SampleDriverServiceA, 
  26.     }; 
  27.     deviceObject->service = &testService; 
  28.  
  29.     return HDF_SUCCESS; 
  30.  
  31. // 【1.驅動開發(fā)】驅動自身業(yè)務初始的接口 
  32. int32_t MyHdfUartDriverInit(struct HdfDeviceObject *deviceObject) 
  33.     HDF_LOGE("%s::enter", __func__);  
  34.     HDF_LOGD("Uart driver bind success");        
  35.     return 0; 
  36. static int32_t MyUartParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) 
  37.     HDF_LOGE("%s::enter", __func__); 
  38.     return 0; 
  39.  
  40.  
  41. // 【1.驅動開發(fā)】驅動資源釋放的接口 
  42. void MyHdfUartDriverRelease(struct HdfDeviceObject *deviceObject) 
  43.     HDF_LOGE("%s::enter", __func__); 
  44.     return
  45.  
  46. // 【1.驅動開發(fā)】定義驅動入口的對象,必須為HdfDriverEntry(在hdf_device_desc.h中定義)類型的全局變量 
  47. struct HdfDriverEntry g_myhdfUartDriverEntry = { 
  48.     .moduleVersion = 1, 
  49.     .moduleName = "my_hdf_uart"
  50.     .Bind = MyHdfUartDriverBind, 
  51.     .Init = MyHdfUartDriverInit, 
  52.     .Release = MyHdfUartDriverRelease, 
  53. }; 
  54.  
  55. // 【1.驅動開發(fā)】調用HDF_INIT將驅動入口注冊到HDF框架中,在加載驅動時HDF框架會先調用Bind函數(shù),再調用Init函數(shù)加載該驅動,當Init調用異常時,HDF框架會調用Release釋放驅動資源并退出。 
  56. HDF_INIT(g_myhdfUartDriverEntry); 

drivers\adapter\khdf\linux\platform\uart\Makefile:將驅動加入內核編譯

  1. - uart_adapter.o 
  2.  
  3. + uart_adapter.o \ 
  4. + my_hdf_uart.o 

2.添加驅動配置文件

vendor\raspberrypi\RPI4B\hdf_config\khdf\device_info\device_info.hcs

  1. # device_uart :: device 下添加 
  2.  
  3. device2 :: deviceNode { 
  4.     policy = 2; 
  5.     permission = 0644; 
  6.     priority = 40; 
  7.     moduleName = "my_hdf_uart"
  8.     serviceName = "my_hdf_uart_service"

3.用戶態(tài)HDF驅動交互驗證

applications\standard\app\myuarttest.c:用戶態(tài)主程序,主要代碼已經(jīng)添加注釋了。

  1. #include <utils/hdf_log.h> 
  2. #include <core/hdf_io_service_if.h> 
  3. #include "hdf_sbuf.h" 
  4.  
  5. #define HDF_LOG_TAG "my_hdf_uart" 
  6. #define SAMPLE_SERVICE_NAME "my_hdf_uart_service" 
  7.  
  8. #define SAMPLE_WRITE_READ 1001   // 【驅動消息機制管理】讀寫操作碼,驅動定義消息處理函數(shù)中的cmd類型 
  9.  
  10. int main() 
  11.     HDF_LOGE("%s::enter", __func__); 
  12.     int ret = 0; 
  13.  
  14.     // 用戶態(tài)獲取驅動的服務,獲取該服務之后通過服務中的Dispatch方法向驅動發(fā)送消息。 
  15.     struct HdfIoService *serv = HdfIoServiceBind(SAMPLE_SERVICE_NAME);  // 【3驅動消息機制管理】用戶態(tài)(通過服務名)獲取服務接口 
  16.     if (serv == NULL) { 
  17.         HDF_LOGE("fail to get service %s", SAMPLE_SERVICE_NAME); 
  18.         return HDF_FAILURE; 
  19.     } 
  20.      
  21.     char *sendData = ""
  22.     struct HdfSBuf *data = HdfSBufObtainDefaultSize();      // 存放要發(fā)送的數(shù)據(jù) 
  23.     if (!HdfSbufWriteString(data, sendData)) {              // 發(fā)送的內容賦值 
  24.         HDF_LOGE("fail to write sbuf"); 
  25.         ret = HDF_FAILURE; 
  26.     } 
  27.  
  28.     struct HdfSBuf *reply = HdfSBufObtainDefaultSize();                                         // 存放返回的數(shù)據(jù) 
  29.     ret = serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply);        // 發(fā)送消息到驅動 
  30.     if (ret != HDF_SUCCESS) { 
  31.         HDF_LOGE("fail to send service call"); 
  32.     } 
  33.  
  34.     HdfIoServiceRecycle(serv); 
  35.     return HDF_SUCCESS; 

applications\standard\app\BUILD.gn:編寫構建腳本

  1. import("//build/ohos.gni"
  2. import("//drivers/adapter/uhdf2/uhdf.gni"
  3.  
  4. ohos_executable("myuarttest") { 
  5.   sources = [ 
  6.     "myuarttest.c" 
  7.   ] 
  8.   include_dirs = [     
  9.     "//drivers/framework/include",                                  # <utils/hdf_log.h> <core/hdf_io_service_if.h> 
  10.     "//drivers/adapter/uhdf2/osal/include",                         # hdf_log_adapter.h 
  11.     "//base/hiviewdfx/hilog/interfaces/native/innerkits/include",   # <hilog/log.h> 
  12.     "//drivers/framework/ability/sbuf/include",                     # hdf_sbuf.h 
  13.     "//drivers/framework/include/utils",                            # hdf_base.h 
  14.   ] 
  15.   deps = [ 
  16.     "//drivers/adapter/uhdf2/osal:libhdf_utils",                    # hdf_log_adapter.h 
  17.     "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog"   # <hilog/log.h> 
  18.   ] 
  19.   subsystem_name = "applications" 
  20.   part_name = "prebuilt_hap" 

 applications\standard\hap\ohos.build:最后將app加入編譯框架

  1. "//applications/standard/app:myuarttest"

4.測試

最后執(zhí)行用戶態(tài)的myuarttest程序,就可以測試驅動是否添加成功了。

樹莓派4B編寫HDF驅動示例-鴻蒙HarmonyOS技術社區(qū)

用戶態(tài)只需要發(fā)送cmdId比如1001,然后內核驅動程序根據(jù)cmdID執(zhí)行相應的操作即可。

想了解更多內容,請訪問:

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

https://harmonyos.51cto.com

 

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

2021-11-23 15:35:05

鴻蒙HarmonyOS應用

2021-12-09 10:11:04

鴻蒙HarmonyOS應用

2021-12-31 10:00:30

鴻蒙HarmonyOS應用

2022-06-21 11:02:27

系統(tǒng)移植鴻蒙

2019-03-31 08:00:02

樹莓派更新樹莓派 Linux

2019-03-24 20:30:18

樹莓派Linux

2019-03-12 18:33:57

樹莓派Linux

2022-08-08 19:35:37

HDF驅動開發(fā)鴻蒙

2023-03-23 16:02:07

樹莓派4GPU調試

2021-07-25 10:30:04

樹莓派Linux

2022-05-16 11:30:39

openEuler樹莓派鴻蒙

2021-12-22 15:30:24

樹莓派Android開發(fā)者

2021-09-26 10:11:14

Ubuntu樹莓派

2021-03-29 21:24:40

樹莓派Linux

2022-02-11 09:24:05

樹莓派OpenWrt固定IP服務

2021-11-17 16:20:49

Linux 系統(tǒng) 樹莓派

2023-08-18 14:34:09

HDF驅動框架

2019-03-23 19:33:14

樹莓派Linux操作系統(tǒng)

2018-10-12 11:20:20

樹莓派NAS Linux

2021-10-06 10:46:02

樹莓派樹莓派 4Linux
點贊
收藏

51CTO技術棧公眾號