imx6ull UI开发简介

  • 在imx6ull上开发UI 应用
    • 硬件层面
    • 内核驱动
      • 显示设备
      • 文件描述符
      • 设备树
    • 软件
      • LVGL
        • 用户空间
        • 内核
      • QT

在imx6ull上开发UI 应用

在 Linux 系统中,应用程序需要通过操作 RGB LCD 的显存来实现在屏幕上显示字符、图像等信息。由于 Linux 采用严格的内存管理机制,显存必须经过申请才能使用。由于虚拟内存机制的存在,驱动程序设置的显存地址必须与应用程序访问的物理内存区域保持一致。

下面从硬件,内核 驱动和软件层面介绍整个流程。

硬件层面

imx6ull 的外设 LCDIF(Liquid Crystal Display Interface) 支持以下功能:

  • 具有异步并行MPU接口的显示器,用于与集成帧缓冲区进行命令和数据传输。
  • 支持动态图像且需要RGB接口模式(DOTCLK接口)的显示器。
  • 用于高速数据传输的VSYNC模式。
  • 接受ITU-R BT.656格式4的数字视频编码器。
    因此可以用这个外设来驱动 TFT(RGB 接口)

内核驱动

通常情况下, 芯片厂商和屏幕厂商已经在Linux内核中实现了驱动, 对于应用来说, 只需要根据实际的硬件来修改一些设置, 如 device tree里LCDIF的有关IO口, 屏幕的有关参数等。

显示设备

在Linux系统中,显示设备通常通过图形子系统来管理,主要有两种方式:直接使用帧缓冲(Framebuffer)和间接使用图形用户界面(GUI)系统,如X Window System或QT等。
帧缓冲是Linux内核提供的一个设备驱动接口,它允许用户空间程序直接访问显示硬件的帧缓冲区。通过/dev/fbX(X: 0~n)等设备文件,用户空间程序可以读写显示内存,从而实现图形显示。

文件描述符

/dev/fbX是字符设备, 文件描述符定义在drivers/video/fbdev/core/fbmem.c文件

设备树

  • imx6ul.dtsi: 设置 LCDIF的有关属性
lcdif: lcdif@21c8000 {compatible = "fsl,imx6ul-lcdif", "fsl,imx28-lcdif";reg = <0x021c8000 0x4000>;interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clks IMX6UL_CLK_LCDIF_PIX>,<&clks IMX6UL_CLK_LCDIF_APB>,<&clks IMX6UL_CLK_DUMMY>;clock-names = "pix", "axi", "disp_axi";status = "disabled";};
  • OEM工程的设备树: 设置屏幕相关的属性和pinctrl 有关信息
&lcdif {assigned-clocks = <&clks IMX6UL_CLK_LCDIF_PRE_SEL>;assigned-clock-parents = <&clks IMX6UL_CLK_PLL5_VIDEO_DIV>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_lcdif_dat&pinctrl_lcdif_ctrl>;display = <&display0>;status = "okay";display0: display {bits-per-pixel = <24>;bus-width = <24>;display-timings {native-mode = <&timing0>;timing0: timing0 {clock-frequency =<60000000>;hactive = <1024>;vactive = <600>;hfront-porch = <160>;hback-porch = <160>;hsync-len = <10>;vback-porch = <23>;vfront-porch = <12>;vsync-len = <3>;hsync-active = <0>;vsync-active = <0>;de-active = <1>;pixelclk-active = <1>;};};};
};// backlight
pinctrl_pwm1: pwm1grp {fsl,pins = <MX6UL_PAD_LCD_DATA00__PWM1_OUT          0x110b0>;};// lcdif command line
pinctrl_lcdif_ctrl: lcdifctrlgrp {fsl,pins = <MX6UL_PAD_LCD_CLK__LCDIF_CLK		0x79MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC	0x79MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC	0x79MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE	0x79MX6UL_PAD_NAND_ALE__GPIO4_IO10          0x17059>;};
// lcdif data linepinctrl_lcdif_dat: lcdifdatgrp {fsl,pins = <MX6UL_PAD_LCD_DATA00__LCDIF_DATA00	0x79MX6UL_PAD_LCD_DATA01__LCDIF_DATA01	0x79MX6UL_PAD_LCD_DATA02__LCDIF_DATA02	0x79MX6UL_PAD_LCD_DATA03__LCDIF_DATA03	0x79MX6UL_PAD_LCD_DATA04__LCDIF_DATA04	0x79MX6UL_PAD_LCD_DATA05__LCDIF_DATA05	0x79MX6UL_PAD_LCD_DATA06__LCDIF_DATA06	0x79MX6UL_PAD_LCD_DATA07__LCDIF_DATA07	0x79MX6UL_PAD_LCD_DATA08__LCDIF_DATA08	0x79MX6UL_PAD_LCD_DATA09__LCDIF_DATA09	0x79MX6UL_PAD_LCD_DATA10__LCDIF_DATA10	0x79MX6UL_PAD_LCD_DATA11__LCDIF_DATA11	0x79MX6UL_PAD_LCD_DATA12__LCDIF_DATA12	0x79MX6UL_PAD_LCD_DATA13__LCDIF_DATA13	0x79MX6UL_PAD_LCD_DATA14__LCDIF_DATA14	0x79MX6UL_PAD_LCD_DATA15__LCDIF_DATA15	0x79MX6UL_PAD_LCD_DATA16__LCDIF_DATA16	0x79MX6UL_PAD_LCD_DATA17__LCDIF_DATA17	0x79MX6UL_PAD_LCD_DATA18__LCDIF_DATA18	0x79MX6UL_PAD_LCD_DATA19__LCDIF_DATA19	0x79MX6UL_PAD_LCD_DATA20__LCDIF_DATA20	0x79MX6UL_PAD_LCD_DATA21__LCDIF_DATA21	0x79MX6UL_PAD_LCD_DATA22__LCDIF_DATA22	0x79MX6UL_PAD_LCD_DATA23__LCDIF_DATA23	0x79>;};
  • 驱动
    搜索 imx6ul.dtsi里定义的 LCDIF 的 compatible , 可以找到 imx6ull LCDIF的驱动文件 drivers/video/fbdev/mxsfb.c

软件

分别以LVGL 和QT两种UI 开发框架角度介绍

LVGL

LVGL移植的详细介绍可以参考LVGL仓库。现简要介绍LVGL实现图形显示的框架流程。

用户空间
  • 使用 “mmap” 将framebuffer和 /dev/fbX 映射起来
  • 实现flush_cb
    –使用memcpy将 UI 数据copy 到 framebuffer
    –最后调用 lv_disp_flush_ready 表示显示刷新操作已完成
内核
  • /dev/fb0 是 Linux FrameBuffer 驱动导出的字符设备。
  • 用户空间通过 mmap 把 FrameBuffer 物理内存映射到用户空间指针(fbp)。
  • 用户空间写 fbp,实际上就是直接写显存。
  • 内核 FrameBuffer 驱动负责把这些数据同步到实际的显示控制器(如 i.MX6ULL 的 LCDIF 控制器)。
  • 显示控制器周期性地从显存读取数据,驱动 TFT 屏显示。
  • 内核 FrameBuffer 驱动的主要职责
    • 初始化 LCD 控制器(如设置分辨率、时序、显存地址等)。
    • 响应用户空间的 ioctl(如获取/设置分辨率、虚拟分辨率、offset 等)。
    • 提供 mmap 支持,让用户空间可以直接访问显存。
    • 处理可能的同步(如部分硬件需要显存 flush 或 cache 操作)。
  • 流程图
	LVGL (flush_cb)|vmemcpy/写入 fbp (mmap 映射的显存)|v/dev/fb0 (FrameBuffer 设备)|vLinux FrameBuffer 驱动 (fbmem.c, fbdev.c, mxsfb.c 等)|vLCD 控制器 (i.MX6ULL LCDIF)|vTFT 屏显示

QT

  • 移植QT 到 imx6ull
    • 移植完成后, 设置qt的环境变量 /etx/profile/

      把/dev/fb0指定为QT的显示设备

      export QT_QPA_PLATFORM=li nuxfb:tty=/dev/fb0
      
  • QT应用程序结合Qt的屏幕管理功能,通过QScreen类获取和操作多个显示设备
QList<QScreen *> screens = QGuiApplication::screens();for (QScreen *screen : screens) {qDebug() << "Found screen:" << screen->name();// 可以在这里进行其他屏幕相关的操作}

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

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

相关文章

虚拟化测试工具Parasoft Virtualize如何为汽车企业提供仿真测试?

在汽车电子研发中&#xff0c;传统路测曾是验证ECU&#xff08;电子控制单元&#xff09;、车载通信、OTA升级等功能的可靠手段。然而&#xff0c;随着智能驾驶和软件定义汽车&#xff08;SDV&#xff09;的发展&#xff0c;这种依赖物理车辆的测试方式面临显著挑战&#xff1a…

QT之openGL使用(一)

OpenGL简介 官网&#xff1a;OpenGL - The Industry Standard for High Performance Graphics 中文官网&#xff1a;主页 - LearnOpenGL CN OpenGL&#xff08;Open Graphics Library&#xff09;是一种跨语言、跨平台的图形编程接口&#xff0c;主要用于渲染二维和三维矢量…

基于生成对抗网络增强主动学习的超高温陶瓷硬度优化

复现论文:基于生成对抗网络增强主动学习的超高温陶瓷硬度优化 我将使用Python复现这篇关于使用生成对抗网络(GAN)增强主动学习来优化超高温陶瓷(UHTC)硬度的研究论文。以下是完整的实现代码和解释。 1. 环境准备和数据加载 首先,我们需要准备必要的Python库并加载数据。 …

hadoop(服务器伪分布式搭建)

1. 报错 Windows 上写的脚本 拷贝到 Linux&#xff08;比如 CentOS&#xff09;系统时会出现。 bash: ./set_java_home.sh: /bin/bash^M: bad interpreter: No such file or directory 报错原因 ^M 是 Windows 的换行符&#xff08;\r\n&#xff09; Linux 使用的是 Unix 格式的…

超详细 anji-captcha滑块验证springboot+uniapp微信小程序前后端组合

目录 1&#xff1a;pom文件引入jar包 2&#xff1a;配置文件 3&#xff1a;踩坑-1 4&#xff1a;踩坑-2 5&#xff1a;后端二次验证 6&#xff1a;自定义背景图 给用户做的一个小程序&#xff0c;被某局安全验证后&#xff0c;说登录太简单&#xff0c;没有验证码等行为认…

使用AVPlayer播放FairPlay DRM视频的最佳实践

01DRM 介绍DRM&#xff0c;即数字版权管理&#xff08;Digital Rights Management&#xff09;&#xff0c;是指使用加密技术保护视频内容、通过专业技术安全地存储和传输密钥&#xff08;加密密钥和解密密钥&#xff09;、并允许内容生产商设置商业规则&#xff0c;限制内容观…

《机器学习数学基础》补充资料:拉格朗日乘子法

瑞士数学家欧拉&#xff08;Leonhard Euler&#xff0c;1707-1783&#xff09;的大名&#xff0c;如雷贯耳——欧拉&#xff0c;是按德文发音翻译。欧拉不仅是公认的十八世纪最伟大的数学家&#xff0c;还是目前史上最多产的数学家。所著的书籍及论文多达 886 部&#xff08;篇…

【PTA数据结构 | C语言版】二叉堆的朴素建堆操作

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;将 n 个顺序存储的数据用朴素建堆操作调整为最小堆&#xff1b;最后顺次输出堆中元素以检验操作的正确性。 输入格式&#xff1a; 输入首先给出一个正整数 c&#xff08;≤1…

深入解析PyQt5信号与槽的高级玩法:解锁GUI开发新姿势

信号与槽机制是PyQt框架实现组件间通信的核心技术。掌握其高级用法能极大提升开发效率和代码灵活性。本文将通过六大核心模块&#xff0c;结合实战案例&#xff0c;全方位解析信号与槽的进阶使用技巧。自定义信号与槽的完全指南 1. 信号定义规范 class CustomWidget(QWidget):#…

gitee某个分支合并到gitlab目标分支

一、克隆Gitee仓库到本地 git clone https://gitee.com/用户名/仓库名.gitcd 仓库名二、添加 GitLab 仓库作为远程仓库 git remote add gitlab https://gitlab.com/用户名/仓库名.git三、查看所有远程仓库 git remote -v四、拉取 Gitee 上的目标分支 git fetch origin 分支名五…

PyQt5信号与槽(信号与槽的高级玩法)

信号与槽的高级玩法 高级自定义信号与槽 所谓高级自定义信号与槽&#xff0c;指的是我们可以以自己喜欢的方式定义信号与槽函 数&#xff0c;并传递参数。自定义信号的一般流程如下&#xff1a; &#xff08;1&#xff09;定义信号。 &#xff08;2&#xff09;定义槽函数。 &a…

第5天 | openGauss中一个用户可以访问多个数据库

接着昨天继续学习openGauss,今天是第五天了。今天学习内容是使用一个用户访问多个数据库。 老规矩&#xff0c;先登陆墨天轮为我准备的实训实验室 rootmodb:~# su - omm ommmodb:~$ gsql -r创建表空间music_tbs、数据库musicdb10 、用户user10 并赋予 sysadmin权限 omm# CREATE…

Vue3 Anime.js超级炫酷的网页动画库详解

简介 Anime.js 是一个轻量级的 JavaScript 动画库&#xff0c;它提供了简单而强大的 API 来创建各种复杂的动画效果。以下是 Anime.js 的主要使用方法和特性&#xff1a; 安装 npm install animejs 基本用法 <script setup> import { ref, onMounted } from "vu…

苦练Python第18天:Python异常处理锦囊

苦练Python第18天&#xff1a;Python异常处理锦囊 原文链接&#xff1a;https://dev.to/therahul_gupta/day-18100-exception-handling-with-try-except-in-python-3m5a 作者&#xff1a;Rahul Gupta 译者&#xff1a;倔强青铜三 前言 大家好&#xff0c;我是倔强青铜三。是一名…

JVM——如何对java的垃圾回收机制调优?

GC 调优的核心思路就是尽可能的使对象在年轻代被回收&#xff0c;减少对象进入老年代。 具体调优还是得看场景根据 GC 日志具体分析&#xff0c;常见的需要关注的指标是 Young GC 和 Full GC 触发频率、原因、晋升的速率、老年代内存占用量等等。 比如发现频繁会产生 Ful GC&am…

正则表达式使用示例

下面以 Vue&#xff08;前端&#xff09;和 Spring Boot&#xff08;后端&#xff09;为例&#xff0c;展示正则表达式在前后端交互中的应用&#xff0c;以邮箱格式验证为场景&#xff1a;1.前端<template><div class"register-container"><h3>用户…

云端微光,AI启航:低代码开发的智造未来

文章目录前言一、引言&#xff1a;技术浪潮中的个人视角初次体验腾讯云开发 Copilot1.1 低代码的时代机遇1.1.1 为什么低代码如此重要&#xff1f;1.2 AI 的引入&#xff1a;革新的力量1.1.2 Copilot 的亮点1.3 初学者的视角1.3.1 Copilot 带来的改变二、体验记录&#xff1a;云…

图片上传实现

图片上传change函数图片上传图片上传到服务器上传的图片在该页面中显示修改界面代码最终实现效果change函数 这里我们先用输入框控件来举例&#xff1a; 姓名&#xff1a;<input typetext classname>下面我们来写 js 语句&#xff0c;对控件进行绑事件来获取输入框内的…

【PTA数据结构 | C语言版】多叉堆的上下调整

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;将 n 个已经满足 d 叉最小堆顺序约束的数据直接读入最小堆&#xff1b;随后将下一个读入的数据 x 插入堆&#xff1b;再执行删顶操作并输出删顶的元素&#xff1b;最后顺次输…

selenium后续!!

小项目案例:实现批量下载网页中的资源根据15.3.2小节中的返回网页内容可知,用户只有获取了网页中的图片url才可以将图片下载到*在使用selenium库渲染网页后,可直接通过正则表达式过滤出指定的网页图片&#xff0c;从而实现批量下载接下来以此为思路来实现一个小项目案例。项目任…