OpenHarmony——基于HDF驱动框架构建的Display驱动模型

news2024/9/29 21:30:07

概述

功能简介

LCD(Liquid Crystal Display)驱动编程,通过对显示器上电、初始化显示器驱动IC(Integrated Circuit)内部寄存器等操作,使其可以正常工作。

基于HDF(Hardware Driver Foundation)驱动框架构建的Display驱动模型作用如下:

  • 为LCD器件驱动开发提供了基础驱动框架,提升驱动开发效率。

  • 便于开发的器件驱动实现跨OS、跨芯片平台迁移。

基于HDF驱动框架的Display驱动模型如下所示:

图1 基于HDF驱动框架的Display驱动模型

Display驱动模型主要由平台驱动层、芯片平台适配层、LCD器件驱动层三部分组成。驱动模型基于HDF驱动框架开发,通过Platform层和OSAL层提供的接口,屏蔽内核形态的差异,使得器件驱动可以便利的迁移到不同OS及芯片平台。模型向上对接Display公共HAL层,支撑HDI(Hardware Device Interface)接口的实现,通过Display-HDI对图形服务提供各类驱动能力接口。

  • Display平台驱动层:通过HDF提供的IOService数据通道,与公共HAL层对接,集中接收并处理各类上层调用指令。

  • SoC平台驱动适配层:借助此SoC适配层,实现Display驱动和SoC侧驱动解耦,主要完成芯片平台相关的参数配置,并传递平台驱动层的调用到器件驱动层。

  • LCD器件驱动层:在器件驱动层中,主要实现和器件自身强相关的驱动适配接口,例如发送初始化序列、上下电、背光设置等。

基于Display驱动模型开发LCD驱动,可以借助平台提供的各种能力及接口,较大程度的降低器件驱动的开发周期和难度,提升开发效率。

基本概念

LCD接口通常可分为MIPI DSI接口、TTL接口和LVDS接口,常用的是MIPI DSI接口和TTL接口,下面对常用的MIPI DSI接口和TTL接口作简要介绍。

  • MIPI DSI接口

  • 图2 MIPI DSI接口

添加图片注释,不超过 140 字(可选)

  • MIPI DSI接口是MIPI(Mobile Industry Processor Interface)联盟定义的显示接口,主要用于移动终端显示屏接口,接口数据传输遵循MIPI协议,MIPI DSI接口为数据接口,传输图像数据,通常情况下MIPI DSI接口的控制信息以MIPI包形式通过MIPI DSI接口发送到对端IC,不需要额外的外设接口。

  • TTL接口

  • 图3 TTL接口

添加图片注释,不超过 140 字(可选)

  • ​TTL(Transistor Transistor Logic)即晶体管-晶体管逻辑,TTL电平信号由TTL器件产生,TTL器件是数字集成电路的一大门类,它采用双极型工艺制造,具有高速度、低功耗和品种多等特点。

  • TTL接口是并行方式传输数据的接口,有数据信号、时钟信号和控制信号(行同步、帧同步、数据有效信号等),在控制信号控制下完成数据传输。通常TTL接口的LCD,内部寄存器读写需要额外的外设接口,比如SPI接口、I2C接口等。

约束与限制

开发者在进行LCD驱动编程过程中,除了要关注IC的型号,还要关注LCD外围电路设计、基带芯片的LCD接口单元、背光IC的控制等多个方面,同时包括软件的上层程序。这些都是影响开发者在调试LCD驱动的影响因素。

开发指导

场景介绍

LCD驱动模型属于驱动基础适配模块,第三方需要适配OpenHarmony系统时,需要进行LCD驱动适配。LCD驱动适配基于HDF驱动框架、Platform接口及OSAL接口开发,可以做到不区分OS(LiteOS、Linux)和芯片平台(Hi35xx、Hi38xx、V3S等),为LCD器件提供统一的驱动模型。

接口说明

为了能够调整液晶显示屏的各项参数,与display建立显示通道,实现显示器的显示效果,LCD驱动需要通过display :: host注册PanelInfo结构体、接口信息,添加描述设备;LcdResetOn读取的pin脚信息,由SampleEntryInit初始化入口函数,并注册器件驱动接口,供平台驱动调用。

表1 LCD驱动适配所需接口

添加图片注释,不超过 140 字(可选)

开发步骤

  1. 添加LCD驱动相关的设备描述配置。

  2. 在SoC平台驱动适配层中适配对应的芯片平台驱动。

  3. 添加器件驱动,并在驱动入口函数Init中注册Panel驱动数据,驱动数据接口主要实现下述特性:

  4. LCD上下电

  5. 根据LCD硬件连接,使用Platform接口层提供的GPIO操作接口操作对应LCD管脚,例如复位管脚、IOVCC管脚,上电时序参考LCD供应商提供的SPEC。

  6. 发送初始化序列

  7. 根据LCD硬件接口,使用Platform接口层提供的I2C、SPI、MIPI等接口,下载LCD初始化序列,初始化参数序列可以参考LCD供应商提供的SPEC。

  8. (可选)根据需求实现HDF框架其他接口。

  9. (可选)根据需求使用HDF框架可创建其他设备节点,用于业务逻辑或者调试功能。

开发实例

以Hi35xx系列芯片为例,根据开发步骤所述,介绍LCD驱动的详细适配过程。

  1. 添加设备描述配置(vendor/bearpi/bearpi_hm_micro/hdf_config/device_info/device_info.hcs)

    /* Display驱动相关的设备描述配置 */
    display :: host {
        hostName = "display_host";
        /* Display平台驱动设备描述 */
        device_hdf_disp :: device {
            device0 :: deviceNode {
                policy = 2;
                priority = 200;
                permission = 0660;
                moduleName = "HDF_DISP";
                serviceName = "hdf_disp";
            }
        }
        /* SoC适配层驱动设备描述 */
        device_hi35xx_disp :: device {
            device0 :: deviceNode {
                policy = 0;
                priority = 199;
                moduleName = "HI351XX_DISP";
            }
        }
        /* LCD器件驱动设备描述 */
        device_lcd :: device {
            device0 :: deviceNode {
                policy = 0;
                priority = 100;
                preload = 0;
                moduleName = "LCD_Sample";
            }
            device1 :: deviceNode {
                policy = 0;
                priority = 100;
                preload = 2;
                moduleName = "LCD_SampleXX";
            }
        }
    }

    2.SoC平台驱动适配层中适配对应的芯片平台驱动(drivers/hdf_core/framework/model/display/driver/adapter_soc/hi35xx_disp.c)

    /* Display驱动适配MIPI等和芯片平台相关的配置 */
    static int32_t MipiDsiInit(struct PanelInfo *info)
    {
        int32_t ret;
        struct DevHandle *mipiHandle = NULL;
        struct MipiCfg cfg;
    
        mipiHandle = MipiDsiOpen(0);
        if (mipiHandle == NULL) {
            HDF_LOGE("%s: MipiDsiOpen failure", __func__);
            return HDF_FAILURE;
        }
        cfg.lane = info->mipi.lane;
        cfg.mode = info->mipi.mode;
        cfg.format = info->mipi.format;
        cfg.burstMode = info->mipi.burstMode;
        cfg.timing.xPixels = info->width;
        cfg.timing.hsaPixels = info->hsw;
        cfg.timing.hbpPixels = info->hbp;
        cfg.timing.hlinePixels = info->width + info->hbp + info->hfp + info->hsw;
        cfg.timing.vsaLines = info->vsw;
        cfg.timing.vbpLines = info->vbp;
        cfg.timing.vfpLines = info->vfp;
        cfg.timing.ylines = info->height;
        /* 0 : no care */
        cfg.timing.edpiCmdSize = 0;
        cfg.pixelClk = CalcPixelClk(info);
        cfg.phyDataRate = CalcDataRate(info);
        /* config mipi device */
        ret = MipiDsiSetCfg(mipiHandle, &cfg);
        if (ret != HDF_SUCCESS) {
            HDF_LOGE("%s:MipiDsiSetCfg failure", __func__);
        }
        MipiDsiClose(mipiHandle);
        HDF_LOGI("%s:pixelClk = %d, phyDataRate = %d\n", __func__,
            cfg.pixelClk, cfg.phyDataRate);
        return ret;
    }

    3.添加器件

  2. 驱动定义相关接口信息(drivers/hdf_core/framework/model/display/driver/panel/mipi_icn9700.c)
    #define RESET_GPIO                5
    #define MIPI_DSI0                 0
    #define BLK_PWM1                  1
    #define PWM_MAX_PERIOD            100000
    /* backlight setting */
    #define MIN_LEVEL                 0
    #define MAX_LEVEL                 255
    #define DEFAULT_LEVEL             100
    #define WIDTH                     480
    #define HEIGHT                    960
    #define HORIZONTAL_BACK_PORCH     20
    #define HORIZONTAL_FRONT_PORCH    20
    #define HORIZONTAL_SYNC_WIDTH     10
    #define VERTICAL_BACK_PORCH       14
    #define VERTICAL_FRONT_PORCH      16
    #define VERTICAL_SYNC_WIDTH       2
    #define FRAME_RATE                60

    定义PanelInfo结构体(drivers/hdf_core/framework/model/display/driver/hdf_disp.h)

    struct PanelInfo {
        uint32_t width;
        uint32_t height;
        uint32_t hbp;
        uint32_t hfp;
        uint32_t hsw;
        uint32_t vbp;
        uint32_t vfp;
        uint32_t vsw;
        uint32_t frameRate;
        enum LcdIntfType intfType;
        enum IntfSync intfSync;
        struct MipiDsiDesc mipi;
        struct BlkDesc blk;
        struct PwmCfg pwm;
    };

    初始化LCD屏(drivers/hdf_core/framework/model/display/driver/panel/mipi_icn9700.c)

    static uint8_t g_payLoad0[] = { 0xF0, 0x5A, 0x5A };
    static uint8_t g_payLoad1[] = { 0xF1, 0xA5, 0xA5 };
    static uint8_t g_payLoad2[] = { 0xB3, 0x03, 0x03, 0x03, 0x07, 0x05, 0x0D, 0x0F, 0x11, 0x13, 0x09, 0x0B };
    static uint8_t g_payLoad3[] = { 0xB4, 0x03, 0x03, 0x03, 0x06, 0x04, 0x0C, 0x0E, 0x10, 0x12, 0x08, 0x0A };
    static uint8_t g_payLoad4[] = { 0xB0, 0x54, 0x32, 0x23, 0x45, 0x44, 0x44, 0x44, 0x44, 0x60, 0x00, 0x60, 0x1C };
    static uint8_t g_payLoad5[] = { 0xB1, 0x32, 0x84, 0x02, 0x87, 0x12, 0x00, 0x50, 0x1C };
    static uint8_t g_payLoad6[] = { 0xB2, 0x73, 0x09, 0x08 };
    static uint8_t g_payLoad7[] = { 0xB6, 0x5C, 0x5C, 0x05 };
    static uint8_t g_payLoad8[] = { 0xB8, 0x23, 0x41, 0x32, 0x30, 0x03 };
    static uint8_t g_payLoad9[] = { 0xBC, 0xD2, 0x0E, 0x63, 0x63, 0x5A, 0x32, 0x22, 0x14, 0x22, 0x03 };
    static uint8_t g_payLoad10[] = { 0xb7, 0x41 };
    static uint8_t g_payLoad11[] = { 0xC1, 0x0c, 0x10, 0x04, 0x0c, 0x10, 0x04 };
    static uint8_t g_payLoad12[] = { 0xC2, 0x10, 0xE0 };
    static uint8_t g_payLoad13[] = { 0xC3, 0x22, 0x11 };
    static uint8_t g_payLoad14[] = { 0xD0, 0x07, 0xFF };
    static uint8_t g_payLoad15[] = { 0xD2, 0x63, 0x0B, 0x08, 0x88 };
    static uint8_t g_payLoad16[] = { 0xC6, 0x08, 0x15, 0xFF, 0x10, 0x16, 0x80, 0x60 };
    static uint8_t g_payLoad17[] = { 0xc7, 0x04 };
    static uint8_t g_payLoad18[] = {
        0xC8, 0x7C, 0x50, 0x3B, 0x2C, 0x25, 0x16, 0x1C, 0x08, 0x27, 0x2B, 0x2F, 0x52, 0x43, 0x4C, 0x40,
        0x3D, 0x30, 0x1E, 0x06, 0x7C, 0x50, 0x3B, 0x2C, 0x25, 0x16, 0x1C, 0x08, 0x27, 0x2B, 0x2F, 0x52,
        0x43, 0x4C, 0x40, 0x3D, 0x30, 0x1E, 0x06
    };
    static uint8_t g_payLoad19[] = { 0x11 };
    static uint8_t g_payLoad20[] = { 0x29 };
    static DevHandle g_mipiHandle = NULL;
    static DevHandle g_pwmHandle = NULL;

    设置Reset Pin脚状态(/drivers_hdf_core/framework/model/display/driver/panel/mipi_icn9700.c)

    static int32_t LcdResetOn(void)
    {
        int32_t ret;
        ret = GpioSetDir(RESET_GPIO, GPIO_DIR_OUT);
        if (ret != HDF_SUCCESS) {
            HDF_LOGE("GpioSetDir failure, ret:%d", ret);
            return HDF_FAILURE;
        }
        ret = GpioWrite(RESET_GPIO, GPIO_VAL_HIGH);
        if (ret != HDF_SUCCESS) {
            HDF_LOGE("GpioWrite failure, ret:%d", ret);
            return HDF_FAILURE;
        }
        /* delay 20ms */
        OsalMSleep(20);
        return HDF_SUCCESS;
    }

    器件驱动入口函数(/drivers_hdf_core/framework/model/display/driver/panel/mipi_icn9700.c)

    int32_t SampleEntryInit(struct HdfDeviceObject *object)
    {
        HDF_LOGI("%s: enter", __func__);
        if (object == NULL) {
            HDF_LOGE("%s: param is null!", __func__);
            return HDF_FAILURE;
        }
        /* 器件驱动接口注册,ops提供给平台驱动调用 */
        if (PanelDataRegister(&g_panelData) != HDF_SUCCESS) {
            HDF_LOGE("%s: PanelDataRegister error!", __func__);
            return HDF_FAILURE;
        }
        return HDF_SUCCESS;
    }
    
    struct HdfDriverEntry g_sampleDevEntry = {
        .moduleVersion = 1,
        .moduleName = "LCD_SAMPLE",
        .Init = SampleEntryInit,
    };
    
    HDF_INIT(g_sampleDevEntry);

    想学习更多华为鸿蒙HarmonyOS开发知识,在这里我为大家准备了华为鸿蒙HarmonyOS开发者资料大全,大家可以自行点击链接领取:《做鸿蒙应用开发到底学习些啥?》

    其次就是考虑到市场上还没有系统性的学习资料,同时我也整理了一份《鸿蒙 (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. ……

    更多了解更多鸿蒙开发的相关知识可以参考:《鸿蒙开发学习指南》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用nginx+HTML2canvas将任意html网页转为png图片自定义张数

文章目录 概述网页的转换html2canvas的使用导入导入HTML2canvas库函数定义 nginx部署编写控制截图网页代码iframe 网页控制代码 测试说明 概述 本文简述如何使用nginxhtml2canvas将任意网页html转为png图片 网页的转换 如果是本地网页,直接进行nginx反向代理就行…

数据库SELECT语句

文章目录 一、检索数据二、排序检索三、过滤数据四、数据过滤4.1 组合WHERE子句1. AND操作符2. OR操作符3. 计算次序 4.2 IN操作符4.3 NOT操作符 五、用通配符过滤LIKE操作符1. 百分号(%)通配符2. 下划线(_)通配符 使用通配符的技…

若依在表格中如何将字典的键值转为中文

文章目录 一、需求:二、问题解决步骤1、给需要转换的列绑定formatter属性2、获取字典项3、编写formatter属性绑定的方法 一、需求: 后端有时候返回的是字典的键值,在前端展示时需要转成中文值 后端返回的是dictValue,现在要转换…

20240112-【UNITY 学习】实现第一人称移动教程

1、创建一个空物体,挂载Rigidbody组件,并设置相应参数 2、在上述空物体下创建一个胶囊体,两个空物体,一个用来控制朝向,另一个用来控制摄像机 3、给摄像机创建一个父物体,并挂载脚本MoveCamera_01.cs using…

【剪枝】【广度优先】【深度优先】488祖玛游戏

作者推荐 【动态规划】458:可怜的小猪 涉及知识点 剪枝 广度优先 深度优先 488祖玛游戏 在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 ‘R’、黄色 ‘Y’、蓝色 ‘B’、绿色 ‘G’ 或白色 ‘W’ 。你的手中也有一些…

flutter使用getx进行数据状态管理,实现页面响应式

无论是什么样的应用,都还是需要最基础的数据来支撑的,而且不同的页面之间可能需要共享数据状态,这就显得数据状态管理非常有必要了。因为我这里使用了get依赖库,所以就可以直接在项目中使用getx来管理状态,不想再使用别…

PDF-XChange Editor v10.2.0.384

软件介绍 PDF-XChange Editor,号称打开速度最快最强大的PDF编辑器/PDF阅读器,PDF-XChange专注于PDF文档的编辑,打开PDF文件速度快,软件小功能强大,可以自定义制作PDF电子文档,具有创建,查看&am…

2024年实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

基于Linux的Flappy bird游戏开发

项目介绍 主要是使用C语言实现,开启C项目之旅。 复习巩固C语言、培养做项目的思维。 功能: 按下空格键小鸟上升,不按下落; 显示小鸟需要穿过的管道; 小鸟自动向右飞行;(管道自动左移和创建&a…

1-Docker-基础

本文内容多处参考黑马程序员的公开资料,仅用来个人梳理,原资料地址:https://b11et3un53m.feishu.cn/wiki/MWQIw4Zvhil0I5ktPHwcoqZdnec Docker介绍 为什么要用Docker? 以Mysql安装为例,想要在Linux系统上安装Mysql&…

brpc: a little source code

之前在https://www.yuque.com/treblez/qksu6c/nqe8ip59cwegl6rk?singleDoc# 《olap/clickhouse-编译器优化与向量化》中我谈过brpc的汇编控制bthread。本文就来看一下brpc作为一个高性能的rpc实现,除了自定义线程栈之外,代码还有什么优秀之处。 因为时间…

Windows11 安装MySQL8.0操作

一、从MySQL官网下载MySQL安装包 官网地址: www.mysql.com (1)首先 选择 DOWNLOADS 下载界面 (2)其次选择 MySQL 客户端 下载 (3)选择windows安装MySQL (4)选择MySQL类型…

【目标检测】YOLOv5算法实现(八):模型验证

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github,删减了源码中部分内容,满足个人科研需求。   本系列文章主要以YOLOv5为例完成算法的实现,后续修改、增加相关模…

【DevOps-08-3】Jenkins容器内部使用Docker

一、简要描述 构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可。 设置Jenkins容器使用宿主机Docker。 二、配置和操作步骤 1、修改宿主机docker.sock权限 # 修改docker.sock 用户和用户组都为root $ …

如何配置Kafka账号密码

背景 我们需要与第三方系统进行数据同步,需要搭建公网Kafka,Kafka默认是没有用户密码校验的,所以我们需要配置用户名密码校验。 配置 新增JAAS配置文件 在conf目录下新增kafka_server_jaas.conf文件,文件内容如下:…

高压消防泵:科技与安全性的完美结合

在现代社会,随着科技的不断发展,各种高科技设备层出不穷,为我们的生活带来了极大的便利。在森林火灾扑救领域,恒峰智慧科技研发的高压消防泵作为一种高效、节能、绿色、环保的优质设备,将科技与安全性完美地结合在一起…

最强联网Chat GPT 火爆全网高速 永久免费

🔴高速联网 秒响应支持语音通话🎈 首先介绍一下她的功能吧😁 女友消息代回机👌🏻 朋友圈文案👌🏻 聊天话术👌🏻 高情商回复👌🏻 脱单助…

Windows使用(版本8.11)ElasticSearch、elasticsearch-head、kibana

下载安装引用这篇文章 目录 1、ES基本知识核心术语核心概念倒排索引ES字典树ES怎么保证读写一致 2、Window启动ES步骤elasticsearch-8.11.3elasticsearch-head-masterkibana-8.11.3 3、Kibana 调用ES API示例 1、ES基本知识 核心术语 ● 索引:index (相…

持续构建行业影响力|HarmonyOS SDK荣膺年度“技术卓越”奖项

自2023年9月华为宣布鸿蒙原生应用全面启动以来,HarmonyOS SDK通过将HarmonyOS系统级能力对外开放,支撑开发者高效打造更纯净、更智能、更精致、更易用的鸿蒙原生应用,和开发者共同成长。 通过在开发者社区和HarmonyOS开发者持续的内容共创与技…

uniapp小程序超出一行显示...并展示更多按钮

注意:全部标签需要浮动在父盒子右边哦 循环获取所有需要展示数据标签的高度 this.goods this.goods.map(item > ({...item,showBtn: false}));this.$nextTick(() > {uni.createSelectorQuery().in(this).selectAll(".cart-info").boundingClientRect((data)…