疯壳-鸿蒙OS-应用程序监听驱动程序消息
在前面课程中,我们通过驱动服务基类成员IDeviceIoService中的Dispatch方法进行用户态应用程序和内核态驱动程序的消息交互,其中涉及到两个HdfSBuf——data与reply:
data:为app向驱动传递的数据的指针
reply:为驱动向app传递的数据的指针
除此之外,app下发数据以后,驱动程序可以通过主动上报事件的方式向app发送消息,而app端则需要注册监听上报事件的相关操作方法。
在前面课程的代码基础上,app与驱动源码需要做下列修改:
- app代码修改
1.消息回调声明
我这里在main函数上方进行声明
Ps:static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data);
2.消息回调实体定义
我这里在main函数后面进行消息回调的实体定义
Ps:
static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data)
{
unsigned int tmp = 0;
OsalTimespec time;
OsalGetTime(&time);
HDF_LOGE("%s received event at %llu.%llu", (char *)priv, time.sec, time.usec);
if (!HdfSbufReadUint32(data,(unsigned int*)&tmp)) {
HDF_LOGE("drv fail to read sbuf");
return -1;
}
HDF_LOGE("%s: dev event received: %d %d", (char *)priv, id, tmp);
return 0;
}
3.添加系统时间、延迟等接口头文件
4.mian函数修改一
在main函数此处定义监听相关变量以及监听注册
Ps:
static struct HdfDevEventlistener listener = {
.callBack = OnDevEventReceived,
.priv ="fk sample_service"
};
if (HdfDeviceRegisterEventListener(serv, &listener) != 0) {
HDF_LOGE("fail to register event listener");
return -1;
}
5.main函数修改二
添加取消注册操作
Ps:
return HdfDeviceSendEvent(client->device, cmdCode, data);
上图添加的接口在hdf_device_desc.h文件中声明:其中第一个参数为 HdfDeviceObject结构体指针,该结构体指针为Disaptch第一个参数中的结构体的成员,他表示驱动程序设备对象的指针。
第二个参数表示消息发送事件的ID,上面的代码直接回传了cmdCode。
第三个参数表示驱动程序发送的消息内容的指针,上面的代码直接回传了data buf。
接下来将代码重新编译,将编译生成的文件烧录到板子中,运行 /bin 目录下的myapp结果如下
终端中打印的信息完全符合我们的代码逻辑。
————————————————
版权声明:本文为CSDN博主「fengkesz」的原创文章