电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1351|回复: 1
收起左侧

如何在Linux环境下在Hi3516DV300开发板搭载鸿蒙OS实现一个简单的Helloworld程序

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-9-21 11:56:58 | 显示全部楼层 |阅读模式
如何在Linux环境下在Hi3516DV300开发板搭载鸿蒙OS实现一个简单的Helloworld程序,   
1.   目标 理解HarmonyOS驱动框架,用户态APP和内核态驱动之间的通信机制。 具体运行结果为用户态APP向驱动发送123号cmd,内核态读取该cmd对应的字符串data,并打印出来。然后内核态驱动程序向用户态发送事件,传递的参数为reply。用户态APP通过事件监听函数获取内核态发送的消息打印出来。
2.   编写驱动程序 这跟Linux的驱动框架不一样,在Linux中,APP打开设备节点后,APP调用的read函数会直接进入内核态调用驱动的read函数。 在liteos-a中使用HDF时,APP需要先获得服务,然后调用服务的Dispatch函数:它可以向驱动发送数据、获得返回结果。


2.1 编写驱动

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

2.1.png (24 KB, 下载次数: 0)

下载附件  保存到相册  

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

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

2.11.png (40.66 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传
2.2 驱动服务函数的实现

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

2.2.png (75.52 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传 你可以认为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

3.1.png (26.98 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传 Kconfig如下:

3.11.png (26.93 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传

Makefile如下:

3.111.png (41.52 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传

如下图增加最后一行:

3.1111.png (21.57 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传



3.11111.png (33.78 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传

上一级的Kconfig:

  • 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:

3.2.1.png (26.41 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传



3.2.11.png (22.41 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传
源码:

  • root {
      
  •     module = “sample_driver“;
      
  •     author = “zhangfeidz for test“;
      
  •     serviceName = “sample_service“;

复制代码
3.2.2   在上级hcs中引用sample_config.hcs文件



3.2.2.png (26.05 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传





3.2.22.png (40.25 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传




3.2.3    在全局设备节点中增加device_sample节点 目录:vendor/hisi/hi35xx/ hi3516dv300/config /device_info/device_info.hcs:

3.2.3.png (25.27 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传



3.2.33.png (58.65 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传


3.3   修改mk文件

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

3.3.png (23.47 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传 增加2行:

3.33.png (39.25 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传




4.   编写APP APP先获得服务,在调用Dispatch即可。需要注意的是里面用的是HdfSBuf传递数据。以下是hello_test.c的源码。


4.1 绑定服务



4.1.png (26.88 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传




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



4.11.png (27.63 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传





4.111.png (36.15 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传




4.2  调用内核服务函数 要分配两个HdfBuf:data、reply。data用于向驱动传参数,reply用来保存驱动返回的数据。 代码如下:

4.2.png (61.59 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传


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



4.3.png (29.31 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传


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



4.4.png (80.93 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传


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

4.5.png (51.47 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传




4.6   源码



4.6.png (22.83 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传




5.   把APP源码放入BUILD.gn文件 先在整个系统源码的根目录下创建一个子目录,比如myapp,在里面放入sample_test.c。 再修改drivers/hdf/lite/manager/BUILD.gn。

5.png (26.25 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传



55.png (22.83 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传

源码如下:

  • 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文件后,编译系统时,就会按照指定的规则(程序源码,编译依赖,生成可执行程序的名字,以及可执行程序在HarmonyOS系统中的目录)进行编译。




6.   编译、烧写、测试
6.1 编译

Hi3516dv300开发板:python build.py ipcamera_hi3516dv300 -b debug Hi3518ev300开发板:python build.py ipcamera_hi3518ev300 -b debug Hi3516dv300开发板:python build.pyipcamera –p hi3516dv300_liteos_a Hi3518ev300开发板:python build.pyipcamera –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

6.1.2.3.png (83.46 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传

网口烧录配置

6.1.2.33.png (75.52 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传


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)这个地址启动HarmonyOS。在flash内部,0x100000是起始地址,0x6000000是OHOS_Image.bin的大小(本示例中,该文档大小为6M)

命令2: setenv bootargs “ttyAMA0,115200n8root=flash fstype=jffs2 rw rootaddr=7M rootsize=8M“;saveenv; 该命令的作用是进行串口配置。rootaddr是文件系统的起始地址,rootsize是文件的大小。实际开发时,请具体情况具体分析。



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




6.2.2   测试结果 鸿蒙系统目录结构如下:

6.2.2.png (20.18 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传

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

6.2.22.png (28.44 KB, 下载次数: 0)

下载附件  保存到相册  

1 小时前 上传
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表