電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 1006|回復(fù): 0
收起左側(cè)

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

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級(jí)會(huì)員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-9-16 19:56:23 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
HarmonyOS HDF驅(qū)動(dòng)框架---驅(qū)動(dòng)開(kāi)發(fā),   
驅(qū)動(dòng)開(kāi)發(fā)


驅(qū)動(dò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)模型如下圖所示:
圖1 HDF框架管理驅(qū)動(dòng)模型




驅(qū)動(dòng)開(kāi)發(fā)步驟 基于HDF框架進(jìn)行驅(qū)動(dòng)的開(kāi)發(fā)主要分為兩個(gè)部分,驅(qū)動(dòng)實(shí)現(xiàn)和驅(qū)動(dòng)配置,詳細(xì)開(kāi)發(fā)流程如下所示:

  • 驅(qū)動(dòng)實(shí)現(xiàn) 驅(qū)動(dòng)實(shí)現(xiàn)包含驅(qū)動(dòng)業(yè)務(wù)代碼和驅(qū)動(dòng)入口注冊(cè),具體寫法如下:

      

         
    • 驅(qū)動(dòng)業(yè)務(wù)代碼

         

             
      • #include “hdf_device_desc.h“  // HDF框架對(duì)驅(qū)動(dòng)開(kāi)放相關(guān)能力接口的頭文件
             
      • #include “hdf_log.h“          // HDF 框架提供的日志接口頭文件
             

      •      
      • #define HDF_LOG_TAG sample_driver   // 打印日志所包含的標(biāo)簽,如果不定義則用默認(rèn)定義的HDF_TAG標(biāo)簽
             

      •      
      • //驅(qū)動(dòng)對(duì)外提供的服務(wù)能力,將相關(guān)的服務(wù)接口綁定到HDF框架
             
      • int32_t HdfSampLEDriverBind(struct HdfDeviceObject *deviceObject)
             
      • {
             
      •     HDF_LOGD(“Sample driver bind success“);
             
      •     return 0;
             
      • }
             

      •      
      • // 驅(qū)動(dòng)自身業(yè)務(wù)初始的接口
             
      • int32_t HdfSampleDriverInit(struct HdfDeviceObject *deviceObject)
             
      • {
             
      •     HDF_LOGD(“Sample driver Init success“);
             
      •     return 0;
             
      • }
             

      •      
      • // 驅(qū)動(dòng)資源釋放的接口
             
      • void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject)
             
      • {
             
      •     HDF_LOGD(“Sample driver release success“);
             
      •     return;
             
      • }
          
           

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

         

             
      • // 定義驅(qū)動(dòng)入口的對(duì)象,必須為HdfDriverEntry(在hdf_device_desc.h中定義)類型的全局變量
             
      • struct HdfDriverEntry g_sampleDriverEntry = {
             
      •     .moduleVersion = 1,
             
      •     .moduleName = “sample_driver“,
             
      •     .Bind = HdfSampleDriverBind,
             
      •     .Init = HdfSampleDriverInit,
             
      •     .Release = HdfSampleDriverRelease,
             
      • };
             

      •      
      • // 調(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)資源并退出。
             
      • HDF_INIT(g_sampleDriverEntry);
          
           

        
        

  • 驅(qū)動(dòng)編譯

      

         
    • 驅(qū)動(dòng)代碼的編譯必須要使用HDF框架提供的Makefile模板進(jìn)行編譯

         

             
      • include $(LITEOSTOPDIR)/../../drivers/hdf/lite/lite.mk #導(dǎo)入hdf預(yù)定義內(nèi)容,必需
             
      • MODULE_NAME :=    #生成的結(jié)果文件
             
      • LOCAL_INCLUDE :=  #本驅(qū)動(dòng)的頭文件目錄
             
      • LOCAL_SRCS :=     #本驅(qū)動(dòng)的源代碼文件
             
      • LOCAL_CFLAGS :=  #自定義的編譯選項(xiàng)
             
      • include $(HDF_DRIVER) #導(dǎo)入模板makefile完成編譯
          
           

         
    • 編譯結(jié)果文件鏈接到內(nèi)核鏡像,添加到vendor目錄下的hdf_vendor.mk里面,示例如下

         

             
      • LITEOS_BASELIB +=  -lxxx  #鏈接生成的靜態(tài)庫(kù)
             
      • LIB_SUBDIRS    +=         #驅(qū)動(dòng)代碼Makefile的目錄
          
           

        
        

  • 驅(qū)動(dòng)配置 HDF使用HCS作為配置描述源碼,HCS詳細(xì)介紹參考配置管理介紹。 驅(qū)動(dòng)配置包含兩部分,HDF框架定義的驅(qū)動(dòng)設(shè)備描述和驅(qū)動(dòng)的私有配置信息,具體寫法如下:

      

         
    • 驅(qū)動(dòng)設(shè)備描述(必選) HDF框架加載驅(qū)動(dòng)所需要的信息來(lái)源于HDF框架定義的驅(qū)動(dòng)設(shè)備描述,因此基于HDF框架開(kāi)發(fā)的驅(qū)動(dòng)必須要在HDF框架定義的device_info.hcs配置文件中添加對(duì)應(yīng)的設(shè)備描述,驅(qū)動(dòng)的設(shè)備描述填寫如下所示

         

             
      • root {
             
      •     device_info {
             
      •         match_attr = “hdf_manager“;
             
      •         template host {       // host模板,繼承該模板的節(jié)點(diǎn)(如下sample_host)如果使用模板中的默認(rèn)值,則節(jié)點(diǎn)字段可以缺省
             
      •             hostName = ““;
             
      •             priority = 100;
             
      •             template device {
             
      •                 template deviceNode {
             
      •                     policy = 0;
             
      •                     priority = 100;
             
      •                     preload = 0;
             
      •                     permission = 0664;
             
      •                     moduleName = ““;
             
      •                     serviceName = ““;
             
      •                     deviceMatchAttr = ““;
             
      •                 }
             
      •             }
             
      •         }
             
      •         sample_host :: host{
             
      •             hostName = “host0“;    // host名稱,host節(jié)點(diǎn)是用來(lái)存放某一類驅(qū)動(dòng)的容器
             
      •             priority = 100;        // host啟動(dòng)優(yōu)先級(jí)(0-200),值越大優(yōu)先級(jí)越低,建議默認(rèn)配100,優(yōu)先級(jí)相同則不保證host的加載順序
             
      •             device_sample :: device {        // sample設(shè)備節(jié)點(diǎn)
             
      •                 device0 :: deviceNode {      // sample驅(qū)動(dòng)的DeviceNode節(jié)點(diǎn)
             
      •                     policy = 1;              // policy字段是驅(qū)動(dòng)服務(wù)發(fā)布的策略,在驅(qū)動(dòng)服務(wù)管理章節(jié)有詳細(xì)介紹
             
      •                     priority = 100;          // 驅(qū)動(dòng)啟動(dòng)優(yōu)先級(jí)(0-200),值越大優(yōu)先級(jí)越低,建議默認(rèn)配100,優(yōu)先級(jí)相同則不保證device的加載順序
             
      •                     preload = 0;             // 驅(qū)動(dòng)按需加載字段,在本章節(jié)最后的說(shuō)明有詳細(xì)介紹
             
      •                     permission = 0664;       // 驅(qū)動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)權(quán)限
             
      •                     moduleName = “sample_driver“;   // 驅(qū)動(dòng)名稱,該字段的值必須和驅(qū)動(dòng)入口結(jié)構(gòu)的moduleName值一致
             
      •                     serviceName = “sample_service“;    // 驅(qū)動(dòng)對(duì)外發(fā)布服務(wù)的名稱,必須唯一
             
      •                     deviceMatchAttr = “sample_config“; // 驅(qū)動(dòng)私有數(shù)據(jù)匹配的關(guān)鍵字,必須和驅(qū)動(dòng)私有數(shù)據(jù)配置表中的match_attr值相等
             
      •                 }
             
      •             }
             
      •         }
             
      •     }
             
      • }
          
           

         
    • 驅(qū)動(dòng)私有配置信息(可選) 如果驅(qū)動(dòng)有私有配置,則可以添加一個(gè)驅(qū)動(dòng)的配置文件,用來(lái)填寫一些驅(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),驅(qū)動(dòng)的配置信息示例如下:

         

             
      • root {
             
      •     SampleDriverConfig {
             
      •         sample_version = 1;
             
      •         sample_bus = “I2C_0“;
             
      •         match_attr = “sample_config“;   //該字段的值必須和device_info.hcs中的deviceMatchAttr值一致
             
      •     }
             
      • }
          
           
      配置信息定義之后,需要將該配置文件添加到板級(jí)配置入口文件hdf.hcs(這一塊可以通過(guò)HarmonyOS驅(qū)動(dòng)子系統(tǒng)在DevEco集成驅(qū)動(dòng)開(kāi)發(fā)套件工具一鍵式配置,具體使用方法參考驅(qū)動(dòng)開(kāi)發(fā)套件中的介紹),示例如下:
         

             
      • #include “device_info/device_info.hcs“
             
      • #include “sample/sample_config.hcs“
          
           

        

說(shuō)明

驅(qū)動(dòng)加載方式支持按需加載和按序加載兩種方式,具體使用方法如下:

  • 按需加載

      

         
    • typedef enum {
         
    •     DEVICE_PRELOAD_ENABLE = 0,
         
    •     DEVICE_PRELOAD_DISABLE,
         
    •     DEVICE_PRELOAD_INVALID
         
    • } DevicePreload;
        
        
    配置文件中preload 字段配成 0 (DEVICE_PRELOAD_ENABLE ),則系統(tǒng)啟動(dòng)過(guò)程中默認(rèn)加載;配成1(DEVICE_PRELOAD_DISABLE),則系統(tǒng)啟動(dòng)過(guò)程中默認(rèn)不加載,支持后續(xù)動(dòng)態(tài)加載,當(dāng)用戶態(tài)獲取驅(qū)動(dòng)服務(wù)(參考消息機(jī)制)時(shí),如果驅(qū)動(dòng)服務(wù)不存在時(shí),HDF框架會(huì)嘗試動(dòng)態(tài)加載該驅(qū)動(dòng)。  
  • 按序加載(需要驅(qū)動(dòng)為默認(rèn)加載) 配置文件中的priority(取值范圍為整數(shù)0到200)是用來(lái)表示host和驅(qū)動(dòng)的優(yōu)先級(jí),不同的host內(nèi)的驅(qū)動(dòng),host的priority值越小,驅(qū)動(dòng)加載優(yōu)先級(jí)越高;同一個(gè)host內(nèi)驅(qū)動(dòng)的priority值越小,加載優(yōu)先級(jí)越高。
      

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表