这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 疯壳-鸿蒙OS-应用程序监听驱动程序消息

共1条 1/1 1 跳转至

疯壳-鸿蒙OS-应用程序监听驱动程序消息

菜鸟
2021-02-05 14:27:26     打赏

应用程序监听驱动程序消息         

疯壳 出品


在前面课程中,我们通过驱动服务基类成员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:        HdfDeviceUnregisterEventListener(serv, &listener);


二、驱动修改

驱动程序在Disaptch中写寄存器操作后面添加箭头所示代码实现驱动消息主动上报

Ps:            return HdfDeviceSendEvent(client->device, cmdCode, data);


上图添加的接口在hdf_device_desc.h文件中声明:


其中第一个参数为 HdfDeviceObject结构体指针,该结构体指针为Disaptch第一个参数中的结构体的成员,他表示驱动程序设备对象的指针。

第二个参数表示消息发送事件的ID,上面的代码直接回传了cmdCode。

第三个参数表示驱动程序发送的消息内容的指针,上面的代码直接回传了data buf。




接下来将代码重新编译,将编译生成的文件烧录到板子中,运行 /bin 目录下的myapp结果如下:

终端中打印的信息完全符合我们的代码逻辑。





关键词: 疯壳 鸿蒙os    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]