赞
踩
本文以小熊派BearPi-HM_Micro_small开发板上的一个LED灯为例,介绍如何基于HDF框架开发一个外设的驱动程序。
在阅读本文之前,建议大家先阅读:《OpenHarmony驱动子系统概述》,对HDF框架有一个基本的了解。
另外,在编写LED灯的驱动程序时,我们会用到很多由HDF框架提供的API。为了便于查阅这些API的用法,建议大家在阅读本文的同时,打开文章《HDF驱动框架的API》(1)、(2)、(3)。在这几篇文章中汇集了本文所有用到的API。当然,你也可以直接去查阅这些API的源码和官方说明文档。
基于HDF框架进行设备驱动开发主要包括两部分工作:驱动配置 和 驱动实现 。
(1)驱动配置 :主要就是按照HDF框架所定义的设备驱动模型,以某种方式将设备驱动的配置信息(包括:所属设备集合及其属性、所属设备、设备节点及其属性)描述出来,提供给HDF驱动框架使用。只有这样,HDF驱动框架才能对设备驱动进行管理、加载和部署,应用程序才能通过驱动框架找到并使用设备驱动。
(2)驱动实现 :主要就是编写驱动的业务代码,实现驱动的具体功能(注:驱动的功能大多都是以驱动程序对外提供 服务 的形式呈现出来的)。
设备驱动的配置信息是怎么传递给HDF驱动框架的呢?具体流程如下图所示:
首先,设备驱动开发者负责将配置信息写入HCS(HDF Configuration Source,HDF配置源码)文件;其次,鸿蒙系统自带的HCS配置转换工具HC-GEN(HDF Configuration Generator)会将HCS文件转换成HDF驱动框架程序可读取的文件格式(有两种格式,上图中的HCB是其中的一种);接下来,HDF驱动框架就能够通过自身的HCS解析器获得设备的配置信息,设备的驱动程序也可以通过HDF提供的接口函数读取设备的配置信息。
驱动开发者在编写HCS文件时需要了解HCS语法,参见官方文档:
https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.0-LTS/zh-cn/device-dev/driver/driver-hdf-manage.md
驱动配置主要包括两个部分:必选配置 、可选配置 。
必选配置就是配置HDF设备驱动模型中定义的那些属性,见《OpenHarmony驱动子系统概述》的3.3节。
下面,我们来添加LED驱动的必选配置。
1、打开文件:
device\st\bearpi_hm_micro\liteos_a\hdf_config\device_info\device_info.hcs
上图红框中的部分是HDF定义的配置模板。最上层是host(设备集合);设备集合里面是它自身的两个属性:hostName(设备集合的名称)、priority(设备集合的优先级),以及一种或多种device(设备);每种设备里面包括一个或多个deviceNode(设备节点);设备节点里面是HDF给设备节点定义的七个属性。
接下来,有三个设备集合的配置:platform、input、network。这些配置都严格继承于HDF定义的配置模板,也就是说,这些配置中的那些属性都是模板规定好的,既不能新增也不能删减。如果在这些配置中,模板中规定的某个属性没有出现,也就意味着这个属性默认使用模板中定义的值。
2、添加LED的必选配置
添加LED的必选配置有以下两种方案可选:
(1)将LED作为一种设备添加到某个现有的设备集合(如:platform)里面,如下图红框中所示。
device_led :: device { // LED设备
device0 :: deviceNode { // LED设备节点
policy = 2; // 驱动对外发布服务的策略
priority = 10; // 驱动按序加载时优先级
preload = 1; // 驱动按需加载的方式
permission = 0777; // 设备节点的读写权限
moduleName = "HDF_LED"; // 驱动名称
serviceName = "hdf_led"; // 驱动对外发布服务的名称,必须唯一
deviceMatchAttr = "st_stm32mp157_led"; // 用于匹配设备节点的自定义属性
}
}
(2)为LED单独新建一个设备集合,比如:gpio,如下图红框中所示。
gpio :: host {
hostName = "gpio_host";
priority = 60;
device_led :: device { // LED设备
device0 :: deviceNode { // LED设备节点
policy = 2; // 驱动对外发布服务的策略
priority = 10; // 驱动按序加载时优先级
preload = 1; // 驱动按需加载的方式
permission = 0777; // 设备节点的读写权限
moduleName = "HDF_LED"; // 驱动名称
serviceName = "hdf_led"; // 驱动对外发布服务的名称,必须唯一
deviceMatchAttr = "st_stm32mp157_led"; // 用于匹配设备节点的自定义属性
}
}
}
除了HDF规定的属性之外,设备节点有时也需要增加一些自定义的属性,我们把这些自定义的属性称为 私有配置 或 可选配置 ,这些属性需要被保存在另一个hcs文件里面。由于可选配置通常用于配置驱动所占用的硬件资源,所以又称为驱动的 资源配置 。
LED需要占用一个GPIO端口,下面我们来添加LED的可选配置。
1、在路径device/st/bearpi_hm_micro/liteos_a/hdf_config/
下新建一个文件夹led
。
2、在文件夹led
下新建一个hcs文件:led_config.hcs
。
3、在文件led_config.hcs
中,添加LED的可选配置,如下:
root {
LedDriverConfig {
//驱动LED的GPIO的编号
led_gpio_num = 13;
//该字段的值必须和device_info.hcs中的deviceMatchAttr的值一致
match_attr = "st_stm32mp157_led";
}
}
设备节点的可选配置与它的必选配置就是通过属性match_attr
和属性deviceMatchAttr
联系在一起的。
4、将可选配置文件led_config.hcs
添加到路径device/st/bearpi_hm_micro/liteos_a/hdf_config/
下的板级配置入口文件:hdf.hcs
。
#include "led/led_config.hcs"
下一篇: 基于HDF的LED驱动程序开发(2)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。