鸿蒙OpenHarmony【平台驱动开发之UART】 子系统

UART

概述

功能简介

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

两个UART设备的连接示意图如下,UART与其他模块一般用2线(图1)或4线(图2)相连,它们分别是:

  • TX:发送数据端,和对端的RX相连。
  • RX:接收数据端,和对端的TX相连。
  • RTS:发送请求信号,用于指示本设备是否准备好,可接受数据,和对端CTS相连。
  • CTS:允许发送信号,用于判断是否可以向对端发送数据,和对端RTS相连。

图 1 2线UART设备连接示意图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2 4线UART设备连接示意图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UART通信之前,收发双方需要约定好一些参数:波特率、数据格式(起始位、数据位、校验位、停止位)等。通信过程中,UART通过TX发送给对端数据,通过RX接收对端发送的数据。当UART接收缓存达到预定的门限值时,RTS变为不可发送数据,对端的CTS检测到不可发送数据,则停止发送数据。

基本概念

  • 异步通信

    异步通信中,数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。异步通信以一个字符为传输单位,通信中两个字符间的时间间隔是不固定的,然而在同一个字符中的两个相邻位代码间的时间间隔是固定的。

  • 全双工传输(Full Duplex)

    此通信模式允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工可以同时进行信号的双向传输。

运作机制

在HDF框架中,UART接口适配模式采用独立服务模式(如图3所示)。在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDF设备管理器的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。

独立服务模式下,核心层不会统一发布一个服务供上层使用,因此这种模式下驱动要为每个控制器发布一个服务,具体表现为:

  • 驱动适配者需要实现HdfDriverEntry的Bind钩子函数以绑定服务。
  • device_info.hcs文件中deviceNode的policy字段为1或2,不能为0。

UART模块各分层作用:

  • 接口层提供打开UART设备、UART设备读取指定长度数据、UART设备写入指定长度数据、设置UART设备波特率、获取设UART设备波特率、设置UART设备属性、获取UART设备波特率、设置UART设备传输模式、关闭UART设备的接口。
  • 核心层主要提供UART控制器的创建、移除以及管理的能力,通过钩子函数与适配层交互。
  • 适配层主要是将钩子函数的功能实例化,实现具体的功能。

图 3 UART独立服务模式结构图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

开发指导

场景介绍

UART模块应用比较广泛,主要用于实现设备之间的低速串行通信,例如输出打印信息,当然也可以外接各种模块,如GPS、蓝牙等。当驱动开发者需要将UART设备适配到OpenHarmony时,需要进行UART驱动适配。下文将介绍如何进行UART驱动适配。

接口说明

为了保证上层在调用UART接口时能够正确的操作UART控制器,核心层在//drivers/hdf_core/framework/support/platform/include/uart/uart_core.h中定义了以下钩子函数,驱动适配者需要在适配层实现这些函数的具体功能,并与钩子函数挂接,从而完成适配层与核心层的交互。

UartHostMethod定义:

struct UartHostMethod {
    int32_t (*Init)(struct UartHost *host);
    int32_t (*Deinit)(struct UartHost *host);
    int32_t (*Read)(struct UartHost *host, uint8_t *data, uint32_t size);
    int32_t (*Write)(struct UartHost *host, uint8_t *data, uint32_t size);
    int32_t (*GetBaud)(struct UartHost *host, uint32_t *baudRate);
    int32_t (*SetBaud)(struct UartHost *host, uint32_t baudRate);
    int32_t (*GetAttribute)(struct UartHost *host, struct UartAttribute *attribute);
    int32_t (*SetAttribute)(struct UartHost *host, struct UartAttribute *attribute);
    int32_t (*SetTransMode)(struct UartHost *host, enum UartTransMode mode);
    int32_t (*pollEvent)(struct UartHost *host, void *filep, void *table);
};

表 1 UartHostMethod结构体成员的回调函数功能说明

函数 入参 出参 返回值 功能
Init host:结构体指针,核心层UART控制器 HDF_STATUS相关状态 初始化Uart设备
Deinit host:结构体指针,核心层UART控制器 HDF_STATUS相关状态 去初始化Uart设备
Read host:结构体指针,核心层UART控制器 size:uint32_t类型,接收数据大小 data:uint8_t类型指针,接收的数据 HDF_STATUS相关状态 接收数据RX
Write host:结构体指针,核心层UART控制器 data:uint8_t类型指针,传入数据 size:uint32_t类型,发送数据大小 HDF_STATUS相关状态 发送数据TX
### 鸿蒙南向开发的定义 鸿蒙南向开发指的是在 **OpenHarmony** 系统中,面向硬件底层、操作系统内核及驱动层的开发工作。其主要目标是实现对不同硬件平台的支持,包括芯片适配、设备驱动开发、系统启动流程优化等[^4]。这种类型的开发通常涉及与硬件直接交互的部分,如外设接口(GPIO、I2C、SPI)、内核调度机制、内存管理、以及系统的可维护性设计等。 ### 技术栈 鸿蒙南向开发的技术栈涵盖了多个关键模块和子系统: - **内核子系统 (kernel)**:负责任务调度、进程管理、内存管理等核心功能[^4]。 - **启动恢复子系统 (startup)**:处理从内核启动到应用启动之间的初始化过程,确保系统稳定启动[^4]。 - **IoT外设子系统 (iothardware)**:提供对硬件外设的通用接口支持,例如 GPIO、I2C、SPI、UART 等通信协议[^4]。 - **可维可测子系统 (hiviewdfx)**:为开发者提供日志记录、性能分析、调试追踪等功能,提升系统稳定性与可维护性。 - **分布式调度子系统 (distributed_schedule)**:虽然更偏向于北向开发,但其底层实现也涉及南向部分,用于跨设备部件管理与资源调度。 - **安全子系统 (security)**:涉及底层加密算法、权限控制、设备认证等安全机制的实现。 - **公共基础库子系统 (utils)**:提供底层 C/C++ API 增强库,供其他子系统调用,提高代码复用性与效率[^4]。 - **升级子系统 (update)**:实现 OTA 升级机制,确保设备可以远程更新固件或系统版本。 此外,鸿蒙南向开发还需要掌握以下技能: - **嵌入式开发经验**:熟悉 ARM 架构、RTOS 或 Linux 内核裁剪与移植。 - **驱动开发能力**:能够编写和调试设备驱动程序,如传感器、显示屏、音频编解码器等。 - **编译工具链知识**:了解交叉编译环境配置、Makefile 编写、构建系统(如 GN/Ninja)等。 - **调试工具使用**:熟练使用 JTAG、GDB、Tracealyzer 等调试工具进行问题定位与优化。 ### 应用场景 鸿蒙南向开发主要应用于以下领域: - **IoT 设备开发**:如智能家居设备(智能灯泡、温湿度传感器)、穿戴设备(手环、手表)、工业自动化设备等,需将 OpenHarmony 移植至特定硬件平台并实现外设控制[^3]。 - **边缘计算节点**:适用于需要本地化数据处理与决策的边缘设备,如智能摄像头、工业网关等,南向开发为其提供低延迟、高可靠性的底层支持。 - **车载系统**:在汽车电子中,如车机系统、仪表盘、车载娱乐设备等,南向开发用于适配汽车专用芯片和接口(CAN、LIN 等)。 - **机器人控制系统**:涉及电机控制、传感器融合、实时响应等,南向开发为其提供稳定的硬件抽象层和驱动支持。 - **医疗设备**:如便携式心电图仪、血糖仪等,要求高精度的数据采集与实时处理,南向开发保障了这些功能的可靠性与安全性。 ```c // 示例:GPIO 控制 LED 灯的伪代码 #include "gpio.h" void led_init(void) { gpio_set_direction(LED_PIN, GPIO_DIR_OUTPUT); } void led_on(void) { gpio_set_value(LED_PIN, GPIO_LEVEL_HIGH); } void led_off(void) { gpio_set_value(LED_PIN, GPIO_LEVEL_LOW); } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值