imx6ull UI開發

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;從而實現批量下載接下來以此為思路來實現一個小項目案例。項目任…