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

PCB聯(lián)盟網

搜索
查看: 1902|回復: 0
收起左側

HarmonyOS HDF驅動框架---驅動服務管理

[復制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉到指定樓層
樓主
發(fā)表于 2020-9-16 19:56:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
HarmonyOS HDF驅動框架---驅動服務管理,   
驅動服務管理

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

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

使用場景 當驅動以接口的形式對外提供能力時,可以使用HDF框架的驅動服務管理能力。


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



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

  • 驅動服務發(fā)布。

      

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

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

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

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

      

         
    • int32_t SampleDriverBind(struct HdfDeviceObject *deviceObject)
         
    • {
         
    •     // deviceObject為HDF框架給每一個驅動創(chuàng)建的設備對象,用來保存設備相關的私有數(shù)據和服務接口
         
    •     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;
         
    • }
        
        

  • 驅動服務獲取。 驅動服務的獲取有兩種方式,HDF框架提供接口直接獲取和HDF框架提供訂閱機制獲取。

      

         
    • 通過HDF接口直接獲取 當明確驅動已經加載完成時,獲取該驅動的服務可以通過HDF框架提供的能力接口直接獲取,如下所示:

         

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

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

         

             
      • // 訂閱回調函數(shù)的編寫,當被訂閱的驅動加載完成后,HDF框架會將被訂閱驅動的服務發(fā)布給訂閱者,通過這個回調函數(shù)給訂閱者使用
             
      • // object為訂閱者的私有數(shù)據,service為被訂閱的服務對象
             
      • 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);
             
      • }
             
      • // 訂閱過程的實現(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ā)表回復

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

本版積分規(guī)則


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