OpenHarmony南向之LCD显示屏
OpenHarmony南向之LCD显示屏
概述
LCD(Liquid Crystal Display)驱动,通过对显示器上下电、初始化显示器驱动IC(Integrated Circuit)内部寄存器等操作,使其可以正常工作。
HDF Display驱动模型
LCD器件驱动是显示框架最底层的部分。
向上对接到 Display 公共 HAL 层,辅助 HDI 的实现。通过Display-HDI对图形服务提供各类驱动能力接口;
向下对接显示屏 panel 器件,驱动屏幕正常工作,自上而下打通显示全流程通路。
所以驱动LCD主要在于LCD panel器件驱动。
LCD接口通常可分为MIPI DSI接口、TTL接口和LVDS接口,这里以rk3568平台为例,是常见的mipi接口的显示屏
驱动主要分为2大部分:hcs配置和panel驱动
- vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs
- drivers/hdf_core/framework/model/display/driver/panel/
下面就这2大部分分别来简单分析下
hcs配置及流程
hcs配置
display :: host {hostName = "display_host";device_hdf_drm_panel :: device {device0 :: deviceNode {policy = 0;priority = 197;preload = 0;moduleName = "HDF_DRMPANEL";}}device_hdf_disp :: device {device0 :: deviceNode {policy = 2;priority = 196;permission = 0660;moduleName = "HDF_DISP";serviceName = "hdf_disp";}}device_lcd :: device {...device3 :: deviceNode {policy = 0;priority = 100;preload = 0;moduleName = "LCD_ILI9881_ST_5P5";}}device_pwm_bl :: device {device0 :: deviceNode {policy = 0;priority = 95;preload = 0;moduleName = "PWM_BL";deviceMatchAttr = "pwm_bl_dev";}}device_backlight :: device {device0 :: deviceNode {policy = 2;priority = 90;preload = 0;permission = 0660;moduleName = "HDF_BL";serviceName = "hdf_bl";}}
}
大致流程
从上面的hcs配置可以看出,这里使用的是 DRM Panel,根据 priority值,驱动加载的顺序依次为:
1:HDF_BL:
2:PWM_BL
3:LCD
4:HDF_DISP
5:HDF_DRMPANEL
这个顺序是跟驱动代码里面的逻辑是相匹配的,LCD驱动在init的时候会注册panel(RegisterPanel),然后在HDF_DISP驱动的init中会通过 GetPanelManager获取注册的panelManager, 并使用 panelManager来 DispManagerInit,HDF_DRMPANEL驱动在init的时候会通过 GetDispManager获取在前面初始化的 DispManager,并使用DRM框架的接口来init和add相应drm_panel,且将mipi接口联系起来,整个过程是环环相扣。
panel驱动
Panel驱动中最核心的主要是实现以下接口:
struct PanelData {struct HdfDeviceObject *object;int32_t (*init)(struct PanelData *panel); /*panel的软件初始化*/int32_t (*on)(struct PanelData *panel); /*主要控制上电*/int32_t (*off)(struct PanelData *panel); /*主要控制下电*/int32_t (*prepare)(struct PanelData *panel); /*亮屏硬件时序初始化, 通过MIPI DCS发送亮屏初始化序列*/int32_t (*unprepare)(struct PanelData *panel); /*灭屏硬件时序初始化, 通过MIPI DCS发送灭屏代码*/struct PanelInfo *info; /*Panel的一些参数。见下方*/enum PowerStatus powerStatus;struct PanelEsd *esd;struct BacklightDev *blDev;void *priv;
};
在驱动初始化接口中实例化后使用 RegisterPanel接口向display模型注册该panel驱动
以 ili9881_st_5p5MIPI显示屏驱动为例来看看大致的流程:
.../*获取panel节点,rk一般都使用的 simple panel*/panelNode = of_find_compatible_node(NULL, NULL, "simple-panel-dsi");if (panelNode == NULL) {HDF_LOGE("%s of_find_compatible_node fail", __func__);goto FAIL;}/*通过panel节点进一步获取mipi dsi的节点*/panel_dev->dsiDev = of_find_mipi_dsi_device_by_node(panelNode);if (panel_dev->dsiDev == NULL) {HDF_LOGE("%s of_find_mipi_dsi_device_by_node fail", __func__);goto FAIL;}/*获取power节点*/panel_dev->supply = devm_regulator_get(&panel_dev->dsiDev->dev, "power");if (panel_dev->supply == NULL) {HDF_LOGE("Get regulator fail");goto FAIL;}/*获取其他gpio控制节点,需根据硬件配置**/panel_dev->enable_gpio = devm_gpiod_get_optional(&panel_dev->dsiDev->dev, "enable", GPIOD_ASIS);if (IS_ERR(panel_dev->enable_gpio)) {HDF_LOGE("get enable_gpio fail");goto FAIL;}.../*初始化PanelData mipi_dsi_device结构体,下面会展开详细说明*/PanelResInit(panel_dev);.../*注册到Panel Manager*/if (RegisterPanel(&panel_dev->panel) != HDF_SUCCESS) {HDF_LOGE("RegisterPanel fail");goto FAIL;}...
PanelResInit函数主要是关键结构体(struct PanelData和 struct mipi_dsi_device )的实例化:
/*mipi dsi 的一些参数*/
panel_dev->dsiDev->lanes = 4; /* 4: dsi,lanes ,number of active data lanes */
panel_dev->dsiDev->format = MIPI_DSI_FMT_RGB888; // dsi,format pixel format for video mode MIPI_DSI_FMT_RGB888
panel_dev->dsiDev->mode_flags = (MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM \| MIPI_DSI_MODE_EOT_PACKET);panel_dev->panel.info = &g_panelInfo; /*Panel的一些参数。见下方*/
panel_dev->panel.init = PanelInit; /*panel的软件初始化,这里为空函数*/
panel_dev->panel.on = PanelOn; /*主要控制上电*/
panel_dev->panel.off = PanelOff; /*主要控制下电*/
panel_dev->panel.prepare = PanelPrepare; /*亮屏硬件时序初始化, 通过MIPI DCS发送亮屏初始化代码*/
panel_dev->panel.unprepare = PanelUnprepare; /*灭屏硬件时序初始化, 通过MIPI DCS发送灭屏代码*/
panel_dev->panel.priv = panel_dev->dsiDev;
这里,在v3.2版本的代码里,最终还是调用的是Linux下mipi dsi相关的接口,并没有使用OH实现的mipi的驱动接口
panel相关的硬件参数定义,这个主要跟显示屏硬件有关,这些参数的具体含义可参看:《做鸿蒙应用开发到底学习些啥?》
static struct PanelInfo g_panelInfo = {.width = 720, /* width */.height = 1280, /* height */.hbp = 40, /* horizontal back porch */.hfp = 40, /* horizontal front porch */.hsw = 10, /* horizontal sync width */.vbp = 15, /* vertical back porch */.vfp = 10, /* vertical front porch */.vsw = 36, /* vertical sync width */.clockFreq = 75000000, /* clock */.pWidth = 68, /* physical width */.pHeight = 121, /* physical height */.connectorType = DRM_MODE_CONNECTOR_DPI, /* DRM_MODE_CONNECTOR_DPI=17 */.blk = { BLK_PWM, MIN_LEVEL, MAX_LEVEL, DEFAULT_LEVEL },
};
总结
以上的内容主要简单介绍了OpenHarmony南向之LCD显示屏,没有具体到代码分析,移植等细节。
要想成为一名鸿蒙高级开发,以上知识点是必须要掌握的,除此之外,还需要掌握一些鸿蒙应用开发相关的一些技术,需要我们共同去探索。
为了节省大家一些查找的时间,这边联合几位行业大佬,为大家准备了一份《Open Harmony4.0&Next》的学习导图,从入门到进阶再到南北向开发实战的一整套完整体系,想要学习了解更多鸿蒙开发的相关知识可以借鉴:《做鸿蒙应用开发到底学习些啥?》
除了以上的知识内容,我还为大家整理了一份《鸿蒙 (Harmony OS)开发学习手册》都是整理成PDF文档方式,分享给大家参考学习:《鸿蒙开发学习指南》
《鸿蒙 (Harmony OS)开发学习手册》
一、入门必看
1. 应用开发导读(ArkTS)
2. 应用开发导读(Java)
3.......
二、HarmonyOS 概念
1. 系统定义
2. 技术架构
3. 技术特性
4. 系统安全
5......
三、如何快速入门?《鸿蒙基础入门开发宝典!》
1. 基本概念
2. 构建第一个ArkTS应用
3. 构建第一个JS应用
4. ……
四、开发基础知识
1. 应用基础知识
2. 配置文件
3. 应用数据管理
4. 应用安全管理
5. 应用隐私保护
6. 三方应用调用管控机制
7. 资源分类与访问
8. 学习ArkTS语言
9. ……
五、基于ArkTS 开发
1. Ability开发
2. UI开发
3. 公共事件与通知
4. 窗口管理
5. 媒体
6. 安全
7. 网络与链接
8. 电话服务
9. 数据管理
10. 后台任务(Background Task)管理
11. 设备管理
12. 设备使用信息统计
13. DFX
14. 国际化开发
15. 折叠屏系列
16. ……
更多了解更多鸿蒙开发的相关知识可以参考:《做鸿蒙应用开发到底学习些啥?》
相关文章:

OpenHarmony南向之LCD显示屏
OpenHarmony南向之LCD显示屏 概述 LCD(Liquid Crystal Display)驱动,通过对显示器上下电、初始化显示器驱动IC(Integrated Circuit)内部寄存器等操作,使其可以正常工作。 HDF Display驱动模型 LCD器件驱…...
核心笔记-短篇
接口管理平台:yapi 对象拷贝:Spring Bean 提供的 BeanUtils;hutool-core 提供的 BeanUtil 获得用户设备的信息:导入 UserAgentUtils 依赖;创建 UserAgent 对象使用 加密工具:DigestUtils,Spring Core 提供,静态方法:md5DigestAsHex(byte[]) 客户端编程工具包:HttpCli…...
系统学习Python——警告信息的控制模块warnings:为新版本的依赖关系更新代码
分类目录:《系统学习Python》总目录 在默认情况下,主要针对Python开发者(而不是Python应用程序的最终用户)的警告类别,会被忽略。 值得注意的是,这个“默认忽略”的列表包含DeprecationWarning(…...
爬虫的基本原理
基本原理 可以把网页与网页之间的链接关系比作节点中的连线,爬虫可以根据网页中的关系获取后续的网页,当整个网站涉及的页面全部被爬虫访问到后,网站的数据就被访问下来了。 1.爬虫概述 简单点讲,爬虫就是获取网页并提取和保存信…...

MySQL核心SQL
一.结构化查询语言 SQL是结构化查询语言(Structure Query Language),它是关系型数据库的通用语言。 SQL 主要可以划分为以下 3 个类别: DDL(Data Definition Languages)语句 数据定义语言,这…...

关于 setData 同步异步的问题
小程序官方文档中的回答解释: 所以大概意思就是: 1.setData在逻辑层的操作是同步,因此this.data中的相关数据会立即更新,比如下面的例子: const a 1 this.setData({b: a ? a : , }) console.log(that.data.b) // 1 2. setData在视图层的操作是异步,…...
Centos创建一个Python虚拟环境
在 CentOS 上创建一个 Python 虚拟环境,可以使用 virtualenv 工具。以下是创建和激活虚拟环境的基本步骤: 1.安装virtualenv 如果还没有安装 virtualenv,可以使用以下命令安装: sudo yum install python3-virtualenv请注意&…...

怎么使用好爬虫IP代理?爬虫代理IP有哪些使用技巧?
在互联网时代,爬虫技术被广泛应用于数据采集和处理。然而,在使用爬虫技术的过程中,经常会遇到IP被封禁的问题,这给数据采集工作带来了很大的困扰。因此,使用爬虫IP代理成为了解决这个问题的有效方法。本文将介绍如何使…...

C#,字符串匹配算法(模式搜索)Z算法的源代码与数据可视化
Z算法也是模式搜索(Pattern Search Algorithm)的常用算法。 本文代码的运算效果: 一、Z 算法 线性时间模式搜索算法的Z算法,在线性时间内查找文本中模式的所有出现。 假设文本长度为 n,模式长度为 m,那么…...

强化学习actor-critic
...

使用推测解码 (Speculative Decoding) 使 Whisper 实现 2 倍的推理加速
Open AI 推出的 Whisper 是一个通用语音转录模型,在各种基准和音频条件下都取得了非常棒的结果。最新的 large-v3 模型登顶了 OpenASR 排行榜,被评为最佳的开源英语语音转录模型。该模型在 Common Voice 15 数据集的 58 种语言中也展现出了强大的多语言性…...
pi gpio 内存映射
树霉pi gpio内存映射 #include <stdio.h> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> #include <stdlib.h>#define BCM2835_PERI_BASE 0x20000000 #define GPIO_BASE (BCM2835_PERI_BASE 0x200000) #define PAGE_SIZE…...

[NAND Flash 6.2] NAND 初始化常用命令:复位 (Reset) 和 Read ID 和 Read UID 操作和代码实现
依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 把下文中的字母和数字用`包起来, 中文不变。 全文 4400 字,主要内容 复位的目的和作用? NAND Reset 种类:FFh, FCh, FAh, FDh 区别 Reset 操作步骤 和…...

Multimodal Prototypical Networks for Few-shot Learning
tcGAN is provided with an embedding ϕ T \phi_T ϕT() of the textual description 辅助信息 作者未提供代码...

软件测试|Python requests库的安装和使用指南
简介 requests库是Python中一款流行的HTTP请求库,用于简化HTTP请求的发送和处理,也是我们在使用Python做接口自动化测试时,最常用的第三方库。本文将介绍如何安装和使用requests库,以及一些常见的用例示例。 安装requests库 首…...

HarmonyOS应用开发学习笔记 应用上下文Context 获取文件夹路径
1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器:定义组件重用样式 Extend装饰器:定义扩展组件样式 5、HarmonyOS 应用开发…...
http状态码对照表
状态码含义100客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。…...
金三银四-JVM核心知识高频面试题
又要快到一年一度的金三银四,开始复习啦~! 每天一点点。。 目录 一、JVM中的垃圾收集器有哪些,它们的工作原理是什么? 二、JVM中的类加载器有哪些,它们各自的作用是什么? 三、JVM中垃圾回收的…...

【GitHub项目推荐--谷歌大神又一开源代码调试神器】【转载】
如果调试是 Debug 的必经之路,那么编程应该将它考虑在内。今天我就和大家分享一个代码调试神器 - Cyberbrain。 Cyberbrain是一个免费开源的 Python 代码调试解决方案,它可视化程序执行以及每个变量的变化方式,让程序员免受调试之苦。主要具有…...
Ubuntu pip换源
在 Ubuntu 上使用 pip 更改软件包的下载源可以通过修改 pip.conf 文件来完成。 首先打开终端(Terminal)。 输入以下命令创建或编辑 pip.conf 文件: sudo nano /etc/pip.conf如果提示需要管理员密码,则输入密码并按 Enter 键确认。…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战
🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...
Python爬虫(四):PyQuery 框架
PyQuery 框架详解与对比 BeautifulSoup 第一部分:PyQuery 框架介绍 1. PyQuery 是什么? PyQuery 是一个 Python 的 HTML/XML 解析库,它采用了 jQuery 的语法风格,让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...
c++算法学习3——深度优先搜索
一、深度优先搜索的核心概念 DFS算法是一种通过递归或栈实现的"一条路走到底"的搜索策略,其核心思想是: 深度优先:从起点出发,选择一个方向探索到底,直到无路可走 回溯机制:遇到死路时返回最近…...
Kafka深度解析与原理剖析
文章目录 一、Kafka核心架构原理1. **分布式协调与选举**2. **ISR、OSR与HW机制**3. **高性能存储设计**4. **刷盘机制 (Flush)**5. **消息压缩算法**二、高可用与消息可靠性保障1. **数据高可用策略**2. **消息丢失场景与规避**3. **顺序消费保证**三、Kafka高频面试题精析1. …...