一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

詳解全志R128 GUI圖形系統(tǒng)—LVGL篇

冬至子 ? 來源:丨budboool ? 作者:丨budboool ? 2023-12-11 14:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

針對 R128 平臺,提供了LVGL作為圖形系統(tǒng)。

LVGL 說明

LVGL 是一個免費的開源圖形庫,提供了創(chuàng)建嵌入式GUI 所需的一切,具有易于使用的圖形元素,美觀的視覺效果和低內(nèi)存占用,采用MIT 許可協(xié)議,可以訪問LittlevGL官網(wǎng)獲取更多資料。

  • 強大的構(gòu)建塊:按鈕、圖表、列表、滑塊、圖像等。
  • 高級圖形引擎:動畫、抗鋸齒、不透明度、平滑滾動、混合模式等。
  • 支持各種輸入設備:觸摸屏、鼠標、鍵盤、編碼器、按鈕等。
  • 支持多顯示器。
  • 獨立于硬件,可與任何微控制器和顯示器一起使用。
  • 可擴展以使用少量內(nèi)存(64 kB 閃存、16 kB RAM)運行。
  • 多語言支持,支持UTF-8 處理、CJK、雙向和阿拉伯語。
  • 通過類CSS 樣式完全可定制的圖形元素。
  • 受CSS 啟發(fā)的強大布局:Flexbox 和Grid。
  • 支持操作系統(tǒng)、外部內(nèi)存和GPU,但不是必需的。
  • 使用單個幀緩沖區(qū)也能平滑渲染。
  • 用C 編寫并與C++ 兼容。
  • Micropython Binding 在Micropython 中公開LVGL API。
  • 可以在PC 上使用模擬器開發(fā)。
  • 100 多個簡單的例子。
  • 在線和PDF 格式的文檔和API 參考。

目前RTOS 中移植了LVGL 8.1.0 核心組件與Demo,下表列出LVGL 相關庫說明:

包名

說明

lv_demos

lvgl的官方demo

lv_drivers

lvgl的官方設備驅(qū)動程序,集成了sunxifb、sunxig2d和sunximem

lv_examples

lvgl測試用例,最終調(diào)用的是lv_demos中的函數(shù)

lvgl

lvgl核心庫

lv_g2d_test

g2d測試用例,專門測試已經(jīng)對接好的g2d接口

lv_monitor

壓力測試與狀態(tài)監(jiān)測軟件

sunxifb.mk

公共配置文件,寫應用Makefile時需要包含進去

LVGL 配置

mrtos_menuconfig 配置如下

System components --- >
    thirdparty components --- >
        [*] Littlevgl-8 --- >
        [*] lvgl examples (lvgl官方demo)
        [] lvgl g2d test (g2d 接口測試用例)
        [*] lvgl-8.1.0 use sunxifb double buffer (使能雙緩沖,解決撕裂問題)
        [*] lvgl-8.1.0 use sunxifb cache (使能fb cache)
        [] lvgl-8.1.0 use sunxifb g2d (使能G2D硬件加速)
        [] lvgl-8.1.0 use sunxifb g2d rotate (使能G2D硬件旋轉(zhuǎn))
        [] lvgl-8.1.0 use freetype (使能freetype)

LVGL 框架

LVGL 源碼位于 lichee/rtos-components/thirdparty/littlevgl-8, 其框架如圖:

image-20220704155816774

SunxiFB

sunxifb 中,我們提供了一組顯示接口,如下:

接口

說明

sunxifb_init

該函數(shù)主要功能是初始化顯示引擎。帶一個旋轉(zhuǎn)參數(shù),使能g2d旋轉(zhuǎn)的話,就用這個參數(shù)指定旋轉(zhuǎn)方向

sunxifb_exit

該函數(shù)比較簡單,實現(xiàn)關閉cache,關閉g2d,釋放旋轉(zhuǎn)buffer,關閉fb0

sunxifb_flush

該函數(shù)比較重要,負責把draw buffer拷貝到back buffer中,并且繪制最后一幀后,交換frontback buffer。應用不要調(diào)用該函數(shù)

sunxifb_get_sizes

該函數(shù)獲取屏幕分辨率,這樣應用程序就可以不用寫死初始化時的分辨率了

sunxifb_alloc

該函數(shù)主要用來申請系統(tǒng)繪圖內(nèi)存,使能部分g2d功能后,會申請連續(xù)物理內(nèi)存

sunxifb_free

該函數(shù)用來釋放sunxifb_alloc申請的內(nèi)存

代碼位置如下:

lichee/rtos-components/thirdparty/littlevgl-8/lv_drivers/display/sunxifb.c

sunxifb_init(rotated),中rotated的旋轉(zhuǎn)值可以為:

LV_DISP_ROT_NONELV_DISP_ROT_90,LV_DISP_ROT_180LV_DISP_ROT_270。

最后還有賦值 disp_drv.rotated = rotated 。如果沒有g2d旋轉(zhuǎn),也可以指定disp_drv.sw_rotate = 1 使用軟件旋轉(zhuǎn)。

sunxig2d

sunxig2d 中,實現(xiàn)了對g2d``ioctl的封裝,這些函數(shù)都 不需要應用調(diào)用 ,但能加深對整個框架的理解,相關的接口如下:

接口

說明

sunxifb_g2d_init

g2d 模塊初始化函數(shù),打開 /dev/g2d 節(jié)點,設置 g_format。初始化時,根據(jù)使能的宏,打印相應的 log

sunxifb_g2d_deinit

該函數(shù)關閉 g2d 設備

sunxifb_g2d_get_limit

該函數(shù)獲取 g2d 使用閾值

sunxifb_g2d_blit_to_fb

該函數(shù)用來拷貝 fb0frontback buffer 這兩塊 buffer,也可以把 rotate buffer 旋轉(zhuǎn)到 back buffer

sunxifb_g2d_fill

該函數(shù)使用g2d填充一個顏色矩形,顏色可以帶透明度

sunxifb_g2d_blit

該函數(shù)用來拷貝圖像,不能 blend 圖像

sunxifb_g2d_blend

該函數(shù)可以進行圖像 blend

sunxifb_g2d_scale

該函數(shù)用來縮放圖像

代碼位置如下:

lichee/rtos-components/thirdparty/littlevgl-8/lv_drivers/display/sunxig2d.c

以上 g2d 函數(shù),都已經(jīng)對接 lvgl 繪圖框架,使用 lvgllv_draw_map、lv_img_set_zoomlv_canvas_draw_img 函數(shù)就可以使用起來。

lv_g2d_test 應用中有完整的使用示例。

sunximem

sunximem中,實現(xiàn)了管理物理內(nèi)存的封裝,這些函數(shù)都 不需要應用調(diào)用 ,但能加深對整個框架的理解,如下:

接口

說明

sunxifb_mem_init

該函數(shù)會在sunxifb_init中調(diào)用,初始化物理內(nèi)存申請接口,使用的是 libuapi 中間件

sunxifb_mem_deinit

該函數(shù)通過調(diào)用 SunxiMemClose,釋放申請的接口資源

sunxifb_mem_alloc

該函數(shù)比較重要,許多地方都會用到,需要傳入申請的字節(jié)數(shù)和使用說明

sunxifb_mem_free

該函數(shù)用來釋放調(diào)用 sunxifb_mem_alloc 申請的內(nèi)存

sunxifb_mem_get_phyaddr

該函數(shù)把 sunxifb_mem_alloc 申請內(nèi)存的虛擬地址轉(zhuǎn)換為物理地址,g2d 驅(qū)動只接受 buffer 的物理地址或者fd

sunxifb_mem_flush_cache

該函數(shù)用來刷 sunxifb_mem_alloc 申請buffercache

代碼位置如下:

lichee/rtos-components/thirdparty/littlevgl-8/lv_drivers/display/sunxigmem.c

因為g2d驅(qū)動只能使用物理連續(xù)內(nèi)存,因此解碼圖片時,必須要通過 sunxifb_mem_alloc 來申請內(nèi)存。

當前只實現(xiàn)了bmp、png和gif圖片的內(nèi)存申請,jpeg圖片暫未實現(xiàn)

當使用 lv_canvas_set_buffer 時,傳入的 buffer 需要是 sunxifb_alloc 申請的 buffer,sunxifb_alloc 中會判斷是否需要申請物理連續(xù)內(nèi)存。

自定義畫布lv_canvas暫未對接g2d縮放功能

evdev

觸摸我們用的是lvgl官方的evdev

代碼位置如下:

lichee/rtos-components/thirdparty/littlevgl-8/lv_drivers/indev/evdev.c

lvgl 使用觸控功能,需在應用lv_drv_conf.h 文件中配置:

# define USE_EVDEV 1

應用lv_drv_conf.h 中的EVDEV_NAME 要與所使用的觸摸屏驅(qū)動對應,例如 lv_examples 的配置文件:

lichee/rtos-components/thirdparty/littlevgl-8/lv_examples/src/lv_drv_conf.h

如果disp_drv.rotated 指定了旋轉(zhuǎn)90 或者180 度,lvgl 內(nèi)部會自行旋轉(zhuǎn)觸摸坐標,不用觸摸驅(qū)動內(nèi)部去旋轉(zhuǎn)觸摸坐標。

color depth

在應用 lv_conf.h 文件中有關于色彩深度 LV_COLOR_DEPTH 的配置,例如 lv_examples 的配置文件:

lichee/rtos-components/thirdparty/littlevgl-8/lv_examples/src/lv_conf.h


/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
#define LV_COLOR_DEPTH 32

使用SPI 屏顯示,應用 LV_COLOR_DEPTH 必須和屏幕所支持的像素格式匹配;而其他類型的屏,應用LV_COLOR_DEPTH 選擇 16 或32 都可正常顯示。

LV_COLOR_DEPTH 選擇16 位相較于32 位,內(nèi)存占用更小,幀率更快,但是色彩總數(shù)較少,顯示漸變顏色可能會過渡不平滑。

LVGL 新建應用

推薦以 lv_g2d_test 為模板,復制一個新項目:

lichee/rtos-components/thirdparty/littlevgl-8/lv_g2d_test

Makefile 中,需要包含 sunxifb.mk公共配置,在編譯應用時會把宏傳遞下去。方式如下:

lichee/rtos-components/thirdparty/littlevgl-8/lv_g2d_test/Makefile


include components/common/thirdparty/littlevgl-8/sunxifb.mk

另外可以注意到有以下配置,這些配置需要按需開啟,在部分芯片上是不支持 G2D_BLEND 等操作的,只支持簡單的旋轉(zhuǎn)功能:

ifeq ($(CONFIG_LVGL8_USE_SUNXIFB_G2D),y)
CFLAGS+=-DLV_USE_SUNXIFB_G2D_FILL 
        -DLV_USE_SUNXIFB_G2D_BLEND 
        -DLV_USE_SUNXIFB_G2D_BLIT 
        -DLV_USE_SUNXIFB_G2D_SCALE
endif

在應用編譯的實際 Makefile 中,可以只編譯需要的文件,縮減可執(zhí)行文件的大小。

關于lvgl 的配置文件,也是建議用 lv_g2d_test 中的,可以對比原始未修改過的配置,然后再根據(jù)實際場景開關相應配置。配置文件如下:

lichee/rtos-components/thirdparty/littlevgl-8/lv_g2d_test/src/lv_conf.h
lichee/rtos-components/thirdparty/littlevgl-8/lv_g2d_test/src/lv_drv_conf.h

原文件:

lichee/rtos-components/thirdparty/littlevgl-8/lvgl/lv_conf_template.h
lichee/rtos-components/thirdparty/littlevgl-8/lv_drivers/lv_drv_conf_template.h.h

最后就是應用的初始化了,在 lv_g2d_test 中,有比較清晰的調(diào)用流程了,需要注意的是 sunxifb_init 需要傳入旋轉(zhuǎn)參數(shù)和 sunxifb_alloc 申請內(nèi)存即可。

LVGL 運行

我們提供了幾個測試用例,執(zhí)行命令如下:

lv_examples 0, is lv_demo_widgets
lv_examples 1, is lv_demo_music
lv_examples 2, is lv_demo_benchmark
lv_examples 3, is lv_demo_keypad_encoder
lv_examples 4, is lv_demo_stress

在初始化時,會有如下打印,根據(jù)配置的不同會有差異,表示打開了某項配置:

wh=800x480, vwh=800x960, bpp=32, rotated=0
Turn on double buffering.
Turn on 2d hardware acceleration.
Turn on 2d hardware acceleration fill.
Turn on 2d hardware acceleration blit.
Turn on 2d hardware acceleration blend.
Turn on 2d hardware acceleration scale.
Turn on 2d hardware acceleration rotate.

LVGL 開啟觸控功能

lvgl 使用觸控功能,需在應用 lv_drv_conf.h 文件中使能宏 USE_EVDEV。前提要確認好觸摸屏驅(qū)動模塊能夠正常加載使用,并且使 lv_drv_conf.h 中的 EVDEV_NAME 與所使用的觸摸屏驅(qū)動對應:

# define USE_EVDEV 1
# define EVDEV_NAME "touchscreen"

lvgl 對接觸摸屏驅(qū)動的代碼位置如下:

lichee/rtos-components/thirdparty/littlevgl-8/lv_drivers/indev/evdev.c

LVGL 開啟 LOG 日志調(diào)試

lvgl 自帶的Log 日志調(diào)試功能,在應用 lv_conf.h 文件使能宏 LV_USE_LOG 及相關配置:

#define LV_USE_LOG 1
#define LV_LOG_LEVEL LV_LOG_LEVEL_INFO
#define LV_LOG_PRINTF 1

另外在 sunxifb.c 文件或 Makefile 中定義宏 LV_USE_SUNXIFB_DEBUG,可以 Log 打印出LVGL 實際刷圖顯示的幀率。

SPI 屏顯示 LVGL 畫面異常

應用 lv_conf.h 文件中的LV_COLOR_DEPTH 要和SPI 屏所支持的像素格式匹配:

/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
#define LV_COLOR_DEPTH 32
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7953

    瀏覽量

    155133
  • 嵌入式
    +關注

    關注

    5152

    文章

    19675

    瀏覽量

    317672
  • RTOS
    +關注

    關注

    24

    文章

    851

    瀏覽量

    121189
  • GUI
    GUI
    +關注

    關注

    3

    文章

    679

    瀏覽量

    41249
  • LVGL
    +關注

    關注

    1

    文章

    107

    瀏覽量

    3712
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    使用R128實現(xiàn)LVGL的移植

    我們使用的開發(fā)板是 R128-Devkit,需要開發(fā) C906 核心的應用程序,所以載入方案選擇 r128s2_module_c906
    的頭像 發(fā)表于 11-13 10:14 ?2001次閱讀
    使用<b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>實現(xiàn)<b class='flag-5'>LVGL</b>的移植

    R128應用開發(fā)案例—獲取真隨機數(shù)

    R128 內(nèi)置了TRNG,一個真隨機數(shù)發(fā)生器,隨機源是 8 路獨立的環(huán)形振蕩器
    的頭像 發(fā)表于 10-24 17:49 ?1368次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>應用開發(fā)案例—獲取真隨機數(shù)

    R128 BLE最高吞吐量測試正確配置測試方法

    R128使用前我們需要了解BLE的最高吞吐量,以方便評估相關功能的開發(fā)。
    的頭像 發(fā)表于 10-27 17:17 ?1863次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b> BLE最高吞吐量測試正確配置測試方法

    R128內(nèi)存泄漏調(diào)試案例分享

    硬件:R128 軟件:FreeRTOS + rtplayer\_test(Cedarx)+ AudioSystem
    的頭像 發(fā)表于 11-20 17:27 ?1419次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>內(nèi)存泄漏調(diào)試案例分享

    R128點屏踩坑筆記

    本文所整理的R128點屏踩坑筆記均是在參考以下應用開發(fā)案例進行屏幕適配時遇到的實際開發(fā)問題,涵蓋了屏幕花屏、屏幕白屏、LVGL顯示顏色錯誤等常見問題的解決方法。
    的頭像 發(fā)表于 12-03 10:17 ?1884次閱讀
    <b class='flag-5'>R128</b>點屏踩坑筆記

    縱享絲滑!R128+LVGL驅(qū)動多尺寸RGB LCD屏幕流暢運行

    R128LVGL的組合就為這一類的應用場景提供了解決方案的另一種選擇,對內(nèi)存及處理器性能的低要求,可以讓LVGL很好的適配不同尺寸的RGB屏幕以及各種應用場景。 7寸方屏(1024x600) 4寸方屏
    發(fā)表于 12-22 09:52

    詳解R128 RTOS安全方案功能

    介紹 R128 下安全方案的功能。安全完整的方案基于標準方案擴展,覆蓋硬件安全、硬件加解密引擎、安全啟動、安全系統(tǒng)、安全存儲等方面。 配置文件相關本文涉及到一些配置文件,在此進行說明。 env
    發(fā)表于 12-28 15:59

    R128硬件設計指南①

    硬件系統(tǒng)框圖R128是一顆專為“音視頻解碼”而打造的全新高集成度 SoC,主要應用于智能物聯(lián)和專用語音交互處理解決方案。 單片集成 MCU+RISCV+DSP+CODEC+WIFI/BT+PMU
    發(fā)表于 01-04 09:23

    R128 SDK架構(gòu)與目錄結(jié)構(gòu)

    R128 S2 是提供的一款 M33(ARM)+C906(RISCV-64)+HIFI5(Xtensa) 三核異構(gòu) SoC,同時芯片內(nèi)部 SIP 有 1M SRAM、8M LSPSRAM、8M
    發(fā)表于 01-05 10:05

    R128 Devkit開發(fā)板原理圖模塊介紹及使用說明

    :CH341SER.EXE 購買鏈接 百問科技淘寶店 - R128 DevKit 原理圖模塊介紹R128 模組R128 模組使用 SMT
    發(fā)表于 01-17 09:45

    R128填坑分享】適配LVGL界面圖片和文字顯示很虛,色階明顯的解決方法

    ,有條紋 此時問題可能出現(xiàn)在兩個方向 1、rgb接線不穩(wěn)定有干擾 2、色彩級數(shù)配置問題 1、rgb接線不穩(wěn)定有干擾 檢查杜邦線連接很緊,排除干擾導致的文字顯示虛化 2、色彩級數(shù)配置問題 查找R128
    發(fā)表于 10-16 13:29

    使用R128LVGL運行在SPI TFT GUI

    LVGL 與 SPI TFT GUI 本次使用的是 Dshan_Display Module,如下圖: 引腳配置如下: R128 Devkit TFT 模塊 PA12 CS PA13 SCK
    發(fā)表于 10-23 13:56

    詳解R128GUI圖形系統(tǒng)——LVGL

    GUI 圖形系統(tǒng) 針對 R128 平臺,提供了LVGL作為圖形
    發(fā)表于 12-07 15:43

    R128適配ST7789v LCD

    R128 平臺提供了 SPI DBI 的 SPI TFT 接口,具有如下特點
    的頭像 發(fā)表于 10-23 11:26 ?1515次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>適配ST7789v LCD

    R128啟用USB ADB以及無線ADB配置方法

    首先在FreeRTOS的環(huán)境下,選擇r128\_c906\_pro
    的頭像 發(fā)表于 11-01 11:43 ?1697次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>啟用USB ADB以及無線ADB配置方法