|
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;
- }
|
|