Openharmony の HDF フレームワークを介して単純なドライバーを実装するプロセスを理解するための上記の例に従って、test_hdf_newdevice1 デバイスのドライバーが実装されました。アプリケーションまたはサービスは、HDF フレームワークのドライバー メッセージ メカニズムを通じてこのデバイスとどのように通信しますか?
Openharmony の V3.1 バージョンをベースとして使用し、分析と説明用のテスト コードを作成します。
HDF フレームワークは、ユーザー アプリケーションがカーネル モード ドライバーにメッセージを送信することをサポートする統合ドライバー メッセージ メカニズムを提供します。また、カーネル モード ドライバーがユーザー モード アプリケーションにメッセージを送信することもサポートします。
1. ユーザーモードアプリケーションテストプログラム
アプリケーション、動的ライブラリ .so または静的ライブラリ .a を作成することで、カーネルのドライバと通信できます。ここでは、アプリケーションを例として使用した簡単なデモンストレーションを示します。
ユーザー モード アプリケーション テスト プログラムを作成する手順は次のとおりです。
プロジェクトを作成します:
新しいソース ファイルを作成します。
コンパイル構成を追加します。
コンパイルして書き込みます。
1.1 新しいソース ファイル test.c を作成する
ドライバーによって公開されたサービスの名前(test_hdf_newdevice1)を通じて、ドライバーのサービス オブジェクトを取得します。
// test.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <string.h>
#include <core/hdf_io_service_if.h>
#include "hdf_sbuf.h"
#include "osal_time.h"
#include "hilog/log.h"
...
int main(int arg, char **argv)
{
struct HdfIoService *serv = HdfIoServiceBind("test_hdf_newdevice1");
if (serv == NULL) {
printf("get service fail!\n");
return -1;
}
return 0;
}
イベントリスニングオブジェクトの登録 HdfDevEventlistener
// test.c
...
#define TEST_WRITE_DATA 1234
static int OnDevEventReceive(struct HdfDevEventlistener *listener,
struct HdfIoService *service, uint32_t id, struct HdfSBuf *data)
{
printf("enter %d, service address is %p, event cmdId is %d\n",
__func__, service, id);
return 0;
}
static struct HdfDevEventlistener listener = {
.onReceive = OnDevEventReceive
}
int main(int arg, char **argv)
{
...
if (HdfDeviceRegisterEventListener(serv, &listener) != 0) {
printf("register event listener fail!\n");
}
...
}
書き込むデータと読み出すデータ
// test.c
...
int main(int arg, char **argv)
{
...
struct HdfSBuf *data = HdfSbufObtainDefaultSize();
if (data == NULL) {
printf("fail to obtain sbuf data!\n");
return -1;
}
struct HdfSBuf *reply = HdfSbufObtainDefaultSize();
if (reply == NULL) {
printf("fail to obtain sbuf reply!\n");
HdfSbufRecycle(data);
return -1;
}
// 写入传入的数据
if (!HdfSbufWriteString(data, "Send Msg to Driver Message!")) {
printf("fail to write sbuf!\n");
HdfSbufRecycle(data);
HdfSbufRecycle(reply);
HdfDeviceUnregisterEventListener(serv, &listener);
HdfIoServiceRecycle(serv);
return -1;
}
...
}
メッセージを配信する
...
int main(int arg, char **argv)
{
...
if (serv->dispatcher->Dispatch(&service->object,
TEST_WRITE_DATA, data, reply) != 0) {
printf("fail to send service call!\n");
HdfSbufRecycle(data);
HdfSbufRecycle(reply);
HdfDeviceUnregisterEventListener(serv, &listener);
HdfIoServiceRecycle(serv);
return -1;
}
...
}
ドライバーの戻りデータを読み取る
...
int main(int arg, char **argv)
{
const char *result = HdfSbufReadString(reply);
if (result == NULL) {
printf("fail to read result from reply!\n");
HdfSbufRecycle(data);
HdfSbufRecycle(reply);
HdfDeviceUnregisterEventListener(serv, &listener);
HdfIoServiceRecycle(serv);
return -1;
}
printf("read result from driver: %s\n", result);
HdfSbufRecycle(data);
HdfSbufRecycle(reply);
HdfDeviceUnregisterEventListener(serv, &listener);
HdfIoServiceRecycle(serv);
return 0;
}
...
1.2 コンパイル設定 BUILD.gn を追加
import("//build/ohos.gni")
import("//drivers/adapter/uhdf2/uhdf.gni")
ohos_executable("test_hdf_msg") {
sources = ["test.c"]
include_dirs = [
"//drivers/framework/include",
"//drivers/framework/include/utils",
"//drivers/adapter/uhdf2/osal/include",
"//drivers/framework/include/osal"
]
deps = [
"$hdf_uhdf_path/utils:libhdf_utils",
]
external_deps = [
"device_driver_framework:libhdf_utils",
"hiviewdfx_hilog_native:libhilog",
"utils_base:utils"
]
}
1.3 コンパイルと書き込み
./build.sh --product-name rk3568
# 将生成的执行文件test_hdf_msg通过hdc发送开发板执行
# 上一篇中HdfNewdeviceIoServiceDispatch中接收到信息打印如下
# HdfNewdeviceIoServiceDispatch read data is: Send Msg to Driver Message!
# 返回如下信息
# read result from driver: I am driver's reply string!
2. HDFの特性
HDF ドライバーの読み込みには、オンデマンド読み込みと順次読み込みが含まれます。
オンデマンドでのロード: HDF フレームワークは、システム起動時にデフォルトでロードされるドライバー、またはシステム起動後に動的にロードされるドライバーをサポートしています。
順次ロード: HDF フレームワークは、システム起動時にドライバーの優先順位に従ってドライバーがロードされることをサポートしています。
HDF フレームワークはドライバー サービスを集中管理でき、開発者は HDF フレームワークが提供する機能インターフェイスを通じてドライバー関連のサービスを直接取得できます。
DF フレームワークは、ユーザー モード アプリケーションがカーネル モード ドライバーにメッセージを送信することをサポートする統合ドライバー メッセージ メカニズムを提供し、また、カーネル モード ドライバーがユーザー モード アプリケーションにメッセージを送信することもサポートします。
HCS (HDF Configuration Source) は、HDF ドライバー フレームワークの構成記述ソース コードであり、その内容は主に Key-Value の形式になっています。これにより、構成コードがドライバー コードから分離され、開発者が構成管理を実行しやすくなります。
参考文献
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/Readme-CN.md