原厂入驻New

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

Open Harmony OS sample_test Demo

5.0共2个课时9121人已学习

讲师:张飞    张飞实战电子高级工程师

Open Harmony OS sample_test Demo 专栏课程 2个课时

  • Open Harmony OS sample_test Demo专栏介绍

    1.    目标

    理解OHOS驱动框架,用户态APP和内核态驱动之间的通信机制。

    具体运行结果为用户态APP向驱动发送123cmd,内核态读取该cmd对应的字符串data,并打印出来。然后内核态驱动程序向用户态发送事件,传递的参数为reply。用户态APP通过事件监听函数获取内核态发送的消息打印出来。

    2.    编写驱动程序

    这跟Linux的驱动框架不一样,在Linux中,APP打开设备节点后,APP调用的read函数会直接进入内核态调用驱动的read函数。

     

    liteos-a中使用HDF时,APP需要先获得服务,然后调用服务的Dispatch函数:它可以向驱动发送数据、获得返回结果。

    2.1 编写驱动

    HDF中,一个驱动被抽象为“HdfDriverEntry”,代码如下:

    image.png

     

    上述代码中,使用HDF_INIT定义了某些段属性的结构体,内核启动后会注册这个HdfDriverEntry

     

    重要的是其中的Bind函数,InitRelease函数顾名思义就是初始化和释放相关资源,这里好像和HDF_INIT有些冲突,示例函数用空函数来替代它们了。代码如下:

    image.png

     

    2.2 驱动服务函数的实现

    在驱动初始化函数HdfSampleDriverBind中会绑定一个服务函数,这个服务函数用来处理用户态APP发送过来的消息。绑定过程是给IDeviceIoService这个结构体的Dispatch元素赋值来实现的。如图所示:

    image.png

    你可以认为Dispatch函数相当于ioctl,在Linux中通过ioctl(fd, cmd, arg)来操作驱动。

    liteos-a中通过service->>dispatcher->Dispatch(ojb, cmd, data, replay)来操作驱动。把驱动放入内核

    3.    把驱动源码放入内核

    3.1   驱动代码放进目录

    3.1.1    把代码放入目录:

    vendor/huawei/hdf/sample

    image.png

    Kconfig如下:

    image.png

    Makefile如下:

    image.png

    如下图增加最后一行:


    image.png

    image.png

    上一级的Kconfig

    # Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.

     

    source "../../vendor/hisi/hi35xx/platform/Kconfig"

    source "../../vendor/huawei/hdf/wifi/driver/Kconfig"

    source "../../vendor/huawei/hdf/input/driver/Kconfig"

    source "../../vendor/huawei/hdf/display/driver/Kconfig"

    source "../../vendor/huawei/hdf/sample/Kconfig"

    3.2   修改hcs文件

    3.2.1    增加sample_config.hcs文件

    目录:vendor/hisi/hi35xx/ hi3516dv300/config /sample/sample_config.hcs

     image.png


    image.png

    源码:

    root {

        module = "sample_driver";

        author = "zhangfeidz for test";

        serviceName = "sample_service";

    }

    3.2.2    在上级hcs中引用sample_config.hcs文件

     image.png

    image.png



    3.2.3    在全局设备节点中增加device_sample节点

    目录:vendor/hisi/hi35xx/ hi3516dv300/config /device_info/device_info.hcs


    image.png

    image.png

    3.3   修改mk文件

    目录:vendor/huawei/hdf/hdf_vendor.mk:

    image.png

    增加两行:

    image.png

    3.4   内核态源码:

     

    4.    编写APP

    APP先获得服务,在调用Dispatch即可。需要注意的是里面用的是HdfSBuf传递数据。

    一下是hello_test.c的源码。

    4.1 绑定服务

    image.png


    4.1   注册监听机制及设置回调函数



     image.png

    4.2   调用内核服务函数

    image.png

    要分配两个HdfBufdatareplydata用于向驱动传参数,reply用来保存驱动返回的数据。

    代码如下:

    image.png


    4.3   取出内核发送过来的数据

    image.png


    4.4   内核驱动初始化(绑定)服务程序

    image.png

    4.5   读取用户态程序(sample_test)发送过来的消息并向用户态发送响应消息

    image.png

    4.6   源码

    image.png

    5.    APP源码放入BUILD.gn文件

     

    先在整个系统源码的根目录下创建一个子目录,比如myapp,在里面放入sample_test.c

    再修改 drivers/hdf/lite/manager/BUILD.gn

     image.pngimage.png

    源码如下:

    import("//build/lite/config/component/lite_component.gni")

     

    HDF_FRAMEWORKS = "//drivers/hdf/frameworks"

     

    shared_library("hdf_core") {

        sources = [

            "$HDF_FRAMEWORKS/core/shared/src/hdf_io_service.c",

            "$HDF_FRAMEWORKS/ability/sbuf/src/hdf_sbuf.c",

            "../adapter/syscall/src/hdf_syscall_adapter.c"

        ]

     

        include_dirs = [

            "../adapter/syscall/include",

            "../adapter/vnode/include",

            "$HDF_FRAMEWORKS/core/shared/include",

            "$HDF_FRAMEWORKS/core/host/include",

            "$HDF_FRAMEWORKS/core/manager/include",

            "$HDF_FRAMEWORKS/ability/sbuf/include",

            "$HDF_FRAMEWORKS/include/core",

            "$HDF_FRAMEWORKS/include/utils",

            "$HDF_FRAMEWORKS/utils/include",

            "$HDF_FRAMEWORKS/include/osal",

            "//third_party/bounds_checking_function/include",

        ]

     

        deps = [

            "//drivers/hdf/lite/adapter/osal/posix:hdf_posix_osal",

            "//third_party/bounds_checking_function:libsec_shared",

        ]

     

        defines = [

            "__USER__",

        ]

     

        cflags = [

            "-Wall",

            "-Wextra",

            "-Werror",

            "-fsigned-char",

            "-fno-common",

            "-fno-strict-aliasing",

        ]

    }

     

     

    executable("sample_test") {

        sources = [

            "//myapp/sample_test.c"

        ]

     

        include_dirs = [

            "../adapter/syscall/include",

            "../adapter/vnode/include","$HDF_FRAMEWORKS/ability/sbuf/include",

            "$HDF_FRAMEWORKS/core/shared/include",

            "$HDF_FRAMEWORKS/core/host/include",

            "$HDF_FRAMEWORKS/core/master/include",

            "$HDF_FRAMEWORKS/include/core",

            "$HDF_FRAMEWORKS/include/utils",

            "$HDF_FRAMEWORKS/utils/include",

            "$HDF_FRAMEWORKS/include/osal",

            "//third_party/bounds_checking_function/include",

        ]

     

        deps = [

            "//drivers/hdf/lite/manager:hdf_core",

            "//drivers/hdf/lite/adapter/osal/posix:hdf_posix_osal",

        ]

     

        public_deps = [

            "//third_party/bounds_checking_function:libsec_shared",

        ]

        defines = [

            "__USER__",

        ]

     

        cflags = [

            "-Wall",

            "-Wextra",

            "-Werror",

        ]

    }

     

    lite_component("hdf_manager") {

        features = [

            ":hdf_core",

            ":sample_test",

        ]

    }

    sample_test.c文件信息加入BUILD.gn文件后,编译系统时,就会按照指定的规则(程序源码,编译依赖,生成可执行程序的名字,以及可执行程序在OHOS系统中的目录)进行编译。

    6.    编译、烧写、测试

    6.1 编译

    Hi3516dv300开发板: python build.py ipcamera_hi3516dv300 -b debug

    Hi3518ev300开发板: python build.py ipcamera_hi3518ev300 -b debug

    Hi3516dv300开发板: python build.py ipcamera –p hi3516dv300_liteos_a

    Hi3518ev300开发板: python build.py ipcamera –p hi3518ev300_liteos_a

     

    6.1   烧写

    6.1.1          烧写文件所在目录:out/ipcamera_hi3516dv300_liteos_a/

    6.1.2    烧写文件

    6.1.2.1  操作系统文件:                        OHOS_Image.bin

    6.1.2.2  文件系统文件(光盘镜像文件):          rootfs

    6.1.2.3  用户文件(光盘镜像文件):               userfs


    image.png

    网口烧录配置


     image.png

    6.2   测试

    6.2.1    Uboot设置

    uboot里面输入命令,配置启动设置,具体方法如下。

    命令1

    Hi3516dv300开发板:

    setenv bootcmd 'sf probe 0;sf read 0x80000000 0x100000 0x600000;go 0x80000000';saveenv;

    Hi3518ev300开发板:

    setenv bootcmd 'sf probe 0;sf read 0x40000000 0x100000 0x600000;go 0x40000000';saveenv;

     

    这条命令作用是选择从0x80000000(或者0x40000000)这个地址启动OHOS。在flash内部,0x100000是起始地址,0x6000000OHOS_Image.bin的大小(本示例中,该文档大小为6M

     

    命令2

    setenv bootargs "ttyAMA0,115200n8 root=flash fstype=jffs2 rw rootaddr=7M rootsize=8M";saveenv;

    该命令的作用是进行串口配置。rootaddr是文件系统的起始地址,rootsize是文件的大小。实际开发时,请具体情况具体分析。

     

    配置完成后,输入命令 go 0x80000000,就可以进入鸿蒙系统了。

    6.2.2    测试结果

    鸿蒙系统目录结构如下:

    image.png

    进入bin文件夹,运行sample_test程序:

    image.png


    注:本文档或视频中所有的图片,代码截图仅供参考,具体以HarmonyOS官网发布的最新内容为准。

Open Harmony OS sample_test Demo推荐课程


专栏评论


课程评分

平均评分
5.00个评分
详细评分
5星
0
4星
0
3星
0
2星
0
1星
0

Open Harmony OS sample_test Demo专栏评论

评分满意度:
*请输入内容还能输入200字
«

x