Hi3516驱动开发 精华
Hi3516驱动开发
驱动框架介绍
驱动子系统
内核驱动是软件与硬件交互的桥梁,通过文件系统接口访问OpenHarmony内核的硬件资源,是用户与内核之间、进程与进程之间通信的一种方式。每类驱动代表一种能力,用户可以根据需求选择对应驱动,完成数据的传输。OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座,旨在为开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。
1、架构
OpenHarmony驱动框架采用主从架构设计模式,围绕着框架、模型、能力库和工具四个维度能力展开构建。
2、目录
3、驱动框架交互流程
驱动框架完成大部分驱动加载的动作,用户只需注册自己所需的接口和配置,然后驱动框架就会解析配置的内容,完成驱动加载和初始化动作。
4、安装
OpenHarmony驱动主要部署在内核态,当前主要采用静态链接方式,随内核子系统编译和系统镜像打包。
5、HDF驱动加载的过程
HDF Framework
1、简介
HDF Framework提供包括驱动框架、配置管理、配置解析、驱动通用框架模型、硬件通用平台能力接口等,驱动框架的架构图:
2、目录
HDF适配
HDF适配主要实现OpenHarmony驱动子系统内核或用户态驱动框架的代码和编译脚本,提供驱动框架的能力。
2、目录
linux khdf
1、简介
drivers/adapter/khdf/linux下提供OpenHarmony驱动子系统适配linux内核的代码和编译脚本,在linux内核中部署OpenHarmony驱动框架。
2、目录
peripheral
1、简介
peripheral主要包含各外设器件驱动相关的HDI(Hardware Driver Interface)接口、HAL实现、驱动模型及测试用例等,根据模块划分不同目录,具体模块的相关信息可参阅各模块子目录下的readme。
2、目录
代码目录为 /drivers/peripheral,其中包含的各子目录简介如下。
- audio:Audio HDI接口的定义,用于管理声卡驱动的加载和卸载、创建音频播放对象3及录音对象、选择音频场景、设置音频属性及音量、控制音频播放及录音的启停等。
- codec:Codec HDI接口的定义,这些接口对上层服务提供媒体编解码的驱动能力。
- display:Display HDI 接口定义及其默认实现,对上层图形服务提供显示驱动能力,包括显示图层的管理、显示内存的管理及硬件图形加速。
- format:Format HDI接口定义,此类接口对上层服务提供媒体文件复用和解复用的驱动能力。
- input:Input HDI接口定义及其实现,对上层输入系统服务提供操作input设备的驱动能力,包括input设备管理、业务流控制、数据上报等。
- sensor:Sensor HDI接口定义与实现,接口主要包括所有Sensor信息查询、Sensor启停、Sensor订阅/去订阅、Sensor参数配置等稳定的接口,简化服务开发。
- wlan:WLAN HDI接口定义与实现,包括创建和销毁HAL层和WLAN驱动的通道、获取本设备支持的WLAN特性等。
HDF
1、HDF驱动开发简介
HDF框架以组件化的驱动模型作为核心设计思路,为开发者提供更精细化的驱动管理,让驱动开发和部署更加规范。HDF框架将一类设备驱动放在同一个host里面,开发者也可以将驱动功能分层独立开发和部署,支持一个驱动多个node,HDF框架管理驱动模型如下图所示:
基于HDF(Hardware Driver Foundation驱动框架)开发驱动,用户只需注册自己所需的接口和配置,然后驱动框架就会解析配置的内容,完成驱动加载和初始化动作。
开发者基于HDF驱动框架开发的驱动主要包含三大部分:
1、驱动程序部分----完成驱动的功能逻辑。
2、驱动配置信息----指示驱动的加载信息内容。
3、驱动资源配置----配置驱动的硬件配置信息。
驱动程序主要是完成驱动功能的逻辑代码:
对于开发者首先看到的是驱动入口部分,驱动入口部分通过DriverEntry进行描述。
其中主要包含Bind, Init 和Release三个接口。
Bind接口描述:该接口的作用主要是完成驱动设备和设备服务接口的bind动作。
Init接口描述:当框架完成设备绑定动作后,就开始调用驱动初始化接口,当初始化成功后,驱动框架根据配置文件决定是否对外创建设备服务接口,还是只是对当前服务接口可见。如果Init初始化失败的话,驱动框架就会主动释放创建的设备接口等信息。
Release接口描述:当用户需要卸载驱动时,驱动框架先通过该接口通知驱动程序释放资源。然后在执行其他内部资源释放。
2、驱动加载
HDF驱动加载包括按需加载和按序加载。
-
按需加载
HDF框架支持驱动在系统启动过程中默认加载,或者在系统启动之后动态加载。
配置文件中preload 字段配成 0 (DEVICE_PRELOAD_ENABLE ),则系统启动过程中默认加载;配成1(DEVICE_PRELOAD_ENABLE_STEP2),当系统支持快启的时候,则在系统系统完成之后再加载这一类驱动,否则和DEVICE_PRELOAD_ENABLE 含义相同;
配成2(DEVICE_PRELOAD_DISABLE),则系统启动过程中默认不加载,支持后续动态加载,当用户态获取驱动服务(参考消息机制)时,如果驱动服务不存在时,HDF框架会尝试动态加载该驱动。
-
按序加载
HDF框架支持驱动在系统启动的过程中按照驱动的优先级进行加载。
配置文件中的priority(取值范围为整数0到200)是用来表示host和驱动的优先级,不同的host内的驱动,host的priority值越小,驱动加载优先级越高;同一个host内驱动的priority值越小,加载优先级越高。
3、驱动服务管理
HDF框架可以集中管理驱动服务,开发者可直接通过HDF框架对外提供的能力接口获取驱动相关的服务。
4、驱动消息机制
HDF框架提供统一的驱动消息机制,支持用户态应用向内核态驱动发送消息,也支持内核态驱动向用户态应用发送消息。
驱动开发步骤
驱动实现
驱动实现包含驱动业务代码和驱动入口注册,具体写法如下:
-
驱动业务代码
-
驱动入口注册到HDF框架
驱动编译
-
驱动代码的编译必须要使用HDF框架提供的Makefile模板进行编译。
-
编译结果文件链接到内核镜像,添加到device目录下的lite.mk里面,示例如下:
驱动配置
HDF使用HCS作为配置描述源码,HCS详细介绍参考配置管理介绍。
驱动配置包含两部分,HDF框架定义的驱动设备描述和驱动的私有配置信息,具体写法如下:
-
驱动设备描述(必选)
HDF框架加载驱动所需要的信息来源于HDF框架定义的驱动设备描述,因此基于HDF框架开发的驱动必须要在HDF框架定义的device_info.hcs配置文件中添加对应的设备描述,驱动的设备描述填写如下所示:
-
驱动私有配置信息(可选)
如果驱动有私有配置,则可以添加一个驱动的配置文件,用来填写一些驱动的默认配置信息,HDF框架在加载驱动的时候,会将对应的配置信息获取并保存在HdfDeviceObject 中的property里面,通过Bind和Init(参考驱动开发)传递给驱动,驱动的配置信息示例如下:
配置信息定义之后,需要将该配置文件添加到板级配置入口文件hdf.hcs(这一块可以通过OpenHarmony驱动子系统在DevEco集成驱动开发套件工具一键式配置,具体使用方法参考驱动开发套件中的介绍),示例如下:
驱动开发示例
下面基于HDF框架,提供一个简单的UART(Universal Asynchronous Receiver/Transmitter)平台驱动开发样例,包含配置文件的添加,驱动代码的实现以及用户态程序和驱动交互的流程。驱动程序源码位于vendor/huawei/hdf/sample目录
添加配置
HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。
HC-GEN**(HDF Configuration Generator)**是HCS配置转换工具,可以将HDF配置文件转换为软件可读取的文件格式:
在弱性能环境中,转换为配置树源码,驱动可直接调用C代码获取配置。
在高性能环境中,转换为HCB(HDF Configuration Binary)二进制文件,驱动可使用HDF框架提供的配置解析接口获取配置。
设备配置文件和驱动配置文件的路径定义在板级配置入口文件hdf.hcs(vendor\hisilicon\hispark_taurus\config\hdf.hcs)
1、在HDF框架的驱动配置文件(例如device\hisilicon\hispark_taurus\sdk_liteos\config\uart\uart_config.hcs)中添加该驱动的配置信息,如下所示:
2、在HDF框架的设备配置文件(例如vendor\hisilicon\hispark_taurus\config\device_info\device_info.hcs)中添加该驱动的设备节点信息,如下所示:
注册uart驱动入口
基于HDF框架注册UART驱动的入口HdfDriverEntry,代码如下:
注册uart驱动接口
HDF框架提供了UART驱动接口的模板方法UartHostMethod,实现UART驱动接口的代码如下:
uart驱动Makefile如下:
在device/hisilicon/drivers/lite.mk编译脚本中增加示例UART驱动模块,代码如下:
用户程序和驱动交互代码
UART驱动成功初始化后,会创建/dev/uartdev-5设备节点,通过设备节点与UART驱动交互的代码如下:
将应用程序编译进hello_uart_sample组件,应用的编译文件:(1)vendor/huawei/hdf/sample/platform/uart/BUILD.gn
(2)vendor/huawei/hdf/sample/platform/uart/dev/BUILD.gn:
在build/lite/components/drivers.json驱动配置中hdf_hi3516dv300_liteos_a组件下的targets中增加hello_uart_sample组件,代码如下:
修改单板配置文件(vendor/hisilicon/hispark_taurus/config.json),新增hdf_hi3516dv300_liteos_a组件的条目,如下所示代码片段为driver子系统配置
编译
如果Linux编译环境通过Docker方式安装,具体编译过程请参见Docker方式获取编译环境的编译操作。如果Linux编译环境通过软件包方式安装,请进入源码根目录,执行如下命令进行编译:
运行
烧录成功之后,可执行文件在bin目录下(/bin/hello_uart),运行:
这篇总结的很全面呀,学习了