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. ……

更多了解更多鸿蒙开发的相关知识可以参考:《做鸿蒙应用开发到底学习些啥?》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/310392.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QWebEngineView类中的load、seturl、setPage、setHtml和setContent方法的功能与用法对比

文章目录 📖 介绍 📖🏡 环境 🏡📒 对比 📒📝 load方法📝 setUrl方法📝 setPage方法📝 setHtml方法📝 setContent方法📖 介绍 📖 QWebEngineView 是 Qt 提供的一个用于呈现 Web 内容的类,基于 Google 的 Chromium 浏览器引擎。它提供了对现代 Web 标…

一小时掌握:使用ScrapySharp和C#打造新闻下载器

引言 爬虫技术是指通过编程的方式,自动从互联网上获取和处理数据的技术。爬虫技术有很多应用场景,比如搜索引擎、数据分析、舆情监测、电商比价等。爬虫技术也是一门有趣的技术,可以让你发现网络上的各种有价值的信息。 本文将介绍如何使用…

2024不容错过的好项目好商机,普通人翻身就靠它了,靠谱创业项目推荐

2024什么最容易挣钱?是火遍全网的单身经济?宠物经济?旅游业?大健康经济?都不是!他们确实挣钱,但都不是最容易的。 比如单身经济,卖东西你需要去结合需求去选品,开单身餐厅…

jsoncpp学习

1.环境配置 C 操作 (读写)json 文件及jsoncpp的配置-CSDN博客 一步步跟下来,就可以了!!! 2.遇到的问题: 读取json文件,出现中文乱码!!! 参考:C ifstream open 读取…

产品经理须知 | 电商API接口接入知识小结

应用程序接口API(Application Programming Interface),是提供特定业务输出能力、连接不同系统的一种约定。这里包括外部系统与提供服务的系统(中后台系统)或后台不同系统之间的交互点。包括外部接口、内部接口&#xf…

uni-app的学习【第二节】

四 路由配置及页面跳转 (1)路由配置 uni-app页面路由全部交给框架统一管理,需要在pages.json里配置每个路由页面的路径以及页面样式(类似小程序在app.json中配置页面路由) (2)路由跳转 uni-app有两种页面路由跳转方式:使用navigator组件跳转(标签式导航)、调用API跳…

JavaWeb- Tomcat

一、概念 老规矩,先看维基百科:Apache Tomcat (called "Tomcat" for short) is a free and open-source implementation of the Jakarta Servlet, Jakarta Expression Language, and WebSocket technologies.[2] It provides a "pure Ja…

能赚钱的GPT Store正式上线!如何将自己的 GPT 放到商店中?

等了两个月,OpenAI 的 GPT Store 今日凌晨终于上线!上线 GPT Store 的同时,OpenAI 同步了最新的 GPTs 数据:截止到1月11日,用户已创建300万的GPTs! GPTs 开发者可以通过 GPTs 来获利。OpenAI 将在今年第一季…

使用递归将list转换成tree

在产品研发时遇到这样一个问题,对于省市区县这类三级联动的数据,前端插件需要一次把数据全部返回,单纯的使用接口查询字节的没办法满足要求。 如果一次把数据全部返回,前端使用起来很麻烦需要一条一条的进行查找。 常规的使用方…

使用visio画图基础(更新中)

1、画基本图形:正方形长方形,直线虚线 1、在形状这里选中后出现基本形状界面,拖动即可 画直线、虚线修改直线的样式改为虚线即可。 2、在矩形中画网格 先画一个矩形,然后选中,按照箭头选择排列形状。设置3*3。 双击可…

ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式

ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式 前提docker环境已经安装好 如未安装,请参考博文https://blog.csdn.net/a554521655/article/details/134251763 文章目录 ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式安装emqx查看是否安装并启动成功登录前端查 安…

凸优化Convex Optimization期末复习重点和考试笔记(二)凸优化+对偶

接博客【凸优化Convex Optimization期末复习重点和考试笔记(一)凸集凸函数】 第三部分:凸优化 第四部分:对偶 几种典型的凸函数 以上就是凸优化和对偶函数部分,以及几种常见的凸函数。我们就考到这所以后面的没有整理…

进销存+小程序商城:实现批发零售企业的互联网转型与管理升级

在当今互联网高速发展的时代,越来越多的批发零售企业开始开始考虑转型。在这个行业中,企业要想取得更好的发展,就要积极地拥抱互联网。专属的订货商城小程序是企业转型的第一步。通过将进销存与订货商城一体化,企业可以更好地满足…

Java项目:117SpringBoot动漫论坛网站

博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 117SpringBoot动漫论坛网站 一、项目介绍 动漫论坛网站是由SpringBootMybatis开发的,旅游网站分为前台和后台,前台为用户浏览,后台进…

大小论文over,坐等毕业。写点ROS上建图与导航的心得,也不知道对错,欢迎讨论~(对,谨慎阅读,不存在误人子弟哈~.~)

大小论文总算是都搞定了,院审过了送外审了,生死有命富贵在天,希望外审专家大佬们高抬贵手o.O~ 我所理解的建图算法的移植,能不能运行起来,大框架上就是把一棵完整的坐标转换关系的TF树给整理“通顺”,TF&am…

springboot3(二、StreamAPI)

文章目录 一、StreamAPI1.介绍2.代码示例 二、基本用法1.创建流2.流并发3.流并发问题 三、流方法1.中间操作2.终止操作 一、StreamAPI StreamAPI这种函数式编程是声明式编程,声明式编程是一种编程范式,它着重于描述问题的"是什么"&#xff0c…

深入理解.NET框架中的CLR(公共语言运行时)

深入理解.NET框架中的CLR(公共语言运行时) 引言 .NET框架中的CLR(公共语言运行时)是.NET应用程序运行的核心。本文将继续探索CLR的核心功能,并详细介绍.NET程序启动时是如何自动加载关键的库和服务来提供这些功能的。…

初识QT。

文章目录 前言一、QWidget1、了解内容main文件中的基本内容。.pro项目文件的内容。mywidget.h文件内容。命名规范和快捷键Qt助手 2、button按钮3、对象树4、信号和槽5、自定义信号和槽函数拓展 6、Lambda表达式7、练习 二、QMainWindow1、菜单栏和菜单项2、工具栏3、状态栏4、铆…

适用于安防 音响 车载等产品中中的音频接口选型分析

在人工智能兴起之后,安防市场就成为了其全球最大的市场,也是成功落地的最主要场景之一。对于安防应用而言,智慧摄像头、智慧交通、智慧城市等概念的不断涌现,对于芯片产业催生出海量需求。今天,我将为大家梳理GLOBALCH…

启用Hyper-V的三种方法,总有一种适合你

想在Windows 10计算机上的虚拟机中安装并运行Linux或更早版本的Windows操作系统吗?你将很高兴知道,你不需要第三方虚拟化软件(如VirtualBox)来在Windows 10上安装和运行Linux和Windows。 Windows 10中的内置Hyper-V工具允许你创建…