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

用鴻蒙開(kāi)發(fā)AI應(yīng)用(五)HDF 驅(qū)動(dòng)補(bǔ)光燈

開(kāi)發(fā)
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請(qǐng)前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com/#zz

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

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

https://harmonyos.51cto.com/#zz

前言

上一篇,我們?cè)邙櫭缮线\(yùn)行了第一個(gè)程序,這一篇我們來(lái)編寫(xiě)一個(gè)驅(qū)動(dòng)開(kāi)啟攝像頭的紅外補(bǔ)光燈,順便熟悉一下鴻蒙上的 HDF 驅(qū)動(dòng)開(kāi)發(fā)。

[[377472]]

硬件準(zhǔn)備

先查一下原理圖(具體可參考第一篇的硬件資料),找到紅外燈的 IO 口編號(hào),GPIO5_1。


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

1. 簡(jiǎn)介

HDF(OpenHarmony Driver Foundation)驅(qū)動(dòng)框架,為驅(qū)動(dòng)開(kāi)發(fā)者提供驅(qū)動(dòng)框架能力,包括驅(qū)動(dòng)加載、驅(qū)動(dòng)服務(wù)管理和驅(qū)動(dòng)消息機(jī)制。旨在構(gòu)建統(tǒng)一的驅(qū)動(dòng)架構(gòu)平臺(tái),為驅(qū)動(dòng)開(kāi)發(fā)者提供更精準(zhǔn)、更高效的開(kāi)發(fā)環(huán)境,力求做到一次開(kāi)發(fā),多系統(tǒng)部署。

HDF框架以組件化的驅(qū)動(dòng)模型作為核心設(shè)計(jì)思路,為開(kāi)發(fā)者提供更精細(xì)化的驅(qū)動(dòng)管理,讓驅(qū)動(dòng)開(kāi)發(fā)和部署更加規(guī)范。HDF框架將一類設(shè)備驅(qū)動(dòng)放在同一個(gè)host里面,驅(qū)動(dòng)內(nèi)部實(shí)現(xiàn)開(kāi)發(fā)者也可以將驅(qū)動(dòng)功能分層獨(dú)立開(kāi)發(fā)和部署,支持一個(gè)驅(qū)動(dòng)多個(gè)node,HDF框架管理驅(qū)動(dòng)模型如下圖所示:


2. 驅(qū)動(dòng)框架

2.1 驅(qū)動(dòng)框架實(shí)現(xiàn)

在 huawei/hdf 目錄下新建一個(gè)文件夾 led, 然后在其中新建一個(gè)源文件 led.c。

  1. #include "hdf_device_desc.h"  // HDF框架對(duì)驅(qū)動(dòng)開(kāi)放相關(guān)能力接口的頭文件 
  2. #include "hdf_log.h"          // HDF 框架提供的日志接口頭文件 
  3.  
  4. #define HDF_LOG_TAG led_driver   // 打印日志所包含的標(biāo)簽,如果不定義則用默認(rèn)定義的HDF_TAG標(biāo)簽 
  5.  
  6. //驅(qū)動(dòng)對(duì)外提供的服務(wù)能力,將相關(guān)的服務(wù)接口綁定到HDF框架 
  7. int32_t HdfLedDriverBind(struct HdfDeviceObject *deviceObject) 
  8.     HDF_LOGD("Led driver bind success"); 
  9.     return 0; 
  10.  
  11. // 驅(qū)動(dòng)自身業(yè)務(wù)初始的接口 
  12. int32_t HdfLedDriverInit(struct HdfDeviceObject *deviceObject) 
  13.     if (deviceObject == NULL) { 
  14.         HDF_LOGE("Led driver Init failed!"); 
  15.         return HDF_ERR_INVALID_OBJECT; 
  16.     } 
  17.     HDF_LOGD("Led driver Init success"); 
  18.     return HDF_SUCCESS; 
  19.  
  20. // 驅(qū)動(dòng)資源釋放的接口 
  21. void HdfLedDriverRelease(struct HdfDeviceObject *deviceObject) 
  22.     if (deviceObject == NULL) { 
  23.         HDF_LOGE("Led driver release failed!"); 
  24.         return
  25.     } 
  26.  
  27.     HDF_LOGD("Led driver release success"); 
  28.     return

 2.2 驅(qū)動(dòng)入口注冊(cè)到HDF框架

  1. // 定義驅(qū)動(dòng)入口的對(duì)象,必須為HdfDriverEntry(在hdf_device_desc.h中定義)類型的全局變量 
  2. struct HdfDriverEntry g_ledDriverEntry = { 
  3.     .moduleVersion = 1, 
  4.     .moduleName = "led_driver"
  5.     .Bind = HdfLedDriverBind, 
  6.     .Init = HdfLedDriverInit, 
  7.     .Release = HdfLedDriverRelease, 
  8. }; 
  9.  
  10. // 調(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)資源并退出。 
  11. HDF_INIT(g_ledDriverEntry); 

 3. 驅(qū)動(dòng)編譯

在 huawei/hdf/led 目錄下新建編譯文件 Makefile

  1. include $(LITEOSTOPDIR)/../../drivers/hdf/lite/lite.mk  #導(dǎo)入hdf預(yù)定義內(nèi)容,必需 
  2.  
  3. MODULE_NAME := hdf_led_driver  #生成的結(jié)果文件 
  4. LOCAL_SRCS += led.c  #本驅(qū)動(dòng)的源代碼文件 
  5. LOCAL_INCLUDE := ./include  #本驅(qū)動(dòng)的頭文件目錄 
  6. LOCAL_CFLAGS += -fstack-protector-strong -Wextra -Wall -Werror  #自定義的編譯選項(xiàng) 
  7. include $(HDF_DRIVER)  #導(dǎo)入模板makefile完成編譯 

 這里的hdf_led_driver為驅(qū)動(dòng)文件名,注意對(duì)應(yīng)關(guān)系。

4. 編譯結(jié)果鏈接到內(nèi)核鏡像

修改 huawei/hdf/hdf_vendor.mk 文件,添加以下代碼

  1. LITEOS_BASELIB += -lhdf_led_driver  #鏈接生成的靜態(tài)庫(kù) 
  2. LIB_SUBDIRS    += $(VENDOR_HDF_DRIVERS_ROOT)/led  #驅(qū)動(dòng)代碼Makefile的目錄 

 填入驅(qū)動(dòng)文件名和源碼路徑。

5. 驅(qū)動(dòng)配置

驅(qū)動(dòng)配置包含兩部分,HDF框架定義的驅(qū)動(dòng)設(shè)備描述和驅(qū)動(dòng)的私有配置信息。

5.1 驅(qū)動(dòng)設(shè)備描述(必選)

HDF框架加載驅(qū)動(dòng)所需要的信息來(lái)源于HDF框架定義的驅(qū)動(dòng)設(shè)備描述。

修改 vendor/hisi/hi35xx/hi3516dv300/config/device_info/device_info.hcs配置文件,添加驅(qū)動(dòng)的設(shè)備描述。

  1. platform :: host { 
  2.     hostName = "platform_host";  // host名稱,host節(jié)點(diǎn)是用來(lái)存放某一類驅(qū)動(dòng)的容器 
  3.     priority = 50;  // host啟動(dòng)優(yōu)先級(jí)(0-200),值越大優(yōu)先級(jí)越低,建議默認(rèn)配100,優(yōu)先級(jí)相同則不保證host的加載順序 
  4.  
  5.     device_led :: device {                  // led設(shè)備節(jié)點(diǎn) 
  6.         device0 :: deviceNode {             // led驅(qū)動(dòng)的DeviceNode節(jié)點(diǎn) 
  7.             policy = 2;                     // policy字段是驅(qū)動(dòng)服務(wù)發(fā)布的策略,在驅(qū)動(dòng)服務(wù)管理章節(jié)有詳細(xì)介紹 
  8.             priority = 100;                 // 驅(qū)動(dòng)啟動(dòng)優(yōu)先級(jí)(0-200),值越大優(yōu)先級(jí)越低,建議默認(rèn)配100,優(yōu)先級(jí)相同則不保證device的加載順序 
  9.             preload = 0;                    // 驅(qū)動(dòng)按需加載字段 
  10.             permission = 0666;              // 驅(qū)動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)權(quán)限 
  11.             moduleName = "led_driver";      // 驅(qū)動(dòng)名稱,該字段的值必須和驅(qū)動(dòng)入口結(jié)構(gòu)的moduleName值一致 
  12.             serviceName = "led_service";    // 驅(qū)動(dòng)對(duì)外發(fā)布服務(wù)的名稱,必須唯一 
  13.             deviceMatchAttr = "led_config"; // 驅(qū)動(dòng)私有數(shù)據(jù)匹配的關(guān)鍵字,必須和驅(qū)動(dòng)私有數(shù)據(jù)配置表中的match_attr值相等 
  14.         } 
  15.     }  

 其中,moduleName、serviceName和deviceMatchAttr 都比較重要,分布鏈接到源碼的不同位置,我這里都分開(kāi)命名,便于理解。

5.2 驅(qū)動(dòng)私有配置信息(可選)

如果驅(qū)動(dòng)有私有配置,則可以添加一個(gè)驅(qū)動(dòng)的配置文件,用來(lái)填寫(xiě)一些驅(qū)動(dòng)的默認(rèn)配置信息,HDF框架在加載驅(qū)動(dòng)的時(shí)候,會(huì)將對(duì)應(yīng)的配置信息獲取并保存在HdfDeviceObject 中的property里面,通過(guò)Bind和Init(參考驅(qū)動(dòng)開(kāi)發(fā))傳遞給驅(qū)動(dòng)。

在 vendor/hisi/hi35xx/hi3516dv300/config/ 目錄下新建一個(gè)文件夾 led, 然后在其中新建一個(gè)源文件 led_config.hcs, 填入以下代碼。

  1. root { 
  2.     LedDriverConfig { 
  3.         led_version = 1; 
  4.         match_attr = "led_config";   //該字段的值必須和device_info.hcs中的deviceMatchAttr值一致 
  5.     } 

 配置信息定義之后,需要將該配置文件添加到板級(jí)配置入口文件hdf.hcs。

5.3 板級(jí)配置(可選)

修改 vendor/hisi/hi35xx/hi3516dv300/config/hdf.hcs文件,添加代碼

  1. #include "device_info/device_info.hcs" 
  2. #include "led/led_config.hcs" 

 6. 驅(qū)動(dòng)消息機(jī)制管理

當(dāng)用戶態(tài)應(yīng)用和內(nèi)核態(tài)驅(qū)動(dòng)需要交互時(shí),可以使用HDF框架的消息機(jī)制來(lái)實(shí)現(xiàn)。用消息管理可以在用戶態(tài)和內(nèi)核態(tài)之間架起橋梁,這為我們之后的APP提供了操控底層設(shè)備功能的能力。

這里我們?cè)谟脩魬B(tài)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的消息機(jī)制,內(nèi)核態(tài)接受到消息后,翻轉(zhuǎn)攝像頭兩側(cè)的紅外補(bǔ)光燈。

6.1 配置服務(wù)策略

HDF框架定了驅(qū)動(dòng)對(duì)外發(fā)布服務(wù)的策略,是由配置文件中的policy字段來(lái)控制。

  1. typedef enum { 
  2.     /* 驅(qū)動(dòng)不提供服務(wù) */ 
  3.     SERVICE_POLICY_NONE = 0, 
  4.     /* 驅(qū)動(dòng)對(duì)內(nèi)核態(tài)發(fā)布服務(wù) */ 
  5.     SERVICE_POLICY_PUBLIC = 1, 
  6.     /* 驅(qū)動(dòng)對(duì)內(nèi)核態(tài)和用戶態(tài)都發(fā)布服務(wù) */ 
  7.     SERVICE_POLICY_CAPACITY = 2, 
  8.     /* 驅(qū)動(dòng)服務(wù)不對(duì)外發(fā)布服務(wù),但可以被訂閱 */ 
  9.     SERVICE_POLICY_FRIENDLY = 3, 
  10.     /* 驅(qū)動(dòng)私有服務(wù)不對(duì)外發(fā)布服務(wù),也不能被訂閱 */ 
  11.     SERVICE_POLICY_PRIVATE = 4, 
  12.     /* 錯(cuò)誤的服務(wù)策略 */ 
  13.     SERVICE_POLICY_INVALID 
  14. } ServicePolicy; 

 我們將驅(qū)動(dòng)配置信息中服務(wù)策略policy字段設(shè)置為2,在之前的設(shè)備描述文件device_info.hcs里已經(jīng)配置好了。

6.2 實(shí)現(xiàn)服務(wù)

在第2章,我們實(shí)現(xiàn)了一個(gè)空的驅(qū)動(dòng)框架,現(xiàn)在繼續(xù)實(shí)現(xiàn)內(nèi)核態(tài)的消息服務(wù)接口。

編輯 huawei/hdf/led/led.c, 實(shí)現(xiàn)服務(wù)基類成員IDeviceIoService中的Dispatch方法。收到用戶態(tài)發(fā)來(lái)的命令后,操作LED設(shè)備,然后將返回值通過(guò)reply傳回,最后再將收到的命令回傳給用戶態(tài)程序。

  1. // Dispatch是用來(lái)處理用戶態(tài)發(fā)下來(lái)的消息 
  2. int32_t LedDriverDispatch(struct HdfDeviceIoClient *client, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply) 
  3.     int32_t result = HDF_FAILURE; 
  4.     HDF_LOGE("Led driver dispatch"); 
  5.     if (client == NULL || client->device == NULL
  6.     { 
  7.         HDF_LOGE("Led driver device is NULL"); 
  8.         return HDF_ERR_INVALID_OBJECT; 
  9.     } 
  10.  
  11.     switch (cmdCode) 
  12.     { 
  13.     case LED_WRITE_READ: 
  14.         const char *recv = HdfSbufReadString(data); 
  15.         if (recv != NULL
  16.         { 
  17.             HDF_LOGI("recv: %s", recv); 
  18.             result = CtlLED(-1);  # 操作設(shè)備 
  19.             // CtlLED(GPIO_VAL_HIGH); 
  20.             if (!HdfSbufWriteInt32(reply, result)) 
  21.             { 
  22.                 HDF_LOGE("replay is fail"); 
  23.             } 
  24.             return HdfDeviceSendEvent(client->device, cmdCode, data); 
  25.         } 
  26.         break; 
  27.  
  28.     default
  29.         break; 
  30.     } 
  31.     return result; 

 修改 HdfLedDriverBind函數(shù),將服務(wù)綁定到框架。

  1. //驅(qū)動(dòng)對(duì)外提供的服務(wù)能力,將相關(guān)的服務(wù)接口綁定到HDF框架 
  2. int32_t HdfLedDriverBind(struct HdfDeviceObject *deviceObject) 
  3.     if (deviceObject == NULL
  4.     { 
  5.         HDF_LOGE("Led driver bind failed!"); 
  6.         return HDF_ERR_INVALID_OBJECT; 
  7.     } 
  8.     static struct IDeviceIoService ledDriver = { 
  9.         .Dispatch = LedDriverDispatch, 
  10.     }; 
  11.     deviceObject->service = (struct IDeviceIoService *)(&ledDriver); 
  12.     HDF_LOGD("Led driver bind success"); 
  13.     return HDF_SUCCESS; 

 7. 業(yè)務(wù)代碼

內(nèi)核態(tài)核心功能,就簡(jiǎn)單實(shí)現(xiàn)一個(gè)每調(diào)用一次,就翻轉(zhuǎn)一下LED狀態(tài)的CtrlLED函數(shù)。這里mode為 -1 時(shí)為翻轉(zhuǎn),也可以直接指定高電平或低電平來(lái)開(kāi)關(guān),方便后續(xù)擴(kuò)展。

其中Hi3516DV300的控制器管理12組GPIO管腳,每組8個(gè)。

GPIO號(hào) = GPIO組索引(0~11)* 每組GPIO管腳數(shù)(8) + 組內(nèi)偏移。

那么GPIO5_1的GPIO號(hào) = 5 * 8 +1 = 41。

  1. static int32_t CtlLED(int mode) 
  2.     int32_t ret; 
  3.     uint16_t valRead; 
  4.     /* LED的GPIO管腳號(hào) */ 
  5.     uint16_t gpio = 5 * 8 + 1;  // 紅外補(bǔ)光燈 
  6.     // uint16_t gpio = 2 * 8 + 3;  // 綠色指示燈 
  7.     // uint16_t gpio = 3 * 8 + 4;  // 紅色指示燈 
  8.  
  9.     /* 將GPIO管腳配置為輸出 */ 
  10.     ret = GpioSetDir(gpio, GPIO_DIR_OUT); 
  11.     if (ret != 0) 
  12.     { 
  13.         HDF_LOGE("GpioSerDir: failed, ret %d\n", ret); 
  14.         return ret; 
  15.     } 
  16.  
  17.     if (mode == -1) 
  18.     { 
  19.         // 翻轉(zhuǎn)輸出口 
  20.         (void)GpioRead(gpio, &valRead); 
  21.         ret = GpioWrite(gpio, (valRead == GPIO_VAL_LOW) ? GPIO_VAL_HIGH : GPIO_VAL_LOW); 
  22.     } 
  23.     else 
  24.     { 
  25.         ret = GpioWrite(gpio, mode); 
  26.     } 
  27.  
  28.     if (ret != 0) 
  29.     { 
  30.         HDF_LOGE("GpioWrite: failed, ret %d\n", ret); 
  31.         return ret; 
  32.     } 
  33.     return ret; 

 同理,GPIO2_3、GPIO3_4和蜂鳴器組件等等通用IO設(shè)備也能相應(yīng)控制,可以盡情發(fā)揮想象力了。

8. 配置Kconfig

在`vendor/huawei/hdf/led/`下,新建一個(gè)目錄`driver`,再在其下新建`Kconfig`文件。

  1. config LOSCFG_DRIVERS_HDF_PLATFORM_LED 
  2.     bool "Enable HDF LED driver" 
  3.     default n 
  4.     depends on LOSCFG_DRIVERS_HDF_PLATFORM 
  5.     help 
  6.       Answer Y to enable HDF LED driver. 

 將其鏈接到板級(jí)Kconfig中,在vendor/huawei/hdf/Kconfig增加。

  1. source "../../vendor/huawei/hdf/led/driver/Kconfig" 

好了,內(nèi)核態(tài)的程序基本都搞定了。

9. 用戶態(tài)程序

我們開(kāi)始寫(xiě)個(gè)主程序通過(guò)消息機(jī)制來(lái)與內(nèi)核態(tài)交互。

新建applications/sample/camera/myApp/my_led_app.c源文件:

9.1 定義參數(shù)

led_service為服務(wù)名稱,需要與之前定義的匹配;LED_WRITE_READ為命令標(biāo)識(shí),用戶態(tài)和內(nèi)核態(tài)通過(guò)這個(gè)來(lái)標(biāo)識(shí)消息類型。

  1. #define LED_WRITE_READ 1 
  2. #define HDF_LOG_TAG LED_APP 
  3. #define LED_SERVICE "led_service" 

 9.2 發(fā)送消息

先實(shí)現(xiàn)一個(gè)發(fā)送消息的函數(shù)SendEvent,發(fā)送字符串命令后,收回內(nèi)核態(tài)reply中操作設(shè)備后的返回值,放入replyData中打印出來(lái)。這里操作成功返回0。

  1. static int SendEvent(struct HdfIoService *serv, char *eventData) 
  2.     int ret = 0; 
  3.     struct HdfSBuf *data = HdfSBufObtainDefaultSize(); 
  4.     if (data == NULL
  5.     { 
  6.         HDF_LOGE("fail to obtain sbuf data"); 
  7.         return 1; 
  8.     } 
  9.  
  10.     struct HdfSBuf *reply = HdfSBufObtainDefaultSize(); 
  11.     if (reply == NULL
  12.     { 
  13.         HDF_LOGE("fail to obtain sbuf reply"); 
  14.         ret = HDF_DEV_ERR_NO_MEMORY; 
  15.         goto out
  16.     } 
  17.  
  18.     if (!HdfSbufWriteString(data, eventData)) 
  19.     { 
  20.         HDF_LOGE("fail to write sbuf"); 
  21.         ret = HDF_FAILURE; 
  22.         goto out
  23.     } 
  24.  
  25.     ret = serv->dispatcher->Dispatch(&serv->object, LED_WRITE_READ, data, reply); 
  26.     if (ret != HDF_SUCCESS) 
  27.     { 
  28.         HDF_LOGE("fail to send service call"); 
  29.         goto out
  30.     } 
  31.  
  32.     int replyData = 0; 
  33.     if (!HdfSbufReadInt32(reply, &replyData)) 
  34.     { 
  35.         HDF_LOGE("fail to get service call reply"); 
  36.         ret = HDF_ERR_INVALID_OBJECT; 
  37.         goto out
  38.     } 
  39.     HDF_LOGE("Get reply is: %d", replyData); 
  40. out
  41.     HdfSBufRecycle(data); 
  42.     HdfSBufRecycle(reply); 
  43.     return ret; 

 9.3 設(shè)置回調(diào)

收到內(nèi)核態(tài)發(fā)來(lái)的字符串,簡(jiǎn)單打印一下。

  1. static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data) 
  2.     const char *string = HdfSbufReadString(data); 
  3.     if (string == NULL
  4.     { 
  5.         HDF_LOGE("fail to read string in event data"); 
  6.         return HDF_FAILURE; 
  7.     } 
  8.     HDF_LOGE("%s: dev event received: %u %s", (char *)priv, id, string); 
  9.  
  10.     return HDF_SUCCESS; 

 9.4 主程序

先構(gòu)造一個(gè)服務(wù),通過(guò)服務(wù)名稱,綁定到對(duì)應(yīng)的驅(qū)動(dòng)。然后設(shè)置監(jiān)聽(tīng),等待來(lái)自內(nèi)核的消息。最后每隔1秒發(fā)出一條翻轉(zhuǎn)LED的指令。

  1. int main(void) 
  2.     struct HdfIoService *serv = HdfIoServiceBind(LED_SERVICE, 0); 
  3.     if (serv == NULL
  4.     { 
  5.         HDF_LOGE("fail to get service %s", LED_SERVICE); 
  6.         return HDF_FAILURE; 
  7.     } 
  8.     static struct HdfDevEventlistener listener = { 
  9.         .callBack = OnDevEventReceived, 
  10.         .priv = "Service0"}; 
  11.  
  12.     if (HdfDeviceRegisterEventListener(serv, &listener) != HDF_SUCCESS) 
  13.     { 
  14.         HDF_LOGE("fail to register event listener"); 
  15.         return HDF_FAILURE; 
  16.     } 
  17.  
  18.     char *send_cmd = "toggle LED"
  19.     while (1) 
  20.     { 
  21.         if (SendEvent(serv, send_cmd)) 
  22.         { 
  23.             HDF_LOGE("fail to send event"); 
  24.             return HDF_FAILURE; 
  25.         } 
  26.         sleep(1); 
  27.     } 
  28.  
  29.     if (HdfDeviceUnregisterEventListener(serv, &listener)) 
  30.     { 
  31.         HDF_LOGE("fail to  unregister listener"); 
  32.         return HDF_FAILURE; 
  33.     } 
  34.  
  35.     HdfIoServiceRecycle(serv); 
  36.     HDF_LOGI("exit"); 
  37.  
  38.     return HDF_SUCCESS; 

 9.5 配置BUILD.gn

在 drivers/hdf/lite/manager/BUILD.gn里增加以下代碼,生成led_app應(yīng)用。

  1. lite_component("hdf_manager") { 
  2.     features = [ 
  3.         ":hdf_core"
  4.     ] 
  5.  
  6. executable("led_app") { 
  7.     sources = [ 
  8.         "//applications/sample/camera/myApp/my_led_app.c" 
  9.          
  10.     ] 
  11.  
  12.     include_dirs = [ 
  13.         "../adapter/syscall/include"
  14.         "../adapter/vnode/include"
  15.         "$HDF_FRAMEWORKS/ability/sbuf/include",         
  16.         "$HDF_FRAMEWORKS/core/shared/include"
  17.         "$HDF_FRAMEWORKS/core/host/include"
  18.         "$HDF_FRAMEWORKS/core/master/include"
  19.         "$HDF_FRAMEWORKS/include/core"
  20.         "$HDF_FRAMEWORKS/include/utils"
  21.         "$HDF_FRAMEWORKS/utils/include"
  22.         "$HDF_FRAMEWORKS/include/osal"
  23.         "//third_party/bounds_checking_function/include"
  24.     ] 
  25.          
  26.     deps = [ 
  27.         "//drivers/hdf/lite/manager:hdf_core"
  28.         "//drivers/hdf/lite/adapter/osal/posix:hdf_posix_osal"
  29.     ] 
  30.  
  31.     public_deps = [ 
  32.         "//third_party/bounds_checking_function:libsec_shared"
  33.         ] 
  34.  
  35.     defines = [ 
  36.         "__USER__"
  37.     ] 
  38.  
  39.     cflags = [ 
  40.         "-Wall"
  41.         "-Wextra"
  42.         "-Werror"
  43.     ] 

 

10. 編譯和燒錄

由于這次我們要用到`HDF`框架,需要用到的組件比較多,簡(jiǎn)單復(fù)制一個(gè)`build\lite\product\ipcamera_hi3516dv300.json`改名為`my_hi3516dv300`即可。

  1. python build.py my_hi3516dv300 -b debug 

 

編譯和燒錄的過(guò)程參考前文,這里不再贅述了。順利的話,啟動(dòng)程序就能看見(jiàn)LED歡快的閃爍了。

  1. ./bin/led_app 

 

[[377473]]

 [[377474]]

紅外光在肉眼下不太顯眼,在鏡頭下比較亮些,照度范圍很大,后續(xù)再測(cè)一下夜視補(bǔ)光的效果。

總結(jié)

驅(qū)動(dòng)開(kāi)發(fā)涉及到文件和配置比較多,關(guān)系也比較紛繁,而且分散在各個(gè)目錄。

這里列出主要文件再梳理一下:


大致上分三個(gè)部分,內(nèi)核態(tài)、用戶態(tài)和驅(qū)動(dòng)配置。

1. 內(nèi)核態(tài)

首先由led.c生成名為led_service的服務(wù),以g_ledDriverEntry結(jié)構(gòu)注冊(cè)到HCS框架。編譯成hdf_led_driver驅(qū)動(dòng),通過(guò) huawei/hdf/hdf_vendor.mk鏈接到內(nèi)核鏡像中。

通過(guò) HdfLedDriverBind函數(shù)將led_driver模塊綁定到框架,IDeviceIoService中的Dispatch方法來(lái)處理來(lái)自用戶態(tài)消息。

2. 用戶態(tài)

用戶態(tài)以HdfIoServiceBind通過(guò)服務(wù)名led_service來(lái)找到相應(yīng)的驅(qū)動(dòng),用HdfSbufWriteString來(lái)發(fā)送消息,serv->dispatcher->Dispatch來(lái)接收返回值,通過(guò)HdfDeviceRegisterEventListener設(shè)置監(jiān)聽(tīng),來(lái)獲取內(nèi)核態(tài)主動(dòng)發(fā)送的消息。

3. 驅(qū)動(dòng)配置

以模塊名led_driver找到注冊(cè)到HCS框架的驅(qū)動(dòng)程序(內(nèi)核側(cè)的別名);

以服務(wù)名led_service,暴露給用戶態(tài)程序或內(nèi)核態(tài)程序調(diào)用(用戶側(cè)的別名);

以led_config鏈接驅(qū)動(dòng)私有配置文件。兩個(gè)別名雙向解綁,最后通過(guò)配置文件來(lái)進(jìn)行耦合,保證了靈活性。這種設(shè)計(jì)在分布式的場(chǎng)合中,會(huì)有比較大的便利性。

資料下載

 

下一篇預(yù)告

本期主要介紹了一下HDF的驅(qū)動(dòng)開(kāi)發(fā),

界面部分礙于篇幅留在下一篇介紹了,

敬請(qǐng)期待...


©著作權(quán)歸作者和HarmonyOS技術(shù)社區(qū)共同所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任。

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

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

https://harmonyos.51cto.com/#zz

 

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

2023-09-06 15:35:14

2022-08-08 19:35:37

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

2021-01-19 12:46:45

鴻蒙HarmonyOSHelloworld

2021-01-15 11:36:16

鴻蒙HarmonyOSAI應(yīng)用

2021-01-15 09:50:06

鴻蒙HarmonyOSAI應(yīng)用

2021-01-25 09:58:01

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-01-14 12:06:22

鴻蒙HarmonyOSAI應(yīng)用

2023-03-16 15:18:16

2021-02-06 10:40:45

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2023-03-20 16:05:49

HDF傳感器驅(qū)動(dòng)開(kāi)發(fā)

2023-03-24 14:47:24

NAPI框架HDF框架

2021-12-15 10:02:25

鴻蒙HarmonyOS應(yīng)用

2021-09-07 15:48:28

鴻蒙HarmonyOS應(yīng)用

2024-12-20 09:15:00

2021-12-15 15:30:38

鴻蒙HarmonyOS應(yīng)用

2021-11-22 16:46:59

鴻蒙HarmonyOS應(yīng)用

2021-11-30 14:52:41

鴻蒙HarmonyOS應(yīng)用

2023-03-20 16:21:26

ADC數(shù)字轉(zhuǎn)換器

2020-11-09 11:56:49

HarmonyOS

2023-09-14 15:49:42

PWM鴻蒙
點(diǎn)贊
收藏

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