HarmonyOS设备开发工程师课程三(驱动基础)

本文源于HarmonyOS官方教程https://developer.huawei.com/consumer/cn/training/course/introduction/C101635908637340943

如有侵权,联系helloc2333@163.com删除。

驱动基础

设备驱动介绍

驱动程序全称设备驱动程序,是添加到操作系统中的特殊程序,其中包含有关硬件设备的信息。

驱动程序能使计算机与相应的设备进行通信。

image-20211222203410876

设备驱动分类:

根据设备读写操作的特征差异,设备驱动大致上可以分为三类:

  • 字符设备:即“字节设备”,软件操作设备时,以字节为单位进行。
  • 块设备: 设备的块大小是设备本身设计时定义好的,软件无法更改。
  • 网络设备:网络设备是专为网卡设计的驱动模型,主要用于支持 API 中 socket 相关函数的工作。

image-20211222203655390


HDF驱动框架

HDF (Hardware Driver Foundation) 硬件驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制管理旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。

image-20211222205051058

HDF驱动模型图解:

image-20211222205355935

驱动框架能力-驱动加载:

  • 按需加载:HDF 框架定义了驱动按需加载方式的策略,是由配置文件中的 preload 字段来控制, preload 字段的取值范围以及含义如下:

image-20211222210251876

  • 按序加载:配置文件中的 priority (取值范围为整数 0 到 200 )是用来表示 host 和驱动的优先级。驱动的加载顺序,优先根据 host 的 priority 决定其次是同一个 host 内驱动的priority 值。

驱动框架能力-驱动服务管理:

  • 驱动服务是HDF驱动设备对外提供能力的对象,由HDF框架统一管理。
  • 驱动服务管理主要包含驱动服务的发布获取
  • HDF框架定义了驱动对外发布服务的策略,是由配置文件中的policy字段来控制,policy字段的取值范围以及含义如下:

image-20211222210904758


驱动框架能力-驱动消息机制管理

  • 使用场景

    当用户态应用和内核态驱动需要交互时,可以使用HDF框架的消息机制来实现。

    • 消息机制的功能主要有以下两种:

      • 用户态应用发送消息到驱动
      • 用户态应用接受驱动主动上报事件

      image-20211222212241678

驱动开发

基于HDF框架进行驱动的开发主要分为两个主要部分:驱动实现和驱动配置

image-20211222212454884

驱动业务代码

#define HDF_LOG_TAG "sample_driver" // 打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签
// 驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架
int32_t HdfSampleDriverBind(struct HdfDeviceObject *deviceObject){
    HDF_LOGD("Sample driver bind success");
    return 0;
}
// 驱动自身业务初始的接口
int32_t HdfSampleDriverInit(struct HdfDeviceObject *deviceObject){
    HDF_LOGD(“Sample driver Init success”);
    return 0;
}
// 驱动资源释放的接口
void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject){
    HDF_LOGD("Sample driver release success");
    return;
}

驱动入口注册

// 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量
struct HdfDriverEntry g_sampleDriverEntry = {
    .moduleVersion = 1,
    .moduleName = "sample_driver",
    .Bind = HdfSampleDriverBind,
    .Init = HdfSampleDriverInit,
    .Release = HdfSampleDriverRelease,
};
// 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。
HDF_INIT(g_sampleDriverEntry);

驱动编译

驱动代码的编译必须要使用 HDF 框架提供的 Makefile 模板进行编译:

include $(LITEOSTOPDIR)/../../drivers/adapter/lite/khdf/lite.mk #导入hdf预定义内容,必需
MODULE_NAME := #生成的结果文件
LOCAL_INCLUDE := #本驱动的头文件目录
LOCAL_SRCS :=
#本驱动的源代码文件
LOCAL_CFLAGS := #自定义的编译选项
include $(HDF_DRIVER) #导入模板makefile完成编译

编译结果文件链接到内核镜像,示例如下:

LITEOS_BASELIB += -lxxx #链接生成的静态库
LIB_SUBDIRS +=
#驱动代码Makefile的目录

驱动设备描述

HDF 框架加载驱动所需要的信息,来源于 HDF 框架定义的驱动设备描述,因此基于 HDF 框架开发的驱动必须要在 HDF 框架定义的 device_info.hcs 配置文件中添加对应的设备描述,驱动的设备描述填写如下所示:

host节点是用来存放某一类驱动的容器

sample_host :: host{
    hostName = "host0"; // host名称,host节点是用来存放某一类驱动的容器
    priority = 100;
    // host启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证host的加载顺序
    device_sample :: device {
    // sample设备节点
    device0 :: deviceNode {
    // sample驱动的DeviceNode节点
    policy = 1;
    // policy字段是驱动服务发布的策略
    priority = 100;
    // 驱动启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证device的加载顺序
    preload = 0;
    // 驱动按需加载字段
    permission = 0664;
    // 驱动创建设备节点权限
    moduleName = "sample_driver"; // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致
    serviceName = "sample_service"; // 驱动对外发布服务的名称,必须唯一
    deviceMatchAttr = "sample_config"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等

配置管理

HCS (HDF Configuration Source) 是 HDF 驱动框架的配置描述源码,内容以 Key-Value (键值对)为主要形式。配置代码与驱动代码解耦,便于配置管理。

HC-GEN (HDF Configuration Generator) 是 HCS 配置转换工具。

image-20211222222702757

驱动平台介绍

HarmonyOS 提供统一的驱动平台,用于实现串口控制、数据通信、时间控制、 CPU 复位、模数转换、脉冲宽度调制等功能。

image-20211222232753651

驱动平台 GPIO 简介

GPIO (General-purpose input/output) 即通用型输入输出。通俗地说, GPIO 口就是一些引脚,可以通过它们输出高低电平或者读入引脚的高低电平状态。 GPIO 控制器通过分组的方式管理所有GPIO 管脚,每组 GPIO 有一个或多个寄存器与之关联,通过读写寄存器完成对 GPIO 管脚的操作。

GPIO 是芯片上一根能完成多种功能的管脚,用户可以通过 GPIO 口和硬件进行数据交互(如UART )控制硬件工作(如 LED ,蜂鸣器等),读取硬件的工作状态信号(如中断信号)等

image-20211231105719250

image-20211231110435210

UART简介

UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输。

image-20211231111533070

image-20211231111622933

UART的所有接口仅限内核态使用,不支持在用户态使用。

image-20211231112222312

I2C简介

I2C (Inter Integrated Circuit) 集成电路间总线是由 Philips 公司开发的一种简单、双向二线制同步串行总线

I2C 以主从方式工作,通常有一个主设备和一个或者多个从设备,主从设备通过 SDA (SerialData) 串行数据线以及 SCL (SerialClock) 串行时钟线两根线相连。

image-20211231181435840

I2C通信时序

I2C 时序主要有四个元素组成:起始信号,终止信号,应答 (0) ,非应答 (1) 。

image-20211231181716315

I2C数据传输

I2C 数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。数据传输以字节为单位,高位在前,逐个 bit 进行传输

image-20211231182810998

SPI简介

SPI 是串行外设接口 (Serial Peripheral Interface) 的缩写,是一种高速的,全双工,同步的通信总线

SPI 是由 Motorola 公司开发,用于在主设备和从设备之间进行通信,常用于与闪存、实时时钟、传感器以及模数转换器等进行通信。

一个主设备和两个从设备的连接示意图所示,从设备 A 和从设备 B 共享主设备的 SCLK 、 MISO 和 MOSI 三根引脚,从设备 A 的片选 CS0 连接主设备的 CS0 ,从设备 B 的片选 CS1 连接主设备的 CS1 。

image-20211231183142051

SDIO简介

SDIO 是安全数字输入输出接口 (Secure Digital Input and Output) 的缩写,是从 SD 内存卡接口的基础上演化出来的一种外设接口。 SDIO 接口兼容以前的 SD 内存卡,并且可以连接支持 SDIO 接口的设备。

SDIO 常用于移动端设备例如手机的外设开发,使得设备外接外设更加容易,常见的 SDIO 外设有 WLAN 设备、 GPS 、 CAMERA 、蓝牙。

image-20211231183254741

RTC简介

RTC(real-time clock) 为操作系统中的实时时钟设备,为操作系统提供精准的实时时间和定时报警功能。当设备下电后,通过外置电池供电, RTC 继续记录操作系统时间;设备上电后, RTC 提供实时时钟给操作系统,确保断电后系统时间的连续性。

以 STM32F103 芯片为例,其内部有独立供电的实时时钟和单独的振荡电路,无需外接时钟芯片。

WATCHDOG

看门狗 (watchdog) ,又叫看门狗计时器 (watchdog timer) ,是一种硬件的计时设备,当系统的主程序发生某些错误时,导致未及时清除看门狗计时器的计时值,这时看门狗计时器就会对系统发出复位信号,使系统从悬停状态恢复到正常运作状态。

看门狗可以看成是一种特殊的定时器,只不过定时时间到了之后不只是产生中断,还可以复位 CPU

image-20211231183519086

ADC

ADC (Analog to Digital Converter) 模数转换器。现实生活中的所有属性(如温度、湿度、光照强度等)都是连续的,即为模拟信号;而单片机或电子计算机所能识别的信号都是离散的数字信号。此时,若是需要使用现实世界中的各种属性,就需要一种设备将模拟信号转换为数字信号,它就是模数转换器。

模数转换一般要经过采样、量化和编码这几个步骤。

PWM

PWM (Pulse Width Modulation) 又叫脉冲宽度调制,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化。占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是 50% 。

image-20211231183819144

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信