lvgl 双物理显示器的驱动实现

目录

  • 一、背景
    • 1. 要实现的功能
    • 2. lvgl 版本
  • 二、简单粗暴的方式
    • 理论上可以这样实现
    • 缺陷:
  • 三、lvgl 自身机制支持
    • 3.1 实现思路
    • 3.2 初始化缓冲区和注册显示驱动
      • 3.2.1 复制lv_port_disp → lv_port_disp_2
      • 3.2.2 修改 lv_port_disp_2 文件
      • 3.2.3 在应用层调用显示器2初始化程序
    • 3.3 如何切换显示器
      • 3.3.1 切换显示器的 API
      • 3.3.2 如何找到显示器指针
      • 3.3.3 接收显示器指针
        • 定义保存显示器1 指针的变量
        • 接收显示器1 指针
        • 提供 API 供上层访问
      • 3.3.4 另外一种返回显示器指针的实现方式
        • 返回显示器1指针
        • 返回显示器2 指针
      • 3.3.5 应用层切换显示器实现
        • 选择显示器1
        • 选择显示器2
  • 四、参考链接

一、背景

1. 要实现的功能

一个mcu 物理连接两块彩屏,使用一个lvgl内核实现对双显示器的显示驱动。

2. lvgl 版本

V8.3.x

二、简单粗暴的方式

理论上可以这样实现

  • 软件应用层将两款显示器虚拟成一整块显示器。显示器的宽度就是最宽那个显示器的宽度,显示的长度是显示器1 + 显示器2 的长度。
  • 在刷屏打点函数中(disp_flush),根据坐标进行判断,属于显示器1 范围的数据,写到物理显示器1;属于显示器2范围的数据,写到物理显示器2。

缺陷:

  • 可能存在边界数据处理异常问题;
  • 对lvgl 来说,屏幕宽度和高度是虚拟的。如果想实现参考屏幕本身对齐的功能,比较难实现。
  • 在软件编码实现UI时,需要将显示坐标转换成虚拟坐标。不够直观。例如要实现分别在两块显示器的(0,0) 坐标开始位置写数据。写显示器1时,可以写(0,0) 坐标;写显示2时,需要写(0,LCD_SCR1_Y_MAX);

三、lvgl 自身机制支持

3.1 实现思路

  • 为每一个显示器分配并初始化一个缓冲区;
  • 为每一个显示器注册显示驱动;
  • 每次更新显示内容前,先选中当前的显示器

3.2 初始化缓冲区和注册显示驱动

3.2.1 复制lv_port_disp → lv_port_disp_2

显示缓冲区初始化和显示器注册的处理部分都在 lv_port_disp.c 文件中;复制一份 lv_port_disp.clv_port_disp.h)文件,改名为 lv_port_disp_2.c ( lv_port_disp_2.h )负责显示器2的初始化。

3.2.2 修改 lv_port_disp_2 文件

  • 更正显示器2的x,y 坐标范围
  • 将每一个可能因此重定义的变量或函数重命名。例如
    • lv_port_disp_init → lv_port_disp_init_2

3.2.3 在应用层调用显示器2初始化程序

在调用 lv_port_disp_init() 后面,调用 lv_port_disp_init_2()

3.3 如何切换显示器

3.3.1 切换显示器的 API

完成上面步骤之后,就已经完成了显示器缓冲区分配,显示驱动注册。

通过阅读官方帮助文档,我们知道 lv_disp_set_default(disp) 用来切换当前的默认显示器。

void lv_disp_set_default(lv_disp_t * disp)
{disp_def = disp;
}

参数 disp 就是要设置的显示器指针。

3.3.2 如何找到显示器指针

大致看了一遍相关的源码文件,没看到直接返回显示器1显示器2的相关接口函数。重新研究了一遍注册显示器的过程,发现 lv_disp_drv_register 注册显示驱动函数,会返回当前注册的显示器指针。这个函数在lv_port_disp.c 文件中调用。

由于默认只有一个显示器,所以默认也没接收这个函数的返回值,记录为当前显示器指针。

lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver)

3.3.3 接收显示器指针

以显示器1 为例说明。以下代码都是在 lv_port_disp.c 文件中实现。

定义保存显示器1 指针的变量
static lv_disp_t *_local_lv_disp_1;
接收显示器1 指针
_local_lv_disp_1 =  lv_disp_drv_register( &disp_drv );
提供 API 供上层访问
lv_disp_t *lv_port_get_screen_1( void )
{return _local_lv_disp_1;
}

3.3.4 另外一种返回显示器指针的实现方式

查看lv_disp_drv_register 函数,发现函数的第一行实现如下:

lv_disp_t * disp = _lv_ll_ins_head(&LV_GC_ROOT(_lv_disp_ll));

插入一个 接节点到列表LV_GC_ROOT(_lv_disp_ll) 的头部,并返回新插入的节点的指针。列表 LV_GC_ROOT(_lv_disp_ll) 就是物理显示器列表。

那么,我们遍历整个 LV_GC_ROOT(_lv_disp_ll) 列表,就能依次返回物理显示器的指针。由于应用层先注册显示器1,所以显示器1的指针位于队列尾。

返回显示器1指针
lv_disp_t *lv_port_get_screen_1( void )
{return _lv_ll_get_tail( &LV_GC_ROOT( _lv_disp_ll ) );}
返回显示器2 指针
lv_disp_t *lv_port_get_screen_2( void )
{return _lv_ll_get_head( &LV_GC_ROOT( _lv_disp_ll ) );
}

3.3.5 应用层切换显示器实现

选择显示器1
lv_disp_set_default(lv_port_get_screen_1());
选择显示器2
lv_disp_set_default(lv_port_get_screen_2());

四、参考链接

  • LVGL Displays :https://docs.lvgl.io/8.3/overview/display.html

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

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

相关文章

什么是SLAM中的回环检测,如果没有回环检测会怎样

目录 什么是回环检测 如果没有回环检测 SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)是一种使机器人或自动驾驶汽车能够在未知环境中建立地图的同时定位自身位置的技术。回环检测(Loop Closure Detectio…

快速入门学习定时任务框架-xxljob

定时任务框架-xxljob 简介 主要用于分布式任务调度,可以将任务调度和执行分布在多个节点上。它提供了一个集中式的管理平台,支持动态添加、修改、删除任务,以及任务的分片执行,确保任务在分布式环境中的高可用性的一个框架 spr…

C语言中函数调用和嵌套

函数是C语言的基本组成元素 函数调用 根据函数在程序中出现的位置有下列三种函数调用方式: 将函数作为表达式调用 将函数作为表达式调用时,函数的返回值参与表达式的运算,此时要求函数必须有返回值 int retmax(100,150); 将函数作为语句…

k8s学习 — (DevOps实践)第十四章 微服务 DevOps 实战 【Kubesphere DevOps】

k8s学习 — (DevOps实践)第十四章 微服务 DevOps 实战 【Kubesphere DevOps】 1 开启 DevOps2 集成 SonarQube3 更新 settings.xml4 部署项目4.1 Spring Boot 项目4.1.1 项目4.1.2 配置文件 4.2 微服务项目4.2.1 项目4.2.2 配置文件 5 DevOps 项目5.1 Sp…

大数据Doris(四十一):物化视图简单介绍

文章目录 物化视图简单介绍 一、适用场景

Windows系统配置pytorch环境,Jupyter notebook编辑器安装使用(深度学习本地篇)

如今现在好一点的笔记本都自带英伟达独立显卡,对于一些简单的深度学习项目,是不需要连接服务器的,甚至数据量不大的话,cpu也足够进行训练学习。我把电脑上一些以前的笔记整理一下,记录起来,方便自己35岁事业…

在Android中使用Flow获取网络连接信息

在Android中使用Flow获取网络连接信息 如果你是一名Android开发者,你可能会对这个主题感到有趣。考虑到几乎每个应用程序都需要数据交换,例如刷新动态或上传/下载内容。而互联网连接对此至关重要。但是,当用户的设备离线时,数据如…

Python之__enter__和__exit__

1. 概述 这两个函数与with as语句语句紧密相连,即 class Test():def __enter__(self):print("Enter!")passdef __exit__(self, type, value, trace):print("Exit!")passwith Test() as f: # 执行with as语句时,Test类中的_…

git中的smart checkout和force checkout

切换分支时出现了这个问题: 这是因为shiyan01分支修改了代码,但是没有commit, 所以在切换到test分支的时候弹出这个窗口 一、smart checkout(智能签出) 会把shiyan01分支的改动内容带到test分支。合并处理后的内容就变成了test分支的内容,而shiyan01分支的改动会被…

【Qt-编码】

Qt编程指南 ■ 编码■ ASCII■ ANSI■ GB2312■ GBK■ GB18030 编码■ Unicode■ UTF-8: ■ Qt接收注射泵GBK编码后显示乱码■■ ■ 编码 ■ ASCII (American Standard Code for Information Interchange,美国信息交换标准代码)…

LH7904D 太阳能警示灯 0.4W×2

应用范围: 可安装在电线杆,路灯,围挡,交 通护栏及各种杆式固体等场所起警示作用。 产品特点: 采用进口PS材质; 光控无开关,白天不闪,昏暗环境自动闪烁,无需手动操作,省时省事; …

L4S 杂谈

这不是技术文档,这是技术以外的文档。 带宽资源越来越丰富时,大家反而不抢了,资源越稀缺争抢越厉害,相比丰盈的带宽,如今人们更关注时延。l4s 提供了完全不同的方案。但梳理一下传统方法是必要的。 30 多年来&#x…

SpringBoot Gateway整合过程中的问题

现象描述: 第一次请求正常,第二次报错,错误如下: 2023-12-25 00:47:46.928 ERROR 5484 --- [ctor-http-nio-6] a.w.r.e.AbstractErrorWebExceptionHandler : [34ab38d8-2] 500 Server Error for HTTP GET "/gateway/config…

Oracle 学习(2)

过滤和排序数据 where条件过滤 日期格式 查询10号部门的员工信息:SQL> select * from emp where deptno10 查询”KING”的信息:SQL> select * from emp where ename KiNg 未选定行。 注意:字符串大小写敏感。 SQL> selec…

Navicat误删除生产环境SQLServer2012单表数据后恢复单表数据

背景: 1-后端更新功能部署到客户生产环境时误将测试环境数据保留,项目负责人发现后告知后端。 2-后端登录客户生产数据库使用navicat删除一张表的单表数据时多删了几条数据,判断弄乱了客户生产环境下自己产生的单表数据。 思路&#xff…

直通车定义、功能以及扣费原则

1.直通车是天猫付费搜索广告,即时需求,是消费者主动来搜索的,cpc扣费原则,一般用来拉新或者收割客户; 2.一般关键词优先,人群溢价是用来更精准投放的,可以不投溢价人群; 3.溢价人群…

什么是数据分析思维

参考 一文学会如何做电商数据分析(附运营分析指标框架) 电子商务该如何做数据分析?如何数据分析入门(从各项指标表象进入) https://www.processon.com/outline/6589838c3129f1550cc69950 数据分析步骤 什么是数据分析…

IP 地址归属地查询

IP 地址归属地查询 1. IP 地址归属地查询2. IP 地址归属地查询References 1. IP 地址归属地查询 https://tool.lu/ip/index.html 2. IP 地址归属地查询 https://www.ip.cn/ip/.html References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【FPGA】分享一些FPGA高速信号处理相关的书籍

在做FPGA工程师的这些年,买过好多书,也看过好多书,分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

Unity | 渡鸦避难所-4 | 镜头跟随角色移动

1 Cinemachine 简介 在第一人称视角的游戏中,摄像机需要时刻跟随角色移动。除了手动计算摄像机的位置、旋转外,也可以使用 Unity 提供的 Cinemachine 插件来轻松实现摄像机的控制 Cinemachine 是一套用于操作 Unity 相机的模块,解决了跟踪目…