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

樹(shù)莓派4B編寫(xiě)HDF驅(qū)動(dòng)示例

系統(tǒng)
前段時(shí)間已經(jīng)在樹(shù)莓派4B成功加入了HDF驅(qū)動(dòng)框架,帖子鏈接。得用HDF編寫(xiě)個(gè)自己的驅(qū)動(dòng)來(lái)測(cè)試下移植的效果。

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

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

https://harmonyos.51cto.com

前言

前段時(shí)間已經(jīng)在樹(shù)莓派4B成功加入了HDF驅(qū)動(dòng)框架,帖子鏈接。得用HDF編寫(xiě)個(gè)自己的驅(qū)動(dòng)來(lái)測(cè)試下移植的效果。不說(shuō)了代碼最實(shí)在,看代碼吧。

樹(shù)莓派4B編寫(xiě)HDF驅(qū)動(dòng)示例-鴻蒙HarmonyOS技術(shù)社區(qū)

1.內(nèi)核態(tài)驅(qū)動(dòng)代碼

一個(gè)簡(jiǎn)單的測(cè)試驅(qū)動(dòng),可以認(rèn)為是串口驅(qū)動(dòng)。因?yàn)樵趌inux內(nèi)核下,所以驅(qū)動(dòng)放置在linux\platform\uart目錄下。

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

  1. #include "hdf_device_desc.h"    // HDF框架對(duì)驅(qū)動(dòng)開(kāi)發(fā)相關(guān)能力接口的頭文件 
  2. #include "hdf_log.h"            // HDF 框架提供的日志接口頭文件 
  3.  
  4. #define HDF_LOG_TAG "my_hdf_uart"   // 打印日志所包含的標(biāo)簽,如果不定義則用默認(rèn)定義的HDF_TAG標(biāo)簽 
  5.  
  6. // 【3.1驅(qū)動(dòng)消息機(jī)制管理】Dispatch是用來(lái)處理用戶(hù)態(tài)發(fā)下來(lái)的消息 
  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.驅(qū)動(dòng)開(kāi)發(fā)】驅(qū)動(dòng)對(duì)外提供的服務(wù)能力,將相關(guān)的服務(wù)接口綁定到HDF框架 
  13. int32_t MyHdfUartDriverBind(struct HdfDeviceObject *deviceObject) 
  14.     HDF_LOGE("%s::enter", __func__); 
  15.  
  16.     // 【2.驅(qū)動(dòng)服務(wù)管理】deviceObject為HDF框架給每一個(gè)驅(qū)動(dòng)創(chuàng)建的設(shè)備對(duì)象,用來(lái)保存設(shè)備相關(guān)的私有數(shù)據(jù)和服務(wù)接口 
  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驅(qū)動(dòng)消息機(jī)制管理】在服務(wù)實(shí)現(xiàn)過(guò)程中,實(shí)現(xiàn)服務(wù)基類(lèi)成員IDeviceIoService中的Dispatch方法 
  23.         .Open = NULL,                       // 【2.驅(qū)動(dòng)服務(wù)管理】驅(qū)動(dòng)提供的其他服務(wù)。 
  24.         .Release = NULL
  25.         // .ServiceA = SampleDriverServiceA, 
  26.     }; 
  27.     deviceObject->service = &testService; 
  28.  
  29.     return HDF_SUCCESS; 
  30.  
  31. // 【1.驅(qū)動(dòng)開(kāi)發(fā)】驅(qū)動(dòng)自身業(yè)務(wù)初始的接口 
  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.驅(qū)動(dòng)開(kāi)發(fā)】驅(qū)動(dòng)資源釋放的接口 
  42. void MyHdfUartDriverRelease(struct HdfDeviceObject *deviceObject) 
  43.     HDF_LOGE("%s::enter", __func__); 
  44.     return
  45.  
  46. // 【1.驅(qū)動(dòng)開(kāi)發(fā)】定義驅(qū)動(dòng)入口的對(duì)象,必須為HdfDriverEntry(在hdf_device_desc.h中定義)類(lèi)型的全局變量 
  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.驅(qū)動(dòng)開(kāi)發(fā)】調(diào)用HDF_INIT將驅(qū)動(dòng)入口注冊(cè)到HDF框架中,在加載驅(qū)動(dòng)時(shí)HDF框架會(huì)先調(diào)用Bind函數(shù),再調(diào)用Init函數(shù)加載該驅(qū)動(dòng),當(dāng)Init調(diào)用異常時(shí),HDF框架會(huì)調(diào)用Release釋放驅(qū)動(dòng)資源并退出。 
  56. HDF_INIT(g_myhdfUartDriverEntry); 

drivers\adapter\khdf\linux\platform\uart\Makefile:將驅(qū)動(dòng)加入內(nèi)核編譯

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

2.添加驅(qū)動(dòng)配置文件

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.用戶(hù)態(tài)HDF驅(qū)動(dòng)交互驗(yàn)證

applications\standard\app\myuarttest.c:用戶(hù)態(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   // 【驅(qū)動(dòng)消息機(jī)制管理】讀寫(xiě)操作碼,驅(qū)動(dòng)定義消息處理函數(shù)中的cmd類(lèi)型 
  9.  
  10. int main() 
  11.     HDF_LOGE("%s::enter", __func__); 
  12.     int ret = 0; 
  13.  
  14.     // 用戶(hù)態(tài)獲取驅(qū)動(dòng)的服務(wù),獲取該服務(wù)之后通過(guò)服務(wù)中的Dispatch方法向驅(qū)動(dòng)發(fā)送消息。 
  15.     struct HdfIoService *serv = HdfIoServiceBind(SAMPLE_SERVICE_NAME);  // 【3驅(qū)動(dòng)消息機(jī)制管理】用戶(hù)態(tài)(通過(guò)服務(wù)名)獲取服務(wù)接口 
  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ā)送的內(nèi)容賦值 
  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ā)送消息到驅(qū)動(dòng) 
  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:編寫(xiě)構(gòu)建腳本

  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.測(cè)試

最后執(zhí)行用戶(hù)態(tài)的myuarttest程序,就可以測(cè)試驅(qū)動(dòng)是否添加成功了。

樹(shù)莓派4B編寫(xiě)HDF驅(qū)動(dòng)示例-鴻蒙HarmonyOS技術(shù)社區(qū)

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

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

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

https://harmonyos.51cto.com

 

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

2021-12-09 10:11:04

鴻蒙HarmonyOS應(yīng)用

2021-12-31 10:00:30

鴻蒙HarmonyOS應(yīng)用

2021-11-23 15:35:05

鴻蒙HarmonyOS應(yīng)用

2022-06-21 11:02:27

系統(tǒng)移植鴻蒙

2019-03-31 08:00:02

樹(shù)莓派更新樹(shù)莓派 Linux

2019-03-24 20:30:18

樹(shù)莓派Linux

2021-12-22 15:30:24

樹(shù)莓派Android開(kāi)發(fā)者

2019-03-12 18:33:57

樹(shù)莓派Linux

2021-09-26 10:11:14

Ubuntu樹(shù)莓派

2023-03-23 16:02:07

樹(shù)莓派4GPU調(diào)試

2022-08-08 19:35:37

HDF驅(qū)動(dòng)開(kāi)發(fā)鴻蒙

2022-05-16 11:30:39

openEuler樹(shù)莓派鴻蒙

2021-11-17 16:20:49

Linux 系統(tǒng) 樹(shù)莓派

2021-07-25 10:30:04

樹(shù)莓派Linux

2019-03-23 19:33:14

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

2023-08-18 14:34:09

HDF驅(qū)動(dòng)框架

2021-03-29 21:24:40

樹(shù)莓派Linux

2022-02-11 09:24:05

樹(shù)莓派OpenWrt固定IP服務(wù)

2018-10-12 11:20:20

樹(shù)莓派NAS Linux

2020-10-24 20:32:01

Ubuntu樹(shù)莓派Linux
點(diǎn)贊
收藏

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