嵌入式 Linux 下的 LVGL 移植

目錄

    • 準備
    • 創建工程
    • 修改配置
      • 修改 lv_drv_conf.h
      • 修改 lv_conf.h
      • 修改 main.c
      • 修改 Makefile
    • 編譯運行
    • 更多內容

LVGL(Light and Versatile Graphics Library)是一個輕量化的、開源的、在嵌入式系統中廣泛使用的圖形庫,它提供了一套豐富的控件和組件,只需要少量的內存和計算資源,使得在資源受限的設備上創建高端的圖形界面成為可能。本文記錄如何將 LVGL 移植到嵌入式 Linux 系統中。

  • 編程環境:Windows11 VS Code
  • 編譯環境:Ubuntu18.04 交叉編譯
  • 測試平臺:正點原子 i.MX6ULL
  • 顯示屏:5inch RGB 800×480

準備

打開 LVGL 的 Github 主頁,分別下載 lvgl、lv_drivers、lv_port_linux_frame_buffer 倉庫源碼,lvgl 和 lv_drivers 我這里選擇了當前最新的已發布版本:

創建工程

  1. 創建 lvgl_demo 文件夾;
  2. 將 lvgl、lv_drivers 復制到 lvgl_demo 中;
  3. 將 lv_port_linux_frame_buffer 倉庫中的 main.c 文件和 makefile 文件復制到 lvgl_demo 中;
  4. 將 lvgl 中的 lv_conf_template.h 文件復制到 lvgl_demo 中并且改名為 lv_conf.h;
  5. 將 lv_drivers 中的 lv_drv_conf_template.h 文件復制到 lvgl_demo 中并且改名為 lv_drv_conf.h;
  6. 創建好的工程目錄如圖所示:

修改配置

修改 lv_drv_conf.h

  • #if 0 改成 #if 1

  • USE_FBDEV 的值改為 1,使能 frame buffer 設備:

  • USE_EVDEV 的值改為 1,配置觸控輸入設備的文件路徑:

修改 lv_conf.h

  • #if 0 改成 #if 1

  • 根據實際情況適當擴大內存:

  • 這里可以修改刷新頻率,默認為 30ms:

  • 配置 Tick:

  • 使能 widgets demo:

修改 main.c

  • 修改后的 main.c 文件如下所示:
#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
#include "lv_drivers/display/fbdev.h"
#include "lv_drivers/indev/evdev.h"
#include <unistd.h>
#include <time.h>
#include <sys/time.h>#define DISP_BUF_SIZE (800 * 480)int main(void)
{lv_init();/*Linux frame buffer device init*/fbdev_init();/*A small buffer for LittlevGL to draw the screen's content*/static lv_color_t buf[DISP_BUF_SIZE];/*Initialize a descriptor for the buffer*/static lv_disp_draw_buf_t disp_buf;lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);/*Initialize and register a display driver*/static lv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);disp_drv.draw_buf   = &disp_buf;disp_drv.flush_cb   = fbdev_flush;disp_drv.hor_res    = 800;disp_drv.ver_res    = 480;lv_disp_drv_register(&disp_drv);/* Linux input device init */evdev_init();/* Initialize and register a display input driver */lv_indev_drv_t indev_drv;lv_indev_drv_init(&indev_drv);      /*Basic initialization*/indev_drv.type = LV_INDEV_TYPE_POINTER;indev_drv.read_cb = evdev_read;lv_indev_t * my_indev = lv_indev_drv_register(&indev_drv); /*Create a Demo*/lv_demo_widgets();/*Handle LVGL tasks*/while(1) {lv_timer_handler();usleep(5000);}return 0;
}/*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
uint32_t custom_tick_get(void)
{static uint64_t start_ms = 0;if(start_ms == 0) {struct timeval tv_start;gettimeofday(&tv_start, NULL);start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;}struct timeval tv_now;gettimeofday(&tv_now, NULL);uint64_t now_ms;now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;uint32_t time_ms = now_ms - start_ms;return time_ms;
}

修改 Makefile

  • 指定編譯器,因為我在編譯前會設置編譯器環境變量,為避免錯誤,此處注釋掉該配置,使用環境下默認編譯器:

  • 添加 lv_drivers.mk,注釋掉鼠標樣式源文件:

  • 修改了下構建目標名稱:

  • 若編譯過程中出現未識別的編譯選項,如 -Wshift-negative-value,可刪除 -Wshift-negative-value 選項,該選項的作用是檢查左移操作(<<)中可能出現的負數:

編譯運行

  • 首先設置交叉編譯鏈的環境變量,執行 make 命令:

  • 編譯成功后在工程目錄生成一個可執行文件 lvgl_demo,將其復制到 IMX6U 開發板上;
  • 我這里使用 NFS 掛載的方式,將 lvgl_demo 復制到 NFS 工作目錄:

  • 啟動 IMX6U,查看 IP,掛載 NFS:

  • 切換到 /mnt/ 目錄下,運行 lvgl_demo

  • 運行成功:

更多內容

  • CSDN博客:@Hello阿爾法
  • 嗶哩嗶哩:@Hello阿爾法
  • 知乎:@Hello阿爾法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713663.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ConfigurableBeanFactory學習

簡介 ConfigurableBeanFactory定義BeanFactory的配置。ConfigurableBeanFactory中定義了太多太多的api,比如類加載器,類型轉化,屬性編輯器,BeanPostProcessor,作用域,bean定義,處理bean依賴關系,合并其他ConfigurableBeanFactory,bean如何銷毀。ConfigurableBeanFactory同時繼…

微軟為金融界帶來革命性突破——推出Microsoft 365中的下一代AI助手:Microsoft Copilot for Finance

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

雷龍CS SD NAND(貼片式TF卡)測評體驗

前段時間有幸免費得到了雷龍出品的貼片式的TF卡的芯片及轉接板&#xff0c;兩片貼片式nand芯片&#xff0b;一個轉接板&#xff0c;一種一個已讓官方焊接完好&#xff1b;如下圖所示&#xff1a; 正面&#xff1a; 背面&#xff1a; 通過轉接板&#xff0c;可以將CS SD NAND(貼…

數電實驗之流水燈、序列發生器

最近又用到了數電實驗設計的一些操作和設計思想&#xff0c;遂整理之。 廣告流水燈 實驗內容 用觸發器、組合函數器件和門電路設計一個廣告流水燈&#xff0c;該流水燈由 8 個 LED 組成&#xff0c;工作時始終為 1 暗 7 亮&#xff0c;且這一個暗燈循環右移。 1) 寫出設計過…

關于DisableIEToEdge插件閃退問題的解決方案

關于DisableIEToEdge插件閃退問題.今天終于測試找到最佳解決方案了&#xff01; 1.管理員權限運行Windows powershell. 2.執行一下兩條命令修復系統環境 DISM.exe /Online /Cleanup-image /Restorehealth sfc /scannow 3.關閉Windows安全中心的所有安全選項。 4.管理員權限運行…

【計算機考研擇校】四川大學vs電子科技大學哪個難度更大?

川大在文科&#xff0c;經管方面比科大強&#xff0c;醫學在國內都很強。但工科方面特別是電子信息領域明顯是科大強于川大。畢竟一個是綜合大學&#xff0c;一個是工科大學不可同日而語。 就業上&#xff0c;電子科大在IT領域的社會聲譽口碑不錯。就業一向都很好。這個多問問…

.datastore@cyberfear.com.mkp勒索病毒的最新威脅:如何恢復您的數據?

導言&#xff1a; 我們享受著數字化帶來的便利&#xff0c;但同時也要面對不斷演進的網絡威脅。最近出現的 .datastorecyberfear.com.mkp、[hendersoncock.li].mkp [hudsonLcock.li]、.mkp [myersairmail.cc].mkp 勒索病毒就是其中之一&#xff0c;它對我們的數據安全構成了…

張俊將出席用磁懸浮技術改變生活演講

演講嘉賓&#xff1a;張俊 空壓機銷售總監 億昇(天津)科技有限公司 演講題目&#xff1a;用磁懸浮技術改變生活 會議簡介 “十四五”規劃中提出&#xff0c;提高工業、能源領城智能化與信息化融合&#xff0c;明確“低碳經濟”新的戰略目標&#xff0c;熱能產業是能源產業和…

Python環境下一種改進的基于梯度下降的自適應短時傅里葉變換

在數字信號處理技術中&#xff0c;傅里葉變換及其逆變換是一種信號時頻分析方法。該方法將信號的時域描述及頻域描述聯系在一起&#xff0c;時域信號可通過正變換轉變為頻域信號&#xff0c;頻域信號可通過逆變換轉變為時域信號進行分析。但傅里葉變換及其逆變換是一種信號的整…

Linux/Centos 部署靜態IP,解決無法訪問目標主機、Destination Host Unreachable、無法ping通互聯網的問題

Linux/Centos 部署IP&#xff0c;解決無法訪問目標主機、Destination Host Unreachable、無法ping通互聯網的問題 Linux/Centos 部署靜態IP查物理機/自身電腦的IP設置VMware上的虛擬網絡編輯器設置網卡IP&#xff0c;激活至此就可訪問百度了 Linux/Centos 部署靜態IP 需要注意…

軟考基礎知識2

1.DMA控制方式&#xff1a;直接內存存取。數據在內存與I/O設備間直接成塊傳送&#xff0c;不需要CPU的任何干涉&#xff0c;由DMA硬件直接執行完成。 例題&#xff1a; 2.程序計數器總是存下一個指令的地址。 例題&#xff1a; 3.可靠度的計算&#xff1a; 例題&#xff1a…

吸貓毛空氣凈化器哪個好?推薦除貓毛效果好寵物空氣凈化器品牌

當下有越來越多的家庭選擇養寵物&#xff01;盡管家里變得更加溫馨&#xff0c;但養寵可能會帶來異味和空氣中的毛發增多可能會帶來健康問題&#xff0c;這是一個大問題&#xff01; 不想家里彌漫著異味&#xff0c;特別是來自寵物便便的味道&#xff0c;所以需要一款能夠處理…

大語言模型LLM Pro+中Pro+(Prompting)的意義

—— Pro &#xff0c;即Prompting&#xff0c;構造提示 1.LLM Pro中Pro&#xff08;Prompting&#xff09;的意義 Prompting不僅是大語言模型交互和調用的一種高效手段&#xff0c;而且已成為推動模型泛化能力和應用靈活性的關鍵技術路徑&#xff0c;它不僅極大地拓展了模型功…

ABAP - SALV教程02 - 開篇:打開SALV的三種方式之二

全屏模式生成SALV的方式&#xff1a;http://t.csdnimg.cn/CzNLz本文講解生成可控模式的SALV&#xff0c;該方式需要依賴自己創建屏幕的自定義控件區域&#xff08;Custom Control&#xff09;實現步驟&#xff1a;需要注意的點是SALV的實例對象和dispaly方法一定是在屏幕PBO事件…

利用IP地址識別風險用戶:保護網絡安全的重要手段

隨著互聯網的發展和普及&#xff0c;網絡安全問題日益突出&#xff0c;各種網絡詐騙、惡意攻擊等風險不斷涌現&#xff0c;給個人和企業的財產安全和信息安全帶來了嚴重威脅。在這樣的背景下&#xff0c;利用IP地址識別風險用戶成為了保護網絡安全的重要手段之一。IP數據云探討…

Qt常用的多線程使用方式

目前(Qt5)常用的多線程的方式&#xff1f; 1、派生于QThread然后重寫run()函數 2、通過將派生QObject的類對象通過moveToThread()來移動到新的線程中 3、通過inherit QRunnable類然后重寫run()方法、然后借助QThreadPool線程池來實現多線程 4、通過高級語法 QtConcurrent模塊來…

JVM內存回收算法

1.1 引用計數法 每個對象創建的時候&#xff0c;會分配一個引用計數器&#xff0c;當這個對象被引用的時候計數器就加1&#xff0c;當不被引用或者引用失效的時候計數器就會減1。任何時候&#xff0c;對象的引用計數器值為0就說明這個對象不被使用了&#xff0c;就認為是“垃圾…

奇舞周刊第521期:“一切非 Rust 項目均為非法”

奇舞推薦 ■ ■ ■ 拜登&#xff1a;“一切非 Rust 項目均為非法” 科技巨頭要為Coding安全負責。這并不是拜登政府對內存安全語言的首次提倡。“程序員編寫代碼并非沒有后果&#xff0c;他們的?作?式于國家利益而言至關重要。”白宮國家網絡總監辦公室&#xff08;ONCD&…

在idea中用模板骨架初始創建maven管理的web項目時沒有src有關的目錄的解決方案

一.問題如下 二.解決方法 首先關閉當前項目&#xff0c;接著修改全局設置&#xff0c;重新創建項目 在VM Options中添加"-DarchetypeCataloginternal"&#xff0c;點擊ok保存 點擊創建&#xff0c;如果創建成功沒報錯且有src&#xff0c;就ok了。 當然如果出現以下…

「媒體宣傳」如何寫好新聞稿?

傳媒如春雨&#xff0c;潤物細無聲&#xff0c;大家好&#xff0c;我是51媒體網胡老師。 寫好新聞稿是媒體宣傳的關鍵環節之一&#xff0c;下面是一些關于如何寫好新聞稿的建議&#xff1a; 明確新聞稿的目的和受眾&#xff1a;在寫新聞稿之前&#xff0c;首先要明確新聞稿的目…