基于HDF的LED驱动程序开发(1)

引言

本文以小熊派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

驱动配置主要包括两个部分:必选配置可选配置

1.1 必选配置

必选配置就是配置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"; // 用于匹配设备节点的自定义属性
                }
            }  
        }

1.2 可选配置

除了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)

猜你喜欢

转载自blog.csdn.net/u013819452/article/details/126115259