成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

https://harmonyos.51cto.com

前言

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

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

1.內核態驅動代碼

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

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

  1. #include "hdf_device_desc.h"    // HDF框架對驅動開發相關能力接口的頭文件 
  2. #include "hdf_log.h"            // HDF 框架提供的日志接口頭文件 
  3.  
  4. #define HDF_LOG_TAG "my_hdf_uart"   // 打印日志所包含的標簽,如果不定義則用默認定義的HDF_TAG標簽 
  5.  
  6. // 【3.1驅動消息機制管理】Dispatch是用來處理用戶態發下來的消息 
  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.驅動開發】驅動對外提供的服務能力,將相關的服務接口綁定到HDF框架 
  13. int32_t MyHdfUartDriverBind(struct HdfDeviceObject *deviceObject) 
  14.     HDF_LOGE("%s::enter", __func__); 
  15.  
  16.     // 【2.驅動服務管理】deviceObject為HDF框架給每一個驅動創建的設備對象,用來保存設備相關的私有數據和服務接口 
  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驅動消息機制管理】在服務實現過程中,實現服務基類成員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.驅動開發】驅動自身業務初始的接口 
  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.驅動開發】驅動資源釋放的接口 
  42. void MyHdfUartDriverRelease(struct HdfDeviceObject *deviceObject) 
  43.     HDF_LOGE("%s::enter", __func__); 
  44.     return
  45.  
  46. // 【1.驅動開發】定義驅動入口的對象,必須為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.驅動開發】調用HDF_INIT將驅動入口注冊到HDF框架中,在加載驅動時HDF框架會先調用Bind函數,再調用Init函數加載該驅動,當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.用戶態HDF驅動交互驗證

applications\standard\app\myuarttest.c:用戶態主程序,主要代碼已經添加注釋了。

  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   // 【驅動消息機制管理】讀寫操作碼,驅動定義消息處理函數中的cmd類型 
  9.  
  10. int main() 
  11.     HDF_LOGE("%s::enter", __func__); 
  12.     int ret = 0; 
  13.  
  14.     // 用戶態獲取驅動的服務,獲取該服務之后通過服務中的Dispatch方法向驅動發送消息。 
  15.     struct HdfIoService *serv = HdfIoServiceBind(SAMPLE_SERVICE_NAME);  // 【3驅動消息機制管理】用戶態(通過服務名)獲取服務接口 
  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();      // 存放要發送的數據 
  23.     if (!HdfSbufWriteString(data, sendData)) {              // 發送的內容賦值 
  24.         HDF_LOGE("fail to write sbuf"); 
  25.         ret = HDF_FAILURE; 
  26.     } 
  27.  
  28.     struct HdfSBuf *reply = HdfSBufObtainDefaultSize();                                         // 存放返回的數據 
  29.     ret = serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply);        // 發送消息到驅動 
  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.測試

最后執行用戶態的myuarttest程序,就可以測試驅動是否添加成功了。

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

用戶態只需要發送cmdId比如1001,然后內核驅動程序根據cmdID執行相應的操作即可。

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

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

https://harmonyos.51cto.com

 

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

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

系統移植鴻蒙

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驅動開發鴻蒙

2021-12-22 15:30:24

樹莓派Android開發者

2023-03-23 16:02:07

樹莓派4GPU調試

2021-09-26 10:11:14

Ubuntu樹莓派

2022-05-16 11:30:39

openEuler樹莓派鴻蒙

2021-07-25 10:30:04

樹莓派Linux

2021-11-17 16:20:49

Linux 系統 樹莓派

2021-03-29 21:24:40

樹莓派Linux

2022-02-11 09:24:05

樹莓派OpenWrt固定IP服務

2019-03-23 19:33:14

樹莓派Linux操作系統

2023-08-18 14:34:09

HDF驅動框架

2018-10-12 11:20:20

樹莓派NAS Linux

2021-10-06 10:46:02

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

51CTO技術棧公眾號

主站蜘蛛池模板: 久久综合久久综合久久综合 | 国产成人网 | 国产精品久久av | 国产精品永久久久久久久www | 色综合色综合色综合 | 99re在线视频 | 日本不卡一区二区三区 | 成人免费视频在线观看 | 国产精品欧美一区二区三区不卡 | 国产一区二区三区不卡av | 在线播放一区 | 欧美国产日韩一区二区三区 | 日韩欧美在线观看 | 精品九九在线 | av免费观看网站 | 国产精品色 | 丁香婷婷在线视频 | 91在线视频观看 | 亚洲视频一区二区三区四区 | 天天操天天怕 | 免费在线播放黄色 | 在线免费小视频 | 黄色一级视频 | 一二三四av | 久久久久亚洲 | 成人黄色三级毛片 | 91麻豆精品国产91久久久久久久久 | 亚洲看片网站 | 一区二区免费视频 | 国产精品视频yy9299一区 | 五月婷婷丁香婷婷 | 免费看国产片在线观看 | 欧美一级淫片免费视频黄 | 黑人巨大精品 | 久久国产精品一区二区三区 | 久久久国产一区二区三区 | 日本超碰在线 | 中文字幕一区二区在线观看 | 欧美videosex性极品hd | 亚洲精品乱码久久久久久久久久 | 正在播放国产精品 |