
#2020征文-开发板#【AI Camera连载】HDF驱动和应用编译框架梳理
参考文档
链接:https://gitee.com/openharmony/docs/blob/master/driver/HDF%E9%A9%B1%E5%8A%A8%E6%A1%86%E6%9E%B6.md
HDF驱动框架
● HDF开发概述
● 驱动开发
● 驱动服务管理
● 驱动消息机制管理
● 配置管理
● HDF开发实例
HDF(OpenHarmony Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。
1. 配置管理
驱动配置包含两部分,HDF框架定义的驱动设备描述(必选)和驱动的私有配置信息(可选)。
HDF框架加载驱动所需要的信息来源于HDF框架定义的device_info.hcs配置文件(驱动设备描述)。
如果驱动有私有配置,则可以添加一个驱动的配置文件,用来填写一些驱动的默认配置信息,HDF框架在加载驱动的时候,会将对应的配置信息获取并保存在HdfDeviceObject 中的property里面,通过Bind和Init(参考驱动开发)传递给驱动。配置信息定义之后,需要将该配置文件添加到板级配置入口文件hdf.hcs。
HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。
在HDF框架的配置文件中添加该驱动的配置信息,如下所示:
$ vi ~/harmony/sdk/vendor/hisi/hi35xx/hi3516dv300/config/device_info/device_info.hcs
HDF框架定了驱动对外发布服务的策略,是由配置文件中的policy字段来控制,policy字段的取值范围以及含义如下:
2. 编写驱动代码
2.1 基于HDF框架编写的sample驱动代码如下:
$ mkdir -p ~/harmony/sdk/vendor/huawei/hdf/sample/platform/hdf-sample
$ vi ~/harmony/sdk/vendor/huawei/hdf/sample/platform/hdf-sample/hdf_sample.c
2.2 创建Kconfig
$ cd ~/harmony/sdk/vendor/huawei/hdf/sample/platform/hdf-sample
$ touch Kconfig && vi Kconfig
修改上层Kconfig
$ vi ~/harmony/sdk/vendor/huawei/hdf/Kconfig
2.3 创建Makefile
$ cd ~/harmony/sdk/vendor/huawei/hdf/sample/platform/hdf-sample
$ touch Makefile && vi Makefile
2.4 将驱动模块加入编译
$ vi ~/harmony/sdk/vendor/huawei/hdf/hdf_vendor.mk
LITEOS_BASELIB中的hdf_sample为Makefile里的MODULE_NAME名字。
2.5 Makefile格式说明
驱动代码的编译必须要使用HDF框架提供的Makefile模板进行编译。
编译结果文件链接到内核镜像,添加到vendor目录下的hdf_vendor.mk里面,示例如下:
2.6 驱动编译
2.6.1 编译报错问题
1:kernel deconfig报错,需要修改。
$ python build.py ipcamera_hi3516dv300 -b debug
处理:
通过搜索定位DRIVERS_HDF_LCD_ICN9700 的配置,然后参考其用法。
$ grep DRIVERS_HDF_LCD_ICN9700 . -nr
查看该目录下的一个编译脚本build.sh:
$ vi ~/harmony/sdk/kernel/liteos_a/build.sh
发现在脚本里面将hi3516dv300_release.config拷贝为了.config:
$ vi ~/harmony/sdk/kernel/liteos_a/tools/build/config/hi3516dv300_release.config
查看配置:
$ vi ~/harmony/sdk/kernel/liteos_a/.config
尝试手动添加DRIVERS_HDF_PLATFORM_HDF_SAMPLE为y:
$ vi ~/harmony/sdk/kernel/liteos_a/tools/build/config/hi3516dv300_clang.config
让修改生效:
$ cd ~/harmony/sdk/kernel/liteos_a/
$ ./build.sh hi3516dv300 clang debug
然后重新编译,该问题解决通过。
2.6.2 编译
报错问题2:变量类型不匹配
处理:
$ vi ~/harmony/sdk/vendor/huawei/hdf/sample/platform/hdf-sample/hdf_sample.c
再次编译,该问题解决通过。
查看驱动模块hdf_sample存放位置:
~/harmony/sdk$ find -name hdf_sample
3. 编写用户程序和驱动交互代码
3.1 基于HDF框架编写的用户态程序和驱动交互的代码如下:
$ mkdir -p ~/harmony/sdk/vendor/huawei/hdf/sample/platform/hdf-sample/app
$ vi ~/harmony/sdk/vendor/huawei/hdf/sample/platform/hdf-sample/app/hdf_sample_app.c
说明: 用户态应用程序使用了HDF框架中的消息发送接口,因此在编译用户态程序的过程中需要依赖HDF框架对外提供的hdf_core和osal的动态库,在gn编译文件中添加如下依赖项:
3.2 编写编译APP源码的BUILD.gn文件
$ vi ~/harmony/sdk/vendor/huawei/hdf/sample/platform/hdf-sample/BUILD.gn
注意,里面的对齐不能使用table键,否则编译会报错。
3.3 将hdf_sample_app.c加入编译
$ vi ~/harmony/sdk/build/lite/product/ipcamera_hi3516dv300.json
3.4 应用编译
$ python build.py ipcamera_hi3516dv300 -b debug
$ vi out/ipcamera_hi3516dv300/build.log
通过上面的编译日志可以找到hdf_sample_app应用放在了/bin目录:
4. 烧录
4.1 将系统bin文件拷贝到Windows共享目录中:
$ rm /mnt/hgfs/proj-harmony/images/out/ -rf
$ cp -rf out/ /mnt/hgfs/proj-harmony/images/
4.2 在HiTool工具中依次填入OHOS_Image.bin、rootfs.img、userfs.img的文件位置
操作流程如下:
修改一下长度:
点击“烧写”按键后,控制台会提示重启目标板,重启后,系统就自动进入烧写了。
单板初次启动需要修改启动参数,重新上电后登陆会进入uboot中,如果分区位置没有变化则不用执行下面修改启动参数的指令。
hisilicon # setenv bootcmd "mmc read 0x0 0x80000000 0x800 0x3000; go 0x80000000";
hisilicon # setenv bootargs "console=ttyAMA0,115200n8 root=emmc fstype=vfat rootaddr=7M rootsize=15M rw";
hisilicon # saveenv
hisilicon # reset
重启后进入系统。
注释:表示设置启动参数,输出模式为串口输出,波特率为115200,数据位8,rootfs挂载于emmc器件,文件系统类型为vfat,“rootaddr=6M rootsize=14M rw”处对应填入rootfs.img的烧写起始位置与长度,此处与新增rootfs.img文件时所填大小必须相同。
5. 测试
在根目录下,在命令行输入下面命令执行写入的demo程序,显示成功结果如下所示:
打印结果的截图:
6. 吐槽:
1. 内核config的详细配置说明没有看到。
2. 编译报错位置定位麻烦,不会在编译出错的位置立马停下来,需要在编译日志中搜索关键字FAILED、failed、ERROR、error等。
3. 重新编译时未修改过的文件都要重新编译一遍;分区文件的内容大概是些什么也不清楚,如果只修改了驱动或文件系统,是否可以只烧写某一个分区;不知道在哪里设置多核并行编译等。
4. 驱动如何手动加载和卸载也无说明。
5. 发现华为对整个SDK框架介绍比较少,好在靠自己慢慢分析SDK结构、或者照着已有源码“依葫芦画瓢”勉强能解决大部分问题,不过这样走了很多弯路,希望华为能逐渐将关键细节都写到开发文档中,不用每个人都走一遍常见的问题。
7. 附件:
修改过后的diff文件:
ubuntu@ubuntu20:~/harmony/sdk$ git show > hdf_test.diff
本文结束,感谢您的阅读!
