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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

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

Tina Linux圖形系統(tǒng)開發(fā)指南

嵌入式Linux那些事 ? 來源:嵌入式Linux那些事 ? 作者:嵌入式Linux那些事 ? 2023-03-06 11:00 ? 次閱讀


Tina_Linux圖形系統(tǒng)開發(fā)指南

1 概述

本文檔將介紹 Allwinner Tina Linux 中已經(jīng)移植好的窗口系統(tǒng),以及怎么使用,包括 MiniGUI、QT5、EFL、GTK+(WebkitGtk、Midori)、DirectFB、Wayland,整體結(jié)構(gòu) 如下:

適用范圍:Tina Linux v3.5及以上版本。 相關(guān)人員:UI程序開發(fā)相關(guān)人員。

2 MiniGUI

2.1 MiniGUI說明.

目前Tina中移植了MiniGUI3.2的核心庫以及其組件,下表列出MiniGUI相關(guān)包說明:

表2-1: MiniGUI相關(guān)包說明

包名 說明
cell-phone-ux-demo MiniGUI手機(jī)界面應(yīng)用
libminigui-gpl MiniGUI核心庫
minigui-res-be MiniGUI資源庫
mg-samples MiniGUI示例應(yīng)用
libmdolphin MiniGUI瀏覽器核心庫
mdolphin-release-home MiniGUI瀏覽器應(yīng)用
mdolphin-release-tv MiniGUI瀏覽器應(yīng)用
mdolphin-samples MiniGUI瀏覽器應(yīng)用
libmg3d MiniGUI提供3D接口組件
libmgeff MiniGUI動(dòng)畫框架
libmgi MiniGUI輸入法組件
libmgncs MiniGUI新控件集
libmgp MiniGUI提供打印功能組件
libmgplus 對MiniGUI圖形繪制接口的增強(qiáng)
libmgutils MiniGUI提供對話框模板

表2-2:基于MiniGUI開發(fā)的應(yīng)用

包名 說明
multimedia-test 多媒體測試Demo,包含攝像頭預(yù)覽、拍照、錄像、播放音、視頻、瀏覽圖片功能
r11-board 智能洗衣機(jī)Demo,包含一些界面滑動(dòng)效果,選擇控件等常用功能實(shí)現(xiàn)
smart-music-player 智能音樂播放器Demo,包含滑動(dòng)列表實(shí)現(xiàn),在R328和R329上適配

下面是multimedia-test應(yīng)用截圖:

圖2-1: multimedia-test主頁截圖

點(diǎn)擊SD卡和U盤圖標(biāo),可以對SD卡和U盤格式化,在拍照與錄制的時(shí)候需要正確的格式,不然不能錄制。藍(lán)色的SD卡與U盤表示SD卡與U盤正確掛載,灰色的表示沒有正確掛載。SD卡與U盤同時(shí)掛載的時(shí)候,默認(rèn)使用SD卡,點(diǎn)擊相應(yīng)圖標(biāo)進(jìn)入相應(yīng)功能界面。

下面是r11-board應(yīng)用截圖:

圖2-2: r11-board主頁截圖

主頁三個(gè)頁面可以左右滑動(dòng)切換下一個(gè)頁面,點(diǎn)擊不同的洗衣圖片進(jìn)入具體的洗衣功能界面。

圖2-3: r11-board功能頁截圖

點(diǎn)擊底部的洗滌、漂洗和脫水可以彈出滑動(dòng)列表選擇不同的參數(shù),點(diǎn)擊功能+按鈕有旋轉(zhuǎn)動(dòng)畫。

下面是smart-music-player應(yīng)用截圖:

圖2-4: smart-music-player截圖 1

圖2-5: smart-music-player截圖 2

2.2 MiniGUI配置.

source build/envsetup.sh

lunch XXX平臺(tái)名稱

make menuconfigGui --->

Minigui --->

<*> libminigui-gpl --->

[*] Enabel truetype font support (支持TTF矢量字體)

[*] Enabel tslib support for MiniGUI (支持觸摸屏)

[ ] Enabel g2d support for MiniGUI (支持G2D硬件加速,需要用sunxifb顯示引擎,目前只在R528/D1上支持)

[ ] Enabel g2drotate support for MiniGUI (支持G2D旋轉(zhuǎn),需要用sunxifb顯示引擎,目前只在R528/D1上支持)

[ ] Enabel sunxifb support for MiniGUI (顯示引擎,類似fbcon,framebuffer長度大于 3時(shí),切換成循環(huán)buffer)

[ ] Enabel sunxifbion support for MiniGUI (顯示引擎,通過libuapi申請顯示buffer)

[ ] Enabel coortrans cw support for MiniGUI(UI旋轉(zhuǎn) 90 度)

[ ] Enabel reduce size for MiniGUI (裁剪一些不需要的模塊)

-*- minigui-res-be

<*> mg-samples

MiniGUI有些示例程序需要將MiniGUI的核心庫變編譯為多進(jìn)程模式,因此需要進(jìn)行如下的配 置:

Gui --->

Minigui --->

<*> libminigui-gpl --->

Preferred Minigui Run Mode (ths) ---> proc

幾點(diǎn)差異化說明:

目前Tina中集成的是MiniGUI3.2版本,在 64 位與 32 位的機(jī)器上都可以正常運(yùn)行。

如果使用的不是觸摸屏,需要配置鼠標(biāo),為了正常的顯示鼠標(biāo)光標(biāo),需要修改如下Makefile:

tina/package/minigui/libminigui-gpl/Makefile

把–enable-cursor=no改成yes,表示使用鼠標(biāo)。

V853平臺(tái)MiniGUI配置選項(xiàng)

source build/envsetup.sh

lunch選擇v853_perf1-tina

make menuconfigCONFIG_PACKAGE_eyesee-minigui:

eyesee-minigui is a GUILib for eyesee project.

Symbol: PACKAGE_eyesee-minigui [=y]

Type : tristate

Prompt: eyesee-minigui............................. eyesee-minigui for Tina Linux

代碼路徑為:external/minigui/

2.3 MiniGUI使用.

成功燒寫固件后,在小機(jī)端使用MiniGUI,需要進(jìn)行如下幾步:

使用的是觸摸屏,需要進(jìn)行觸摸屏校準(zhǔn)。

配置MiniGUI.cfg文件。

2.3.1 觸摸屏校準(zhǔn).

電容屏不需要校準(zhǔn),如果電容屏觸摸不準(zhǔn)確,需要把/etc/pointercal文件刪除。

電阻屏首先要確保觸摸驅(qū)動(dòng)正常工作,有觸摸節(jié)點(diǎn)生成,比如說是/dev/input/event1,可以執(zhí)行 下面的命令,再觸摸屏幕看串口有無打印。

cat /dev/input/event

在小機(jī)端設(shè)置如下變量:

export TSLIB_CALIBFILE=/etc/pointercal

export TSLIB_CONFFILE=/etc/ts.conf

export TSLIB_PLUGINDIR=/usr/lib/ts

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb

// TSLIB_TSDEVICE根據(jù)觸摸屏生成的設(shè)備節(jié)點(diǎn)來配置

export TSLIB_TSDEVICE=/dev/input/event

ts_calibrate

注意TSLIB_TSDEVICE需要是生成的觸摸節(jié)點(diǎn),按照屏幕上的提示點(diǎn)擊完成校準(zhǔn),校準(zhǔn)完成

后/etc/pointerca文件生成,保存這個(gè)校準(zhǔn)文件,就不用每臺(tái)產(chǎn)品都校準(zhǔn)。

2.3.2 MiniGUI.cfg配置

小機(jī)端/usr/local/etc/MiniGUI.cfg文件:

vim usr/local/etc/MiniGUI.cfg

配置MiniGUI的ial和gal引擎,其配置文件的使用如下:

[system] // GAL engine and default options gal_engine=fbcon // defaultmode設(shè)置顯示的大小 defaultmode=800x480-32bpp [fbcon] // defaultmode設(shè)置顯示的大小 defaultmode=800x480-32bpp [sunxifb] defaultmode=800x480-32bpp // flipbuffer=1代替原來的export MG_DOUBLEBUFFER=1 flipbuffer=1 // cacheflag=1使能fb的cache,使buffer拷貝更快,在R328/R329上fb沒有cache功能,需要置為0 cacheflag=1 // rotate是控制旋轉(zhuǎn)的角度,使能G2D旋轉(zhuǎn)后有效,當(dāng)旋轉(zhuǎn)角度為0與180度時(shí),defaultmode不用改變 // 旋轉(zhuǎn)角度為90與270度時(shí),system和sunxifb的defaultmode要改成480x800-32bpp rotate=0

使用觸摸屏,注意mdev需配置成生成的觸摸節(jié)點(diǎn),輸入引擎配置如下:

// IAL engine ial_engine=tslib mdev=/dev/input/event1 mtype=none

使用鼠標(biāo),輸入引擎配置如下:

// IAL engine ial_engine=console mdev=/dev/input/mouse0 mtype=IMPS

2.4 MiniGUI優(yōu)化.

2.4.1 Double Buffer

雙緩沖的目的主要是防止畫面撕裂或者閃爍

修改內(nèi)核開啟雙buffer。

修改文件tina/lichee/linux-3.4/drivers/video/sunxi/disp2/disp/dev_disp.c

注:V853平臺(tái)代碼路徑為:lichee/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/dev_disp.c

//fb0,注意賦值為 3 或者更多時(shí),使用sunxifb引擎會(huì)切換成循環(huán)buffer,在快速滑動(dòng)下可以提升一些幀率 init_para->buffer_num[0] = 2;

在MiniGUI程序執(zhí)行前導(dǎo)入環(huán)境變量。

export MG_DOUBLEBUFFER=1

注意只在使用fbcon引擎的時(shí)候需要導(dǎo)入這個(gè)環(huán)境變量,sunxifb引擎由flipbuffer字段指定。

執(zhí)行完 1 、 2 步,MiniGUI內(nèi)部就會(huì)使用雙緩沖,解決界面切換時(shí)閃爍的問題。

還提供了一個(gè)函數(shù),可以在應(yīng)用層控制是否使用雙buffer,比如在打開界面前打開雙緩沖,打開界面之后停止使用雙緩沖。

開機(jī) framebuffer 是不帶 cache 的,運(yùn)行 minigui 程序的時(shí)候,如果執(zhí)行了 export MG_DOUBLEBUFFER=1或者flipbuffer=1并且cacheflag=1,framebuffer會(huì)切換成帶 cache的,默認(rèn)換頁的時(shí)候會(huì)刷cache。

表2-3: DoubleBufferEnable函數(shù)說明

函數(shù) 說明
DoubleBufferEnable(FALSE) framebuffer會(huì)切換成不帶cache的,因此不用刷cache
DoubleBufferEnable(TRUE) framebuffer會(huì)切換成帶cache的,默認(rèn)換頁的時(shí)候會(huì)刷cache

DoubleBufferEnable需要在執(zhí)行export MG_DOUBLEBUFFER=1或者flipbuffer=1之 后才能調(diào)用,DoubleBufferEnable返回 0 表示調(diào)用成功,如果返回-1表示調(diào)用失敗,可能是關(guān) 閉cache失敗,也可能是mmap framebuffer失敗,需要應(yīng)用層再次調(diào)用該接口,不然顯示異 ?;虺鲥e(cuò)。

2.4.2 其他

鍵盤換膚,可以參考《MiniGUI更換鍵盤皮膚》文檔。

輸入法更新詞庫,可以參考《MiniGUI輸入法更新詞庫》文檔。

文字旋轉(zhuǎn),可以參考《MiniGUI TTF旋轉(zhuǎn)字庫制作并豎直顯示文字》文檔。

Ubuntu移植MiniGUI,可以參考《Ubuntu 64位移植Minigui3.2》文檔。

視頻小窗,可以參考《minigui_per_view視頻小視窗播放》文檔。

3 QT

3.1 QT5配置

目前Tina中移植了QT5.10.1版本,Qt配置可以參考如下說明:

source build/envsetup.sh lunch XXX平臺(tái)名稱 make menuconfigGlobal build settings Binary stripping method (strip) ---> strip Gui ---> Qt ---> -*- qt5-core <*> qt5-examples

這個(gè)將原本的庫的制表符信息裁剪,來減小庫的大小,Qt的某些庫需要用到庫的頭信息strtab 這個(gè)符號表,因此選擇strip這種輕度的裁剪,留下strtab這個(gè)符號表,默認(rèn)的選擇是sstrip。

為了加快編譯速度,提供了不同編譯工具鏈預(yù)編譯的QT包:

tina/dl/qt-everywhere-opensource-src-5.12.9-prebuilt_glibc_32bit.tar.gz tina/dl/qt-everywhere-opensource-src-5.12.9-prebuilt_glibc_64bit.tar.gz tina/dl/qt-everywhere-opensource-src-5.12.9-prebuilt_musl_32bit.tar.gz tina/dl/qt-everywhere-opensource-src-5.12.9-prebuilt_musl_64bit.tar.gz tina/dl/qt-everywhere-opensource-src-5.12.9.tar.xz

如果源碼編譯有問題,查看alsa-lib配置是否選上。

通過在make menuconfig中選擇Qt–> qt5 use prebuilt來判斷使用哪種編譯方法。

make menuconfig Libraries ---> -*- alsa-lib Gui ---> Qt ---> [*] qt5 use prebuilt

qt5 use prebuilt的值會(huì)在tina/package/qt/qt5/Makefile文件中使用。

ifeq ($(CONFIG_QT5_USE_PREBUILT),y) ifeq ($(CONFIG_USE_GLIBC),y) ifeq ($(TARGET_ARCH),aarch64) PKG_MD5SUM:=b96ae8d2d55983911b7bf46896d516bc PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION)-prebuilt_glibc_64bit.tar.gz PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION)- prebuilt_glibc_64bit else PKG_MD5SUM:=6fc40f289dd51ad2bf2403ad2da85bf PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION)-prebuilt_glibc_32bit.tar.gz PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION)- prebuilt_glibc_32bit endif else ifeq ($(CONFIG_USE_MUSL),y) ifeq ($(TARGET_ARCH),aarch64) PKG_MD5SUM:=b7859b3fc75a28f10047cc63f8bb PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION)-prebuilt_musl_64bit.tar.gz PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION)- prebuilt_musl_64bit else PKG_MD5SUM:=9d1e2d3b5673976b3277142f047d2c PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION)-prebuilt_musl_32bit.tar.gz PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION)- prebuilt_musl_32bit endif endif else PKG_MD5SUM:=f177284b4d3d572aa46a34ac8f5a7f PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION).tar.xz PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION) endif

3.2 QT5 platforms選擇

eglfs,在繪圖的時(shí)候會(huì)使用GPU渲染UI,如果平臺(tái)有GPU,盡量使用eglfs。

libqlinuxfb,linux標(biāo)準(zhǔn)的顯示框架,會(huì)打開/dev/fb0節(jié)點(diǎn)進(jìn)行繪圖和顯示。

平臺(tái)插件的參數(shù)配置在package/qt/qt5/files/qt-env.sh 這個(gè)文件,如下所示,默認(rèn)的plat- forms是eglfs,其中MALI_NOCLEAR環(huán)境變量的作用是調(diào)用eglInitialize函數(shù)時(shí)不清屏, 不然在顯示開機(jī)logo之后,會(huì)有一段黑屏?xí)r間,用戶體驗(yàn)不好。

#!/bin/sh export QT_QPA_PLATFORM=eglfs:size=800x export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt5/plugins export QT_QPA_FONTDIR=/usr/lib/fonts export QT_QPA_GENERIC_PLUGINS=tslib export QT_QPA_GENERIC_PLUGINS=evdevmouse:/dev/input/event export QT_QPA_GENERIC_PLUGINS=evdevkeyboard:/dev/input/event export MALI_NOCLEAR=

通常生成的平臺(tái)插件在小機(jī)端的:

/usr/lib/qt5/plugins/platforms/libqeglfs.so

linuxfb平臺(tái)插件動(dòng)態(tài)庫為libqlinuxfb.so。

如需更改為linuxfb,需要修改tina/package/qt/qt5/files/qt-env.sh文件內(nèi)容,還需要make menuconfig選上qt5-drivers-linuxfb,如下所示:

Gui ---> Qt ---> -*- qt5-core <*> qt5-drivers-linuxfb <*> qt5-examples

linuxfb可以通過以下環(huán)境變量進(jìn)行配置:

#!/bin/sh export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=800x480:mmSize=800x480:offset=0x0:tty=/dev/tty1 export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt5/plugins export QT_QPA_FONTDIR=/usr/lib/fonts export QT_QPA_GENERIC_PLUGINS=tslib export QT_QPA_GENERIC_PLUGINS=evdevmouse:/dev/input/event1 export QT_QPA_GENERIC_PLUGINS=evdevkeyboard:/dev/input/event2fb=/dev/fbN //指定幀緩沖設(shè)備; size=x //指定屏幕大小,以像素為單位; mmsize=x //物理寬度和高度; offset=x //屏幕左上角像素偏移量 nographicsmodeswitch- //不要將虛擬終端切換到圖形模式; tty=/dev/ttyN //覆蓋虛擬控制臺(tái),僅在nographicsmodeswitch未設(shè)置時(shí)使用;

eglfs可以通過以下環(huán)境變量進(jìn)行配置:

export QT_QPA_EGLFS_WIDTH=800 //包含屏幕寬度(以像素為單位) export QT_QPA_EGLFS_HEIGHT=480 //包含屏幕高度(以像素為單位) export QT_QPA_EGLFS_FB=/dev/fb0 //覆蓋幀緩沖設(shè)備,默認(rèn)是/dev/fb0 export QT_QPA_EGLFS_DEPTH=32 //覆蓋屏幕的顏色深度,默認(rèn)值為 32

3.3 QT5鼠標(biāo)觸摸屏配置

Qt中使用鼠標(biāo),需要啟動(dòng)udev,將鼠標(biāo)設(shè)備標(biāo)記為輸入設(shè)備,然后Qt的libinput來處理輸入 事件,才能夠識別鼠標(biāo)。設(shè)置udev為自啟動(dòng),默認(rèn)已經(jīng)將udev設(shè)置為自啟動(dòng)。

屏幕為觸摸屏,因此需要make menuconfig選上Qt觸摸模塊qt5-drivers-touchscreen,如 下所示:

Gui ---> Qt ---> -*- qt5-core <*> qt5-drivers-touchscreen <*> qt5-examples

觸摸屏驅(qū)動(dòng)在小機(jī)端的:

/usr/lib/qt5/plugins/generic/libqtslibplugin.so

如果觸摸沒效果,執(zhí)行如下環(huán)境變量:

export QT_QPA_GENERIC_PLUGINS=tslib

3.4 QT5示例運(yùn)行

成功燒寫固件后,在小機(jī)端使用QT,如果使用的是電阻觸摸屏,需要進(jìn)行觸摸屏校準(zhǔn),請參考本文檔2.3.1小節(jié)。

QT的應(yīng)用示例在小機(jī)端的如下路徑:

usr/share/qt5/examples /這是QT自帶的測試應(yīng)用/make menuconfig Gui ---> Qt ---> <*> qt-easing. <*> qt-textures <*> qt-washing-machine //這是新添加的三個(gè)QT應(yīng)用,如果運(yùn)行此應(yīng)用有問題,請參照package/qt/qt-washing-machine/src/doc文檔

運(yùn)行qt應(yīng)用需要指定插件平臺(tái),目前QT支持的插件平臺(tái)有eglfs或者linuxfb,運(yùn)行示例如下 所示:

./application -platform eglfs ./application -platform linuxfb

或者先執(zhí)行下面的命令,導(dǎo)入QT的環(huán)境變量,再執(zhí)行程序。

./etc/qt-env.sh

3.5 QT5問題錦集

3.5.1 strip

運(yùn)行QT的應(yīng)用程序會(huì)出現(xiàn)如下問題,需要將libqeglfs.so庫重新推到/usr/lib/qt5/plugins/platforms 路徑下。這里如果多個(gè)插件平臺(tái)庫都出現(xiàn)這個(gè)問題,可能是由于,Tina系統(tǒng)中將編譯生成的庫進(jìn) 行裁剪,使其更小,Qt在進(jìn)行動(dòng)態(tài)加載的時(shí)候,需要找到庫頭信息中的strtab制表符,因此在 make menuconfig中選擇輕度裁剪模式-strip。

圖3-1: QT5問題錦集strip

3.5.2 eglfs

出現(xiàn)下面錯(cuò)誤,申請不上native window有可能是缺少libqeglfs-mali-integration.so這個(gè)庫,需要將其adb push到小機(jī)端的/usr/lib/qt5/plugins/egldeviceintegrations路徑下。

圖3-2: QT5問題錦集eglfs

3.5.3 runtime

出現(xiàn)下面錯(cuò)誤,傳入環(huán)境變量:

export QT_QPA_EGLFS_INTEGRATION=none export XDG_RUNTIME_DIR=/dev/shm

圖3-3: QT5問題錦集runtime

3.5.4 觸摸使用不了.

出現(xiàn)這個(gè)原因有可能是下面步驟導(dǎo)致:

觸摸屏沒有適配校準(zhǔn)。

參考《2.3.1觸摸屏校準(zhǔn)》/etc/ts_calibrate進(jìn)行校準(zhǔn)。

qt沒有配置觸摸屏的節(jié)點(diǎn)。

參考《3.2 QT5 platforms選擇》。

如果還是不行單獨(dú)執(zhí)行。

export QT_QPA_GENERIC_PLUGINS=tslib

4 EFL

4.1 EFL說明

Enlightenment Foundation Libraries (EFL)驅(qū)動(dòng)Enlightenment,它們也可以獨(dú)立使用或 者構(gòu)建在其他庫之上以提供有用的功能并創(chuàng)建強(qiáng)大的應(yīng)用程序。

核心庫EFL在速度和大小方面都比其GTK +和Qt等的效率更高,并且具有更小的內(nèi)存占用 量。

目前Tina中移植了EFL 1.20.6的核心庫以及其組件,下表列出EFL相關(guān)包說明。

表4-1: EFL相關(guān)包說明

包名 說明
efl EFL功能函數(shù)庫
ephoto 依賴與EFL的相冊應(yīng)用
terminology 依賴于EFL的終端仿真器

下面是應(yīng)用截圖:

圖4-1: efl-on-wayland

4.2 EFL配置

EFL可以使用Framebuffer或者Wayland顯示圖像,如果使用Wayland,需按照本文檔第 8 小節(jié)配置好Wayland。在Tina系統(tǒng)中,已經(jīng)默認(rèn)配置好了Framebuffer。執(zhí)行如下命令配置 EFL:

source build/envsetup.sh lunch XXX平臺(tái)名稱 make menuconfigGui ---> EFL ---> -*- efl <*> ephoto <*> terminology

圖4-2:配置EFL選項(xiàng)

efl是核心庫,ephoto是一個(gè)相冊應(yīng)用,該應(yīng)用可以選擇板子里的圖片進(jìn)行瀏覽與幻燈片播放, terminology是一個(gè)終端仿真器,類似于ubuntu中的終端,進(jìn)入到efl的配置界面,可以配置 efl支持的功能。如下圖所示:

圖4-3:配置EFL支持的功能選項(xiàng)

主要關(guān)注以下幾項(xiàng)配置:

表4-2: EFL配置說明

配置 說明
Enable raw Framebuffer access 使用framebuffer顯示efl的界面
Enabel wayland display server 使用wayland顯示efl的界面
Enabel sunxi-mali opengl es support 使用opengl es
Enable bidirectional text support 是否支持雙向文本,從左到右,或從右到左顯示文字
Enable tslib for touchscreen events 是否支持觸摸

如果使用framebuffer顯示efl的界面,則不需要再做其他配置什么,因?yàn)樵赥ina中默認(rèn)開啟 framebuffer的,如果使用wayland,則需要參考本文檔第 8 小節(jié)配置好wayland。

4.3 EFL運(yùn)行

成功燒寫固件后,如果使用Wayland的話,需要保證Weston已經(jīng)運(yùn)行,在小機(jī)端使用EFL, 執(zhí)行以下命令運(yùn)行測試程序:

elementary_test

elementary_test是官方的小程序,包含efl中各種控件的使用示例。其他兩個(gè)測試程序也是這 樣執(zhí)行:

ephototerminology

還可以執(zhí)行elementary_config去配置elf,可以配置界面渲染的模式,字體、控件的大小等 等。

elementary_config

也可以手動(dòng)指定渲染引擎,比如:

ECORE_EVAS_ENGINE=wayland_egl elementary_test //或者 ELM_ACCEL=gl elementary_test //或者 ELM_DISPLAY=wl elementary_test

如果想看efl的調(diào)試信息,可以在運(yùn)行程序前加上:

EINA_LOG_LEVEL=4 elementary_test

如果是使用wayland顯示efl界面的,并且想測試opengl es,則執(zhí)行:

ELM_ACCEL=gl elementary_test

然后點(diǎn)擊GLView Gears,GLView Many Gears,GLViewSimple查看結(jié)果,執(zhí)行elemen- tary_test的時(shí)候界面可能是黑的,移動(dòng)一下界面,滾動(dòng)一下界面,或者最大化界面,就可以顯示 界面了,如果elementary_test沒有響應(yīng),可以結(jié)束進(jìn)程,再次嘗試。使用kill -9 PID命令結(jié) 束。

5 GTK+

5.1 GTK+說明

GTK+是用來創(chuàng)造圖形界面的庫,它可以運(yùn)行在許多類UNIX系統(tǒng),Windows和OSX。GTK+ 按照GNU LGPL許可證發(fā)布,這個(gè)許可證對程序來說相對寬松。GTK+有一個(gè)基于C的面向?qū)?象的靈活架構(gòu),它有對于許多其他語言的版本,包括C++, Objective-C, Guile/Scheme, Perl, Python, TOM, Ada95, Free Pascal和Eiffel。GTK+依賴于以下庫:

GLib是一個(gè)多方面用途的庫,不僅僅針對圖形界面。GLib提供了有用的數(shù)據(jù)類型、宏、類型轉(zhuǎn)換,字符串工具,文件工具,主循環(huán)抽象等等。

GObject是一個(gè)提供了類型系統(tǒng)、包括一個(gè)元類型的基礎(chǔ)類型集合、信號系統(tǒng)的庫。

GIO是一個(gè)包括文件、設(shè)備、聲音、輸入輸出流、網(wǎng)絡(luò)編程和DBus通信的現(xiàn)代的易于使用的VFS應(yīng)用程序編程接口。

cairo Cairo是一個(gè)支持復(fù)雜設(shè)備輸出的2D圖形庫。

Pango Pango是一個(gè)國際化正文布局庫。它圍繞一個(gè)表現(xiàn)正文段落的PangoLayout ob- ject。Pango提供GtkTextView、GtkLabel、GtkEntry和其他表現(xiàn)正文的引擎。

ATK是一個(gè)友好的工具箱。它提供了一個(gè)允許技術(shù)和圖形用戶界面交互的界面的集合。例如,一個(gè)屏幕閱讀程序用ATK去發(fā)現(xiàn)界面上的文字并為盲人用戶閱讀。GTK+部件已經(jīng)被制作方便支持ATK框架。

GdkPixbuf是一個(gè)允許你從圖像數(shù)據(jù)或圖像文件創(chuàng)建GdkPixbuf(“pixel buffer”)的小的庫。用一個(gè)GdkPixbuf與顯示圖像的GtkImage結(jié)合。

GDK是一個(gè)允許 GTK+支持復(fù)雜圖形系統(tǒng)的抽象層。GDK支持X11、wayland、Win-dows和OS X的圖形系統(tǒng)工具。

GTK+是GTK+庫本身包含的部件,確切的說是GUI零件,比如GtkButton或者Gtk-TextView。

更多GTK應(yīng)用編程可參考:示例

Gtk+(GIMP Tool Kit,GIMP工具包)是一個(gè)用于創(chuàng)造圖形用戶接口的圖形庫,下面是GIMP on GNU/Linux的截圖:

圖5-1: GTK+GIMP運(yùn)行截圖

Tina系統(tǒng)移植了GTK+3的庫及其組件,對應(yīng)GTK包及依賴說明如下:

gtk+-3.22.10.tar.xz:Gtk+3對應(yīng)源代碼。

Pkgconf、gettext-full、atk、glib2、libcairo、pango、gdk-pixbuf、libepoxy、libxkb-common、libpixman、libinput、wayland、wayland-protocols、udev、libdrm、sunxi-mali:Openwrt系統(tǒng)Gtk+3依賴包名稱;對應(yīng)Makefile位于package/libs/libgtk3/。

5.2 GTK+配置

GTK僅基于R18系統(tǒng)平臺(tái)驗(yàn)證過,其它平臺(tái)暫未驗(yàn)證;默認(rèn)GTK配置成wayland port,理論 上GTK可以運(yùn)行于所有支持Wayland的平臺(tái);其中R40使用Wayland+FBDEV作為顯示后 端,R18使用Wayland+DRM。

source build/envsetup.sh lunch XXX平臺(tái)名稱 make menuconfig

以R18平臺(tái)為例,主要配置項(xiàng)如下:

Gui ---> Libs ---> -*- libcairo ---> [*] Enable cairo postscript support [*] Enable cairo pdf support [*] Enable cairo png support [ ] Enable script support [*] Enable cairo svg support [ ] Enable cairo tee support [ ] Enable cairo xml support Gtk ---> <*> libgtk3 ---> [*] Broadway GDK backend [*] Wayland GDK backend [*] Install libgtk3 demo program

因?yàn)镚tk+3依賴于Wayland,Wayland依賴于Weston合成器,配置時(shí)需要選上Weston和 Wayland,需按照本文檔第 8 小節(jié)配置好Wayland。

5.3 GTK+運(yùn)行

成功燒寫固件后,如果使用Wayland的話,需要保證Weston已經(jīng)運(yùn)行,然后在小機(jī)終端運(yùn)行:

/usr/bin/gdk-pixbuf-query-loaders --update-cache gdk-pixbuf-query-loaders > /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache

然后運(yùn)行g(shù)tk3-demo:

gtk3-demo

圖5-2: GTK+Demo運(yùn)行截圖

5.4 GTK+示例

#include int main( int argc, char *argv[] ){ GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show(window); gtk_main (); return(0); }

6 WebKitGtk

6.1 WebkitGtk說明.

Tina系統(tǒng)移植了WebKitGtk的庫及其組件,對應(yīng)WebKitGtk包及依賴說明如下:

webkitgtk-2.18.6.tar.xz、midori_0.5.11_all_.tar.bz2、package/libs/webkitgtk、pack-age/utils/midori:WebKitGtk和Midori瀏覽器對應(yīng)源代碼及Makefile。

ruby/host、flex/host、bison/host、gperf/host、enchant、harfbuzz、icu、libjpeg、libgtk3、libsecret、libsoup、libxml2、libxslt、libsqlite3、libegl、libgles、libwebp libgles、lcms2、libtasn1、gstreamer1、gst1-libav 、gst1-plugins-bas、gst1-plugins-good、gst1-plugins-ugly、gst1-plugins-bad:Openwrt系統(tǒng)WebkitGtk依賴包名稱。

下面是WebKitGtk的截圖:

圖6-1: WebKitGtk運(yùn)行截圖

6.2 WebKitGtk配置

WebKitGtk僅基于R18系統(tǒng)平臺(tái)驗(yàn)證過,其它平臺(tái)暫未驗(yàn)證;默認(rèn)WebKitGtk配置成way- land port,R18使用Wayland+DRM。

source build/envsetup.sh lunch XXX平臺(tái)名稱 make menuconfigGui ---> Gtk ---> <*> webkitgtk <*> midori

因?yàn)閃ebKitGtk依賴于Gtk+3和Wayland,Wayland依賴于Weston合成器,配置時(shí)需要 選上Gtk+3、Weston和Wayland,需按照本文檔第 5 和 8 小節(jié)配置好Gtk+3和Wayland。

6.3 WebKitGtk運(yùn)行

成功燒寫固件后,如果使用Wayland的話,需要保證Weston已經(jīng)運(yùn)行,然后在小機(jī)終端運(yùn)行:

/usr/bin/gdk-pixbuf-query-loaders --update-cache gdk-pixbuf-query-loaders > /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache

然后運(yùn)行Midori或minibrowser:

midori

或者:

minibrowser

6.4 WebKitGtk問題錦集

報(bào)錯(cuò):

error: Package `gee-0.8' not found in specified Vala API directories or GObject-Introspection GIR directories

原因是主機(jī)環(huán)境安裝了Vala這個(gè)工具,但是需要的是tina中編譯出的這個(gè)工具,卸載主機(jī)Vala工具即可。

7 DirectFB

7.1 DirectFB說明

DirectFB(直接幀緩沖區(qū))是在Linux幀緩沖區(qū)(fbdev)抽象層之上實(shí)現(xiàn)的一組圖形API。

最大化硬件加速的實(shí)用程序。

支持高級圖形操作,例如多種alpha混合模式。

沒有內(nèi)核修改沒有庫依賴項(xiàng),libc除外。

符合MHP規(guī)范的要求。

目前在Tina中,還沒有對接過GPU。

目前Tina中移植了DirectFB的核心庫以及其Demo,下表列出DirectFB相關(guān)包說明:

表7-1: DirectFB相關(guān)包說明

包名 說明
directfb directfb核心庫
directfb-examples directfb demo

7.2 DirectFB配置

source build/envsetup.sh lunch XXX平臺(tái)名稱 make menuconfigGui ---> Directfb ---> -*- directfb <*> directfb-examples

7.3 DirectFB運(yùn)行

在小機(jī)端可以執(zhí)行一些df_開頭的測試用例,比如df_andi,df_dok:

df_andi

圖7-1: DirectFB運(yùn)行截圖

8 Wayland

8.1 Wayland說明.

Wayland是一套display server(Wayland compositor)與client間的通信協(xié)議,而Weston是Wayland compositor的參考實(shí)現(xiàn),定位于在Linux上替換X圖形系統(tǒng)。

目前Tina中移植了Wayland的核心庫以及其組件,下表列出Wayland相關(guān)包說明:

![表8-1: Wayland相關(guān)包說明]

包名 作用
glmark2 使用Wayland作為運(yùn)行后端的GPU測試程序,或者使用FBDEV進(jìn)行顯示
wayland 編譯Weston需要用到的主機(jī)端工具
wayland-protocols Wayland協(xié)議,相當(dāng)于插件
weston 核心庫

8.2 Wayland配置.

8.2.1 menuconfig.

Wayland目前可以在R18與R40上運(yùn)行,其他平臺(tái)暫未測試,其中在R40只能使用FBDEV 作為運(yùn)行后端,在R18上可以使用DRM與FBDEV。執(zhí)行如下命令進(jìn)行配置:

source build/envsetup.sh lunch XXX平臺(tái)名稱 make menuconfigGui ---> Wayland ---> < > glmark2 [ ] Enabel fbdev support [*] Enabel wayland support -*- wayland -*- wayland-protocols <*> weston ---> [ ] Enabel dbus support [ ] Enabel weston-launch linux pam support [*] Enabel opengl es support [ ] Enabel fbdev compositor support [*] Enabel drm compositor support [ ] Enabel lcms supports support [ ] Enabel junit xml support [ ] Enabel demo clients install

如下圖所示:

圖8-1: Wayland選項(xiàng)

glmark2是使用GPU的跑分測試程序,可以在R18上使用DRM作為Wayland后端的時(shí)候使 用,除此之外還可以使用FBDEV進(jìn)行顯示并測試GPU性能。wayland,wayland-protocols 在編譯weston的時(shí)候用到,進(jìn)入到weston的配置界面,可以配置weston支持的功能。如下 圖所示:

圖8-2: Weston選項(xiàng)

主要關(guān)注以下幾項(xiàng)配置:

表8-2: Wayland配置說明

選項(xiàng) 說明
Enabel opengl es support 只能在使用DRM 作為weston 后端的時(shí)候選上,支持opengl es GPU 加速
Enabel fbdev compositor support 使用framebuffer 作為顯示引擎
Enabel drm compositor support 使用DRM 作為顯示引擎
Enabel demo clients install 編譯出Wayland 測試Demo

如果使用FBDEV,需要選上kmod-mali-utgard-km與kmod-sunxi-disp:

Kernel modules ---> Video Support ---> <*> kmod-mali-utgard-km <*> kmod-sunxi-disp < > kmod-sunxi-drm

如果使用DRM與GPU加速,需要選上kmod-mali-utgard-km與kmod-sunxi-drm:

Kernel modules ---> Video Support ---> <*> kmod-mali-utgard-km < > kmod-sunxi-disp <*> kmod-sunxi-drm

選擇DRM與GPU加速的如下圖所示:

圖8-3: Kernel modules配置

注意FBDEV與DRM是互斥的,不能同時(shí)選擇。

如果需要Weston開機(jī)自啟動(dòng),需要修改 tina/package/wayland/weston目錄下的Make- file,把$(CP) ./weston $(1)/etc/init.d的注釋去除即可。

如果選擇了DRM作為顯示引擎,還可以把DRM的測試Demo給選上,選項(xiàng)如下:

Gui ---> Libs ---> libdrm ---> [*] install libdrm test programs [ ] Enable support for vc4's API

weston依賴的庫cairo也可以配置,其中Enable cairo pdf support與Enable cairo png support是必須選擇上的,不然編譯的時(shí)候會(huì)報(bào)錯(cuò),如果編譯GTK+的話,需要多選擇一些,參 考本文檔第5.2小節(jié)。

Gui ---> Libs ---> -*- libcairo ---> [ ] Enable cairo postscript support [*] Enable cairo pdf support [*] Enable cairo png support [ ] Enable script support [ ] Enable cairo svg support [ ] Enable cairo tee support [ ] Enable cairo xml support

圖8-4: Cairo選項(xiàng)

8.2.2 kernel_menuconfig

8.2.2.1 FBDEV

如果menuconfig選擇的是使用FBDEV作為后端,已經(jīng)選擇kmod-sunxi-disp,R18平臺(tái)會(huì) 自動(dòng)配置下面的選項(xiàng),不用再執(zhí)行這一小節(jié)的步驟,其他平臺(tái)暫未實(shí)現(xiàn)自動(dòng)配置,下面的主要是 記錄使用FBDEV作為后端,需要的內(nèi)核配置。其他平臺(tái)內(nèi)核已經(jīng)默認(rèn)配置使用FBDEV。

執(zhí)行以下命令,以R18的為例:

make kernel_menuconfig

選上 Framebuffer Console Support(sunxi)、DISP Driver Support(sunxi-disp2)、Framebuffer Console support與Transform Driver Support(sunxi):

Device Drivers ---> Graphics support ---> Frame buffer Devices ---> <*> Support for frame buffer devices ---> Video support for sunxi ---> [*] Framebuffer Console Support(sunxi) <*> DISP Driver Support(sunxi-disp2) Console display driver support ---> <*> Framebuffer Console support Character devices ---> <*> Transform Driver Support(sunxi)

如下圖所示:

圖8-5: Video support for sunxi選項(xiàng)圖8-6: Console display driver support選項(xiàng)圖8-7: Character devices選項(xiàng)

8.2.2.2 DRM.

如果menuconfig選擇的是使用DRM作為后端,由于內(nèi)核中默認(rèn)使用FBDEV,所以先要取消原本的配置,再選擇上DRM的配置,在menuconfig的配置中取消kmod-sunxi-disp,選上kmod-sunxi-drm,R18平臺(tái)會(huì)自動(dòng)配置下面的選項(xiàng),不用在執(zhí)行這一小節(jié)的步驟,其他平臺(tái)暫未實(shí)現(xiàn)自動(dòng)配置。

執(zhí)行以下命令,以R18的為例?,F(xiàn)階段只有R18支持DRM:

make kernel_menuconfig

取消選擇Framebuffer Console Support(sunxi)、DISP Driver Support(sunxi-disp2)、Framebuffer Console support與Transform Driver Support(sunxi):

Device Drivers ---> Graphics support ---> Frame buffer Devices ---> < > Support for frame buffer devices ---> Video support for sunxi ---> [ ] Framebuffer Console Support(sunxi) < > DISP Driver Support(sunxi-disp2) Console display driver support ---> < > Framebuffer Console support Character devices ---> < > Transform Driver Support(sunxi)

選上DRM配置:

Device Drivers ---> Graphics support ---> <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) <*> DRM Support for Allwinnertech SoC A and R Series

如下圖所示:

圖8-8: Graphics support選項(xiàng)

DRM配置好之后,以前可能編譯過不使用DRM的固件,需要先把out刪除掉,并且需要清理 之前內(nèi)核編譯的文件,不然可能會(huì)遇到一些編譯問題,在內(nèi)核目錄下執(zhí)行:

make clean

8.3 Wayland使用.

8.3.1 weston運(yùn)行.

成功燒寫固件后,在小機(jī)端使用Wayland,需要執(zhí)行以下命令:

chmod 0700 /dev/shm/ export XDG_RUNTIME_DIR=/dev/shm export XDG_CONFIG_HOME=/etc/xdg weston --backend=drm-backend.so --tty=1 --idle-time=0 & //或者 weston --backend=fbdev-backend.so --tty=1 --idle-time=0 &

如果沒有/dev/shm/文件夾,手動(dòng)創(chuàng)建即可:

mkdir /dev/shm/

需要開啟調(diào)試的話,運(yùn)行weston前執(zhí)行以下命令:

export MESA_DEBUG=1 export EGL_LOG_LEVEL=debug export LIBGL_DEBUG=verbose export WAYLAND_DEBUG=1

如果有編譯Wayland Demo的話,運(yùn)行weston之后,可以運(yùn)行Demo,在/usr/bin下:

wayland-scanner、weston-calibrator、weston-clickdot、weston-cliptest、weston-confine、weston-dnd、weston-eventdemo、weston-flower、weston-fullscreen、weston-image、weston-info、weston-multi-resource、weston-presentation-shm、weston-resizor、weston-scaler、weston-simple-damage、weston-simple-dmabuf-intel、weston-simple-dmabuf-v4l、weston-simple-egl、weston-simple-shm、weston-simple-touch、weston-smoke、weston-stacking、weston-subsurfaces、weston-terminal、weston-transformed。

GPU跑分測試程序可以執(zhí)行以下命令,前提是編譯了glmark2:

glmark2-es2-wayland

鼠標(biāo)、鍵盤等輸入設(shè)備,插上就可以使用。如果沒有反應(yīng)的話,確定是否編譯了鼠標(biāo),鍵盤的驅(qū)動(dòng)。

8.3.2 weston.ini.

weston.ini 是 Wayland 的桌面配置文件,比如說想要去掉背景與狀態(tài)欄,則可以修改以 下的參數(shù)值。注釋掉 background-image,background-color 改成黑色 0xff000000, panel-position改成none:

vi /etc/xdg/weston.ini[shell] # background-image=/usr/share/weston/background.png background-color=0xff000000 panel-position=none

如果需要旋轉(zhuǎn)屏幕的話:

# [output] [output] # name=LVDS1,mipi屏DSI-1 name=DSI-1 # mode=1680x1050,修改成對應(yīng)的分辨率mode=480*800 # transform=90,旋轉(zhuǎn)的角度 transform=90

更多具體參數(shù),請參考weston.ini( 5 )- Arch手冊頁。

8.4 Wayland問題錦集

報(bào)錯(cuò):

no "wayland-egl" found

原因可能是在之前已經(jīng)編譯過了沒有 wayland 的圖形系統(tǒng),GPU 庫被編譯成不支持 wayland 的庫,在配置 weston 的時(shí)候一定要把 Enabel opengl es support 選擇上,在tina/package/libs/gpu-um/目錄下執(zhí)行mm -B重新編譯GPU的庫,如果還報(bào)no “wayland-egl” found,可以刪除tina/out/目錄再重新編譯。

9 LVGL

9.1 LVGL說明.

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

強(qiáng)大的構(gòu)建塊:按鈕、圖表、列表、滑塊、圖像等。

高級圖形引擎:動(dòng)畫、抗鋸齒、不透明度、平滑滾動(dòng)、混合模式等。

支持各種輸入設(shè)備:觸摸屏、鼠標(biāo)、鍵盤、編碼器、按鈕等。

支持多顯示器。

獨(dú)立于硬件,可與任何微控制器和顯示器一起使用。

可擴(kuò)展以使用少量內(nèi)存(64 kB閃存、16 kB RAM)運(yùn)行。

多語言支持,支持UTF-8處理、CJK、雙向和阿拉伯語。

通過類CSS樣式完全可定制的圖形元素。

受CSS啟發(fā)的強(qiáng)大布局:Flexbox和Grid。

支持操作系統(tǒng)、外部內(nèi)存和GPU,但不是必需的。

使用單個(gè)幀緩沖區(qū)也能平滑渲染。

用C編寫并與C++兼容。

Micropython Binding在Micropython中公開LVGL API。

可以在PC上使用模擬器開發(fā)。

100 多個(gè)簡單的例子。

在線和PDF格式的文檔和API參考。

目前Tina中移植了LVGL 8.1.0核心組件與Demo,下表列出LVGL相關(guān)庫說明:

表9-1: LVGL相關(guān)庫說明

包名 說明
lv_demos lvgl的官方demo
lv_drivers lvgl的官方設(shè)備驅(qū)動(dòng)程序,集成了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 公共配置文件,寫應(yīng)用Makefile時(shí)需要包含進(jìn)去

下面是應(yīng)用lv_examples截圖:

圖9-1: lv_demo_widgets主頁截圖圖9-2: lv_demo_music主頁截圖

下面是應(yīng)用lv_monitor截圖:

圖9-3: lv_monitor主頁截圖

9.2 LVGL配置.

source build/envsetup.sh lunch XXX平臺(tái)名稱 make menuconfigGui ---> Littlevgl ---> < > lv_demo <*> lv_examples (lvgl官方demo) -*- 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 (自動(dòng)鏈接freetype) <*> lv_g2d_test (g2d接口測試用例) <*> lv_monitor (壓力測試與數(shù)據(jù)監(jiān)測軟件) < > smartva < > smartva_ota

9.3 LVGL使用.

lvgl路徑:

tina/package/gui/littlevgl-8

9.3.1 sunxifb

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

表9-2: sunxifb相關(guān)接口說明

接口 說明
sunxifb_init 該函數(shù)主要功能是初始化顯示引擎。帶一個(gè)旋轉(zhuǎn)參數(shù),使能g2d旋轉(zhuǎn)的話,就用這個(gè)參數(shù)指定旋轉(zhuǎn)方向
sunxifb_exit 該函數(shù)比較簡單,實(shí)現(xiàn)關(guān)閉cache,關(guān)閉g2d,釋放旋轉(zhuǎn)buffer,關(guān)閉fb0
sunxifb_flush 該函數(shù)比較重要,負(fù)責(zé)把draw buffer拷貝到back buffer中,并且繪制最后一幀后,交換frontback buffer。應(yīng)用不要調(diào)用該函數(shù)
sunxifb_get_sizes 該函數(shù)獲取屏幕分辨率,這樣應(yīng)用程序就可以不用寫死初始化時(shí)的分辨率了
sunxifb_alloc 該函數(shù)主要用來申請系統(tǒng)繪圖內(nèi)存,使能部分G2D功能后,會(huì)申請連續(xù)物理內(nèi)存
sunxifb_free 該函數(shù)用來釋放sunxifb_alloc申請的內(nèi)存

代碼位置如下:

tina/package/gui/littlevgl-8/lv_drivers/display/sunxifb.c

在sunxifb_init(rotated),中rotated的值為LV_DISP_ROT_NONE,LV_DISP_ROT_90,LV_DISP_ROT_180,LV_DISP_ROT_270。

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

9.3.2 sunxig2d

在sunxig2d中,實(shí)現(xiàn)了對g2d ioctl的封裝,這些函數(shù)都不需要應(yīng)用調(diào)用,如下:

表9-3: sunxig2d相關(guān)接口說明

接口 說明
sunxifb_g2d_init g2d模塊初始化函數(shù),打開/dev/g2d節(jié)點(diǎn),設(shè)置g_format。初始化時(shí),根據(jù)使能的宏,打印相應(yīng)的log
sunxifb_g2d_deinit 該函數(shù)關(guān)閉g2d設(shè)備
接口 說明
sunxifb_g2d_get_limit 該函數(shù)獲取g2d使用閾值
sunxifb_g2d_blit_to_fb 該函數(shù)用來拷貝fb0的front和back buffer這兩塊buffer,也可以把rotate buffer旋轉(zhuǎn)到back buffer
sunxifb_g2d_fill 該函數(shù)使用g2d填充一個(gè)顏色矩形,顏色可以帶透明度
sunxifb_g2d_blit 該函數(shù)用來拷貝圖像,不能blend圖像
sunxifb_g2d_blend 該函數(shù)可以進(jìn)行圖像blend
sunxifb_g2d_scale 該函數(shù)用來縮放圖像

代碼位置如下:

tina/package/gui/littlevgl-8/lv_drivers/display/sunxig2d.c

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

lv_g2d_test應(yīng)用中有完整的使用示例。

9.3.3 sunximem.

在sunximem中,實(shí)現(xiàn)了管理物理內(nèi)存的封裝,這些函數(shù)都不需要應(yīng)用調(diào)用,如下:

表9-4: sunximem相關(guān)接口說明

接口 說明
sunxifb_mem_init 該函數(shù)會(huì)在sunxifb_init中調(diào)用,初始化物理內(nèi)存申請接口,使用的是libuapi中間件
sunxifb_mem_deinit 該函數(shù)通過調(diào)用SunxiMemClose,釋放申請的接口資源
sunxifb_mem_alloc 該函數(shù)比較重要,許多地方都會(huì)用到,需要傳入申請的字節(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ū)動(dòng)只接受buffer的物理地址或者fd
sunxifb_mem_flush_cache 該函數(shù)用來刷sunxifb_mem_alloc申請buffer的cache

代碼位置如下:

tina/package/gui/littlevgl-8/lv_drivers/display/sunxigmem.c

因?yàn)間2d驅(qū)動(dòng)只能使用物理連續(xù)內(nèi)存,因此解碼圖片時(shí),必須要通過sunxifb_mem_alloc來申 請內(nèi)存。

說明:當(dāng)前只實(shí)現(xiàn)了 bmp 、 png 和 gif 圖片的內(nèi)存申請, jpeg 圖片暫未實(shí)現(xiàn)。

當(dāng)使用lv_canvas_set_buffer時(shí),傳入的buffer需要是sunxifb_alloc申請的buffer,sunx- ifb_alloc中會(huì)判斷是否需要申請物理連續(xù)內(nèi)存。

說明:自定義畫布 lv_canvas 暫未對接 g2d 縮放功能。

9.3.4 evdev

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

代碼位置如下:

tina/package/gui/littlevgl-8/lv_drivers/indev/evdev.c

在應(yīng)用 lv_drv_conf.h 中修改 EVDEV_NAME 為觸摸屏對應(yīng)生成的 event 節(jié)點(diǎn),例如 lv_examples的配置文件:

tina/package/gui/littlevgl-8/lv_examples/src/lv_drv_conf.h

另外也可以用命令生成軟連接touchscreen,就會(huì)直接以touchscreen為觸摸節(jié)點(diǎn),方便調(diào) 試。命令如下:

ln -s /dev/input/eventX /dev/input/touchscreen

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

9.4 LVGL新建應(yīng)用

推薦以lv_g2d_test為模板,復(fù)制一個(gè)新項(xiàng)目:

tina/package/gui/littlevgl-8/lv_g2d_test

在Makefile中,需要包含sunxifb.mk公共配置,在編譯應(yīng)用時(shí)會(huì)把宏傳遞下去。方式如下:

tina/package/gui/littlevgl-8/lv_g2d_test/Makefile include ../sunxifb.mk

另外可以注意到有以下配置,這些配置需要按需開啟,在部分芯片上是不支持G2D_BLEND等

操作的,只支持簡單的旋轉(zhuǎn)功能:

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

在應(yīng)用編譯的實(shí)際Makefile中,可以只編譯需要的文件,縮減可執(zhí)行文件的大小,像下面的示例 就是不編譯examples文件夾:

tina/package/gui/littlevgl-8/lv_g2d_test/src/Makefileinclude $(LVGL_DIR)/lvgl/lvgl.mk include $(LVGL_DIR)/lv_drivers/lv_drivers.mk #Do not compile the example EXCSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/examples -name *.c) CSRCS := $(filter-out $(EXCSRCS),$(CSRCS))

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

tina/package/gui/littlevgl-8/lv_g2d_test/src/lv_conf.h tina/package/gui/littlevgl-8/lv_g2d_test/src/lv_drv_conf.htina/package/gui/littlevgl-8/lvgl/lv_conf_template.h tina/package/gui/littlevgl-8/lv_drivers/lv_drv_conf_template.h.h

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

9.5 LVGL運(yùn)行.

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

lv_examples 0lv_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_stresslv_g2d_testlv_g2d_test 0 5 0 1 one num is rotate, range is 0~3 tow num is gif, range is 0~11, 11 is no show gif three num is bmp, range is 0~2, 2 is no show bmp four num is png, range is 0~3, 3 is no show pnglv_monitor

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

wh=1280x800, vwh=1280x1600, 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.

10 Flutter

10.1 Flutter說明

Flutter為應(yīng)用開發(fā)帶來了革新:只要一套代碼庫,即可構(gòu)建、測試和發(fā)布適用于移動(dòng)、Web、桌 面和嵌入式平臺(tái)的精美應(yīng)用。Flutter特性如下:

快速:Flutter代碼可以編譯為ARM 32、ARM 64、x86和JavaScript代碼,確保了有原生平臺(tái)的性能。

高效:使用熱重載(HotReload)快速構(gòu)建和迭代你的產(chǎn)品,更新代碼之后可以立即看到變化,且不會(huì)丟失應(yīng)用狀態(tài)。

靈活:屏幕的每一個(gè)像素皆可由你創(chuàng)作,創(chuàng)建高定制性、自適應(yīng)的設(shè)計(jì),在所有屏幕上都有優(yōu)雅的體驗(yàn)。

多平臺(tái):部署到多種設(shè)備,只需要一份代碼庫,支持移動(dòng)、網(wǎng)頁、桌面和嵌入式設(shè)備。

開發(fā)體驗(yàn):在工程中可以使用插件、自動(dòng)化測試、開發(fā)者工具以及任何可以用來幫助構(gòu)建高質(zhì)量應(yīng)用的工具。

穩(wěn)定可依賴:Flutter由Google支持并廣泛使用,全球性的開發(fā)者社區(qū)廣泛參與和維護(hù),并得到眾多世界知名品牌的信任。

編程語言:Flutter由Dart強(qiáng)力驅(qū)動(dòng),為全平臺(tái)優(yōu)化,構(gòu)建快速應(yīng)用。

本地迭代:部署到設(shè)備之前,你可以在本地調(diào)試代碼,并在Web或移動(dòng)平臺(tái)運(yùn)行產(chǎn)品原型。

靈活擴(kuò)展:任何嵌入式設(shè)備,F(xiàn)lutter靈活且輕量級的UI引擎都能輕松擴(kuò)展以滿足你的需求。

蓬勃發(fā)展的生態(tài):通過Flutter成熟的package生態(tài),你可以為眾多嵌入式設(shè)備創(chuàng)造新的可能。

目前Tina中移植了Flutter 2.10.4與Demo,注意Flutter應(yīng)用只能在glibc編譯工具鏈下運(yùn) 行。下表列出Flutter相關(guān)庫說明:

表10-1: Flutter相關(guān)庫說明

包名 說明
complex_layout 滑動(dòng)列表測試app應(yīng)用
gallery flutter 的官方大型app應(yīng)用,集成了各種控件效果和常見應(yīng)用場景
video_player 視頻播放測試app應(yīng)用
flutter_eglfs 預(yù)編譯加載flutter app的應(yīng)用,用gpu渲染,支持旋轉(zhuǎn)
flutter_fbdev 預(yù)編譯加載flutter app的應(yīng)用,用cpu渲染,暫時(shí)不支持旋轉(zhuǎn)
flutter-client 預(yù)編譯加載flutter app的應(yīng)用,用gpu渲染,支持旋轉(zhuǎn)與視頻播放
libvideo_player_plugin.so 視頻播放插件,目前僅供測試使用,后續(xù)會(huì)替換視頻播放接口
libflutter_elinux_eglfs.so 如果需要自定義插件,需要鏈接該庫
libflutter_engine.so flutter核心庫
gen_snapshot flutter app編譯AOT所需要的工具

下面是應(yīng)用complex_layout截圖:

圖10-1: complex_layout主頁截圖

下面是應(yīng)用gallery截圖:

圖10-2: gallery主頁截圖圖10-3: gallery_1主頁截圖

10.2 Flutter配置

source build/envsetup.sh lunch XXX平臺(tái)名稱 make menuconfigGui ---> Flutter ---> flutter-sunxi ---> --- flutter-sunxi -*- flutter use fbdev [*] flutter use eglfs [ ] flutter use client [ ] flutter use elinux so [*] flutter demo complex layout [*] flutter demo gallery [ ] flutter demo video player

10.3 Flutter運(yùn)行

flutter路徑如下:

tina/package/gui/flutter/flutter-sunxi tina/dl/flutter-sunxi-1.0.7.tar.gz

當(dāng)配置上flutter之后,會(huì)把flutter_fbdev,complex_layout等放到/usr/bin目錄下,libflut- ter_engine.so等放到/usr/lib目錄下,執(zhí)行如下命令:

flutter_eglfs /usr/bin/bundle_complex_layout/ flutter_eglfs /usr/bin/usr/bin/bundle_gallery/flutter_fbdev /usr/bin/bundle_complex_layout/ flutter_fbdev /usr/bin/usr/bin/bundle_gallery/flutter-client -b /usr/bin/bundle_complex_layout/ flutter-client -b /usr/bin/bundle_gallery/

初始化時(shí)會(huì)打印一些信息和探測觸摸節(jié)點(diǎn),log如下:

root@TinaLinux:/# flutter_eglfs /usr/bin/bundle_gallery/ flutter: egl version: 1.4 (1.4 build 1.11@5516664) flutter: egl vendor: Imagination Technologies flutter: red OK: 8 flutter: green OK: 8 flutter: blue OK: 8 flutter: alpha OK: 8 flutter: found input device flutter: input props: flutter: found input device flutter: input props: flutter: found input device flutter: input props:

如果沒有識別到INPUT_PROP_DIRECT,那么需要在觸摸驅(qū)動(dòng)中加上如下代碼:

set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);

另外也可以用命令生成軟連接touchscreen,就會(huì)直接以touchscreen為觸摸節(jié)點(diǎn),方便調(diào) 試。命令如下:

ln -s /dev/input/eventX /dev/input/touchscreen

還可以看更詳細(xì)的信息,增加旋轉(zhuǎn)參數(shù),命令如下:

root@TinaLinux:/# flutter_eglfs -h flutter_eglfs - run flutter apps on your device. USAGE: flutter_eglfs [options] OPTIONS: -f, --fps-print Print frame rates. -p, --touch-print Print touch points. -r, --rotate-screen Rotate the screen, the values are 0, 90, 180, 270. -v, --version Show flutter_eglfs version and exit. -h, --help Show this help and exit. BUNDLE PATH TREE: ./app_bundle/data/flutter_assets ./app_bundle/data/icudtl.dat ./app_bundle/lib/libapp.so EXAMPLES: flutter_eglfs ./app_bundle flutter_eglfs -r 90 ./app_bundle LD_LIBRARY_PATH=./ flutter_eglfs ./app_bundle LD_LIBRARY_PATH can ensure that libflutter_engine.so is found. OTHER: Some applications may require system information. export LANG="en_US.UTF-8"

關(guān)于如何編譯flutter應(yīng)用,可以看readme.txt中的說明,路徑如下:

tina/out/方案名稱/compile_dir/target/flutter-sunxi-1.0.7/readme.txt

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • MiniGUI
    +關(guān)注

    關(guān)注

    5

    文章

    45

    瀏覽量

    28772
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209499
  • 圖形
    +關(guān)注

    關(guān)注

    0

    文章

    71

    瀏覽量

    19284
  • 開發(fā)指南
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    7541
  • Tina
    +關(guān)注

    關(guān)注

    2

    文章

    45

    瀏覽量

    16983
收藏 人收藏

    評論

    相關(guān)推薦

    Tina_Linux系統(tǒng)裁剪開發(fā)指南

    Tina_Linux系統(tǒng)裁剪開發(fā)指南1 概述2 Tina系統(tǒng)裁剪簡介2.1 boot0裁剪2.2 uboot裁剪2.3 內(nèi)核裁剪2.3.1
    的頭像 發(fā)表于 03-06 09:52 ?1560次閱讀

    測試系統(tǒng)開發(fā)指南:了解機(jī)架和系統(tǒng)互連的影響

    測試系統(tǒng)開發(fā)指南:了解機(jī)架和系統(tǒng)互連的影響
    發(fā)表于 08-19 11:56

    測試系統(tǒng)開發(fā)指南:理解驅(qū)動(dòng)程序和直接輸入輸出

    測試系統(tǒng)開發(fā)指南:理解驅(qū)動(dòng)程序和直接輸入/輸出
    發(fā)表于 08-21 14:53

    測試系統(tǒng)開發(fā)指南:優(yōu)化系統(tǒng)設(shè)計(jì),實(shí)現(xiàn)快速開發(fā),快速執(zhí)行,重用

    測試系統(tǒng)開發(fā)指南:優(yōu)化系統(tǒng)設(shè)計(jì),實(shí)現(xiàn)快速開發(fā),快速執(zhí)行,重用
    發(fā)表于 08-26 14:56

    測試系統(tǒng)開發(fā)指南AN1465-7

    測試系統(tǒng)開發(fā)指南AN1465-7
    發(fā)表于 10-09 16:55

    測試系統(tǒng)開發(fā)指南操作維護(hù)應(yīng)用指南1465-8

    測試系統(tǒng)開發(fā)指南操作維護(hù)應(yīng)用指南1465-8
    發(fā)表于 10-10 10:52

    測試系統(tǒng)開發(fā)指南AN1465-5

    測試系統(tǒng)開發(fā)指南AN1465-5
    發(fā)表于 10-10 10:52

    測試系統(tǒng)開發(fā)指南AN1465-4

    測試系統(tǒng)開發(fā)指南AN1465-4
    發(fā)表于 10-11 11:08

    測試系統(tǒng)開發(fā)指南AN1465-1

    測試系統(tǒng)開發(fā)指南AN1465-1
    發(fā)表于 10-12 10:54

    測試系統(tǒng)開發(fā)指南:針對測試工程師的綜合手冊

    測試系統(tǒng)開發(fā)指南:針對測試工程師的綜合手冊
    發(fā)表于 10-24 08:20

    【HarmonyOS】HarmonyOS子系統(tǒng)開發(fā)指導(dǎo)

    系統(tǒng)開發(fā)主要從三個(gè)方面進(jìn)行指導(dǎo),分別是圖形圖像類子系統(tǒng)開發(fā)指導(dǎo),相機(jī)子系統(tǒng)開發(fā)指導(dǎo)和音視頻子系統(tǒng)開發(fā)指導(dǎo)。
    發(fā)表于 09-21 14:50

    Tiny6410 Linux開發(fā)指南詳解

    Tiny6410 Linux 開發(fā)指南
    發(fā)表于 07-08 17:12 ?210次下載
    Tiny6410 <b class='flag-5'>Linux</b><b class='flag-5'>開發(fā)指南</b>詳解

    Tina_Linux_系統(tǒng)軟件開發(fā)指南

    Tina_Linux_系統(tǒng)軟件開發(fā)指南
    的頭像 發(fā)表于 03-02 15:25 ?1833次閱讀
    <b class='flag-5'>Tina_Linux</b>_<b class='flag-5'>系統(tǒng)軟件開發(fā)指南</b>

    Tina Linux配置開發(fā)指南

    Tina Linux配置開發(fā)指南
    的頭像 發(fā)表于 03-02 15:28 ?1.6w次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>配置<b class='flag-5'>開發(fā)指南</b>

    Linux NOR開發(fā)指南

    Linux NOR開發(fā)指南
    的頭像 發(fā)表于 03-06 09:55 ?970次閱讀
    <b class='flag-5'>Linux</b> NOR<b class='flag-5'>開發(fā)指南</b>