鸿蒙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
<think>首先,用户的问题是基于之前的引用内容:“我想了解鸿蒙系统中LCD驱动与上层进行交互的方法”,并询问“请问鸿蒙系统LCD驱动与上层交互的方法”。 从系统指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 引用内容涉及鸿蒙系统中的驱动模型,特别是LCD驱动,提到了DSI(Display Serial Interface)和鸿蒙驱动架构。 关键引用: - 引用[1]:外设驱动模型,提供标准化的器件驱动驱动模型抽象。 - 引用[3]:详细描述了鸿蒙驱动架构,包括HDI层、HDF驱动框架、平台驱动等。 - 引用[4]:DSI的定义,用于显示设备的串行接口。 - 引用[5]:鸿蒙OpenHarmony平台驱动开发之MIPI DSI,描述了设备信息配置。 用户聚焦在LCD驱动与上层交互的方法。在鸿蒙系统中,这涉及HarmonyOS南向驱动开发,特别是显示驱动。 从引用[3]: - HDF驱动框架:提供统一的硬件资源管理、驱动加载管理等。 - HDI层(Hardware Device Interface):为系统提供统一、稳定的硬件设备操作接口。 - 平台驱动:为外设驱动提供Board硬件操作统一接口。 - 外设驱动模型:标准化器件驱动。 具体到LCD驱动,引用[4]和[5]提到DSI接口,是LCD常用的接口。 所以,LCD驱动与上层交互的方法可能通过: - HDI层:定义了统一的接口,上层应用通过调用HDI接口来控制硬件。 - HDF驱动框架:管理驱动的加载和服务发布。 - 在DSI驱动中,引用[5]提到serviceName是"HDF_MIPI_TX",表示驱动对外发布服务的名称。 交互流程: 1. 上层应用(如UI框架)调用统一的HDI接口来操作显示设备。 2. HDI接口被实现为驱动服务,由HDF框架管理。 3. LCD驱动(如基于DSI的驱动)实现这些接口,并通过配置信息(如HCS文件)部署。 4. 驱动使用平台驱动提供的接口来访问具体硬件资源。 在回答中,我需要结构化回答: - 逐步解释交互方法。 - 使用中文。 - 自然地添加引用标识。 - 最后生成相关问题。 回答结构: 1. 引入鸿蒙系统驱动交互的总体框架。 2. 具体描述LCD驱动与上层的交互机制。 3. 引用相关部分。 4. 结束时生成相关问题。 生成相关问题:基于用户查询,生成3-5个相关问题。 相关问题示例(从系统指令示例): - 如何配置鸿蒙系统中的LCD驱动? - LCD驱动开发中需要注意什么? - 鸿蒙系统如何处理显示设备的电源管理? 确保回答真实可靠,基于提供的信息。 </think>### 鸿蒙系统LCD驱动与上层交互的方法 在鸿蒙系统OpenHarmony)中,LCD驱动与上层的交互主要通过标准化的驱动框架和接口实现,确保高效、通用和易于开发。核心机制基于HarmonyOS的硬件设备统一接口(HDI)和硬件驱动框架(HDF)。下面我将逐步解释交互过程,确保结构清晰易懂。 #### 1. **总体框架:HDF驱动架构** - 鸿蒙系统驱动模型采用统一的HDF(Hardware Driver Foundation)框架,它将驱动分为多层,屏蔽硬件差异,简化上层交互。 - **关键组件**: - **HDI层(Hardware Device Interface)**:提供标准化的设备操作接口(如显示控制命令)。上层应用(如UI框架或图形子系统)通过调用这些接口来读写数据或控制设备,无需直接访问底层硬件[^3]。 - **HDF驱动框架**:负责驱动的加载、服务管理和资源分配。例如,LCD驱动作为外设驱动,由HDF框架加载并注册为服务,上层可通过服务名称访问[^3]。 - **平台驱动**:为LCD驱动提供硬件资源抽象(如I2C/SPI/UART总线操作),确保驱动代码独立于具体硬件平台,便于迁移[^3]。 - **外设驱动模型**:针对LCD等设备,提供标准化的驱动抽象(如MIPI DSI接口模型),开发者通过配置文件(如HCS文件)部署驱动,避免重复开发[^1][^3]。 #### 2. **LCD驱动与上层的交互流程** LCD驱动(如基于MIPI DSI的显示驱动)与上层交互的核心是“接口调用-服务响应”机制。以下是典型步骤: 1. **上层调用HDI接口**: - 上层应用(如图形渲染引擎)通过HarmonyOS提供的HDI接口发送命令。 - 例如,调用显示控制接口发送像素数据或指令(如设置分辨率、刷新屏幕)。接口格式统一,如 `DisplayService::SetBuffer()`,确保跨设备兼容性[^3][^4]。 2. **驱动服务响应**: - LCD驱动在HDF框架中注册为服务(如DSI驱动的服务名称为 `HDF_MIPI_TX`)。 - 当上层调用HDI接口时,HDF框架路由请求到对应的驱动服务。驱动服务解析命令,并通过平台驱动接口操作硬件资源(如DSI总线发送序列化数据)[^5]。 - 驱动采用事件驱动模型,支持异步通知。例如,显示状态变化(如屏幕旋转)时,驱动通过回调通知上层[^3]。 3. **数据传输机制**: - 对于显示数据,使用MIPI DSI协议(Display Serial Interface)。数据以串行方式传输: $$ \text{像素数据} \xrightarrow{\text{DSI序列化}} \text{外设设备(LCD)} $$ DSI协议定义了主机(上层)与LCD设备的通信规范,包括像素读取、写入和状态查询,降低交互延迟[^4]。 - 驱动通过OSAL(Operating System Abstraction Layer)抽象内存、线程等操作,确保高效数据传输,避免资源冲突[^3]。 4. **配置驱动的部署**: - 开发者使用HCS(HDF Configuration Source)文件描述驱动配置(如设备信息、策略)。例如: ```hcs device_info { policy = 0; // 服务发布策略(0表示无需发布服务) priority = 150; // 启动优先级 permission = 0664; // 设备节点权限 serviceName = "HDF_MIPI_TX"; // 服务名称,上层通过此访问 } ``` 配置后,HDF框架自动加载驱动,实现“开发即部署”,上层无需关心底层细节[^5][^3]。 #### 3. **优势与关键点** - **标准化与通用性**:HDI层和HDF框架确保LCD驱动与上层解耦,支持多种显示设备(如LCD、OLED),提升系统可移植性[^1][^3]。 - **性能优化**:DSI协议减少数据传输开销,HDF框架管理电源状态(如屏幕休眠),优化资源使用[^4][^3]。 - **安全隔离**:权限控制(如permission=0664)防止未授权访问,确保交互安全[^5]。 总之,鸿蒙系统通过HDI统一接口和HDF框架,实现了LCD驱动的“上层调用-驱动服务响应”机制。开发者只需配置HCS文件,即可部署驱动,而上层应用通过标准接口操作设备,显著简化开发流程[^1][^3][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值