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

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

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

HarmonyOS HDF驅(qū)動框架---驅(qū)動服務(wù)管理

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

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

驅(qū)動服務(wù)是HDF驅(qū)動設(shè)備對外提供能力的對象,由HDF框架統(tǒng)一管理。驅(qū)動服務(wù)管理主要包含驅(qū)動服務(wù)的發(fā)布和獲取。 HDF框架定了驅(qū)動對外發(fā)布服務(wù)的策略,是由配置文件中的policy字段來控制,policy字段的取值范圍以及含義如下:

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

使用場景 當(dāng)驅(qū)動以接口的形式對外提供能力時(shí),可以使用HDF框架的驅(qū)動服務(wù)管理能力。


接口說明 針對驅(qū)動服務(wù)管理功能,HDF框架開放了以下接口供開發(fā)者調(diào)用,如下表所示:
表1 服務(wù)管理接口[td]
方法 描述
int32_t (*Bind)(struct HdfDeviceObject *deviceObject); 需要驅(qū)動開發(fā)者實(shí)現(xiàn)Bind函數(shù),將自己的服務(wù)接口綁定到HDF框架中。
const struct HdfObject *DevSvcManagerClntGetService(const char *svcName); 獲取驅(qū)動的服務(wù)。
int HdfDeviceSubscribeService( struct HdfDeviceObject *deviceObject, const char *serviceName, struct SubscriberCallback callback); 訂閱驅(qū)動的服務(wù)。



開發(fā)步驟 驅(qū)動服務(wù)管理的開發(fā)包括驅(qū)動服務(wù)的編寫、綁定、獲取或者訂閱,詳細(xì)步驟如下。

  • 驅(qū)動服務(wù)發(fā)布。

      

         
    • 驅(qū)動服務(wù)結(jié)構(gòu)的定義
         
    • struct ISampLEDriverService {
         
    •     struct IDeviceIoService ioService;   // 服務(wù)結(jié)構(gòu)的首個(gè)成員必須是IDeviceIoService類型的成員
         
    •     int32_t (*ServiceA)(void);               // 驅(qū)動的第一個(gè)服務(wù)接口
         
    •     int32_t (*ServiceB)(uint32_t inputCode); // 驅(qū)動的第二個(gè)服務(wù)接口,有多個(gè)可以依次往下累加
         
    • };
         

    •    
    • 驅(qū)動服務(wù)接口的實(shí)現(xiàn)
         
    • int32_t SampleDriverServiceA(void)
         
    • {
         
    •     // 驅(qū)動開發(fā)者實(shí)現(xiàn)業(yè)務(wù)邏輯
         
    •     return 0;
         
    • }
         

    •    
    • int32_t SampleDriverServiceB(uint32_t inputCode)
         
    • {
         
    •     // 驅(qū)動開發(fā)者實(shí)現(xiàn)業(yè)務(wù)邏輯
         
    •     return 0;
         
    • }
        
        

  • 驅(qū)動服務(wù)綁定到HDF框架中,實(shí)現(xiàn)HdfDriverEntry中的Bind指針函數(shù)。

      

         
    • int32_t SampleDriverBind(struct HdfDeviceObject *deviceObject)
         
    • {
         
    •     // deviceObject為HDF框架給每一個(gè)驅(qū)動創(chuàng)建的設(shè)備對象,用來保存設(shè)備相關(guān)的私有數(shù)據(jù)和服務(wù)接口
         
    •     IF (deviceObject== NULL) {
         
    •         HDF_LOGE(“Sample device object is null!“);
         
    •         return -1;
         
    •     }
         
    •     static struct ISampleDriverService sampleDriverA = {
         
    •         .ServiceA = SampleDriverServiceA,
         
    •         .ServiceB = SampleDriverServiceB,
         
    •     };
         
    •     deviceObject->service = &sampleDriverA.ioService;
         
    •     return 0;
         
    • }
        
        

  • 驅(qū)動服務(wù)獲取。 驅(qū)動服務(wù)的獲取有兩種方式,HDF框架提供接口直接獲取和HDF框架提供訂閱機(jī)制獲取。

      

         
    • 通過HDF接口直接獲取 當(dāng)明確驅(qū)動已經(jīng)加載完成時(shí),獲取該驅(qū)動的服務(wù)可以通過HDF框架提供的能力接口直接獲取,如下所示:

         

             
      • const struct ISampleDriverService *sampleService =
             
      •         (const struct ISampleDriverService *)DevSvcManagerClntGetService(“sample_driver“);
             
      • if (sampleService == NULL) {
             
      •     return -1;
             
      • }
             
      • sampleService->ServiceA();
             
      • sampleService->ServiceB(5);
          
           

         
    • 通過HDF提供的訂閱機(jī)制獲取 當(dāng)對驅(qū)動(同一個(gè)host)加載的時(shí)機(jī)不感知時(shí),可以通過HDF框架提供的訂閱機(jī)制來訂閱該驅(qū)動,當(dāng)該驅(qū)動加載完成時(shí),HDF框架會將被訂閱的驅(qū)動服務(wù)發(fā)布給訂閱者,實(shí)現(xiàn)方式如下所示:

         

             
      • // 訂閱回調(diào)函數(shù)的編寫,當(dāng)被訂閱的驅(qū)動加載完成后,HDF框架會將被訂閱驅(qū)動的服務(wù)發(fā)布給訂閱者,通過這個(gè)回調(diào)函數(shù)給訂閱者使用
             
      • // object為訂閱者的私有數(shù)據(jù),service為被訂閱的服務(wù)對象
             
      • int32_t TestDriverSubCallBack(struct HdfDeviceObject *deviceObject, const struct HdfObject *service)
             
      • {
             
      •     const struct ISampleDriverService *sampleService =
             
      •         (const struct ISampleDriverService *)service;
             
      •     if (sampleService == NULL) {
             
      •         return -1;
             
      •     }
             
      •     sampleService->ServiceA();
             
      •     sampleService->ServiceB(5);
             
      • }
             
      • // 訂閱過程的實(shí)現(xiàn)
             
      • int32_t TestDriverInit(struct HdfDeviceObject *deviceObject)
             
      • {
             
      •     if (deviceObject== NULL) {
             
      •         HDF_LOGE(“Test driver init failed, deviceObject is null!“);
             
      •         return -1;
             
      •     }
             
      •     struct SubscriberCallback callBack;
             
      •     callBack.deviceObject = deviceObject;
             
      •     callBack.OnServiceConnected = TestDriverSubCallBack;
             
      •     int32_t ret = HdfDeviceSubscribeService(deviceObject, “sample_driver“, callBack);
             
      •     if (ret != 0) {
             
      •         HDF_LOGE(“Test driver subscribe sample driver failed!“);
             
      •     }
             
      •     return ret;
             
      • }
          
           

        

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

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


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