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)用截圖:
點(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)用截圖:
主頁三個(gè)頁面可以左右滑動(dòng)切換下一個(gè)頁面,點(diǎn)擊不同的洗衣圖片進(jìn)入具體的洗衣功能界面。
點(diǎn)擊底部的洗滌、漂洗和脫水可以彈出滑動(dòng)列表選擇不同的參數(shù),點(diǎn)擊功能+按鈕有旋轉(zhuǎn)動(dòng)畫。
下面是smart-music-player應(yīng)用截圖:
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.5.2 eglfs
出現(xiàn)下面錯(cuò)誤,申請不上native window有可能是缺少libqeglfs-mali-integration.so這個(gè)庫,需要將其adb push到小機(jī)端的/usr/lib/qt5/plugins/egldeviceintegrations路徑下。
3.5.3 runtime
出現(xiàn)下面錯(cuò)誤,傳入環(huán)境變量:
export QT_QPA_EGLFS_INTEGRATION=none export XDG_RUNTIME_DIR=/dev/shm
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.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
efl是核心庫,ephoto是一個(gè)相冊應(yīng)用,該應(yīng)用可以選擇板子里的圖片進(jìn)行瀏覽與幻燈片播放, terminology是一個(gè)終端仿真器,類似于ubuntu中的終端,進(jìn)入到efl的配置界面,可以配置 efl支持的功能。如下圖所示:
主要關(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的截圖:
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.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.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
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
如下圖所示:
glmark2是使用GPU的跑分測試程序,可以在R18上使用DRM作為Wayland后端的時(shí)候使 用,除此之外還可以使用FBDEV進(jìn)行顯示并測試GPU性能。wayland,wayland-protocols 在編譯weston的時(shí)候用到,進(jìn)入到weston的配置界面,可以配置weston支持的功能。如下 圖所示:
主要關(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加速的如下圖所示:
注意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.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.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
如下圖所示:
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截圖:
下面是應(yīng)用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截圖:
下面是應(yīng)用gallery截圖:
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
-
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
發(fā)布評論請先 登錄
相關(guān)推薦
評論