OpenHarmony輕量化系統(tǒng)的LVGL使用(二)
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
前言
在做OpenHarmony的LVGL之前,學(xué)習(xí)了STM32的LVGL移植,其中遇到了很多問(wèn)題,也學(xué)會(huì)了很多知識(shí),為下一步的移植打下了基礎(chǔ)。本篇文章主要講解如何移植LVGL到OpenHarmony輕量化系統(tǒng)上。
環(huán)境
- OpenHarmony-3.1
- 潤(rùn)和hispark_pegasus Hi3861開(kāi)發(fā)板
- DevEco Device Tool
- 串口調(diào)試助手
- SSD1306 0.96寸OLED屏幕
移植
我當(dāng)前下載的版本是LVGL8.3版本,大家可以在GitHub上下載獲取源碼:
LVGL8.3_GitHub也可以通過(guò)我上傳的源碼附件進(jìn)行下載。
移植LVGL文件的大致流程:
移植文件
先在applications/sample/wifi-iot/app路徑下新建一個(gè)lvgl文件夾,將下圖四個(gè)文件加入到lvgl文件夾中,并且lvgl根路徑下的lv_conf_template.h更改名字為lv_conf.h。
取消注釋
在lvgl/examples/porting文件夾中把所需要的文件里的開(kāi)頭的#if 0改成 #if 1。本次只使用到屏幕驅(qū)動(dòng),所以只需要將lv_port_disp_template.c和lv_port_disp_template.h改掉即可。
- lv_port_disp_template為屏幕驅(qū)動(dòng)。
- lv_port_fs_template為文件系統(tǒng)驅(qū)動(dòng)。
- lv_port_indev_template為輸入驅(qū)動(dòng)lvgl根路徑下的lv_conf.h將里面開(kāi)頭的#if 0也要改成#if 1在lvgl/examples/porting文件夾中,將lv_port_disp_template.h中的include修改成如圖所示:
加入編譯
這一步將LVGL加入到編譯里面,需要把以下源文件都添加到lvgl/BUILD.gn里面
- lvgl/examples/porting目錄下的文件。
- lvgl/src目錄下的core draw font hal misc widgets文件夾下的頭文件。
- lvgl/src/extra/目錄下的文件。
- lvgl/src/extra/layouts目錄下所有子目錄文件。
- lvgl/src/extra/themes目錄下所有子目錄文件。
- lvgl/src/extra/widgets目錄下所有子目錄文件。
還需要將lvgl ,src,porting頭文件文件夾目錄添加到include_dirs。
由于這一步過(guò)于繁雜瑣碎且容易出錯(cuò)(都是辛酸淚),建議大家直接到文章開(kāi)頭的Gitee鏈接里拉取根目錄下的BUILD.gn文件,放到lvgl根目錄即可。
修改報(bào)錯(cuò)
這時(shí)候進(jìn)行編譯的話,會(huì)發(fā)現(xiàn)報(bào)錯(cuò):lv_theme_default.c未定義lv_win_class。在lvgl工程里,lv_win.h里面已經(jīng)將lv_win_classextern了,但好像lv_theme_default.c文件還是報(bào)錯(cuò)未定義lv_win_class,于是我便直接在這個(gè)文件applications/sample/wifi-iot/app/lvgl/src/extra/themes/default/lv_theme_default.c中加入。
結(jié)合屏幕配置lvgl驅(qū)動(dòng)
本次實(shí)驗(yàn)使用一塊SSD1306的單色0.96寸顯示屏,分辨率是128*64.主要是方便驗(yàn)證lvgl的可行性,大致流程如下:
這塊屏幕參考了連志安老師的OLED屏幕開(kāi)發(fā),將源碼中的SSD1306文件夾復(fù)制到lvgl目錄下:
配置lv_conf文件
修改lvgl根目錄下的lv_conf.h文件。
加入以下代碼,分別對(duì)應(yīng)了屏幕的長(zhǎng)和寬。
修改#define LV_COLOR_DEPTH 16為#define LV_COLOR_DEPTH 8.此選項(xiàng)為屏幕的色深。
(我嘗試過(guò)修改成1單色色深,但1的輸出只有純白色了,于是將這一步先設(shè)為8位色深,主要是我以后用的都是彩色屏幕,所以對(duì)此步驟并沒(méi)有硬性要求一定適配單色屏幕,此次先驗(yàn)證可行性)。
設(shè)置內(nèi)存大小,按照需求設(shè)置,一般來(lái)說(shuō)20Kb夠用了(大工程除外)。
若是想要顯示CPU占用率、內(nèi)存占用率、幀率,可以配置下圖兩個(gè)宏定義為1。
配置lvgl屏幕驅(qū)動(dòng)
屏幕驅(qū)動(dòng)的文件為這個(gè)applications/sample/wifi-iot/app/lvgl/examples/porting/lv_port_disp_template.c。
最首先我們要在這個(gè)文件加入屏幕驅(qū)動(dòng)的頭文件引用。
lvgl精華所在便是它只需要屏幕的畫(huà)點(diǎn)API即可完成操作,這種低耦合性使得它非常便于移植。
SSD1306的畫(huà)點(diǎn)API在ssd1306.h中。
修改void lv_port_disp_init(void)屏幕驅(qū)動(dòng)初始化函數(shù)。
lvgl官方提供了三種緩存模式,想要詳細(xì)了解的可以在官網(wǎng)查詢(xún)相關(guān)資料,本文章不過(guò)多贅述,我們本次使用了單緩存模式,其余兩種模式注釋掉即可.也由于屏幕比較小,所以緩存大小便是屏幕大小。
lvgl的繪圖實(shí)現(xiàn)函數(shù)static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p),用于圖形填充.我們需要在這里實(shí)現(xiàn)繪圖功能,SSD1306的畫(huà)點(diǎn)APIssd1306_DrawPixel將在這里被調(diào)用,SSD1306繪圖完成后還需要調(diào)用刷新函數(shù)ssd1306_UpdateScreen();才可以將屏幕刷新.(當(dāng)然,如果有更加高效快速的刷新方式也可以使用,并不一定是不斷畫(huà)點(diǎn)的形式刷新)。
在前文中,我們將lvgl設(shè)置成8位色深模式,所以我們這里要稍加做判斷,但顏色小于100時(shí),我們把它當(dāng)成黑色,大于100時(shí),我們把它當(dāng)成白色.由此實(shí)現(xiàn)單色顯示。
顯示測(cè)試
在lvgl根路徑創(chuàng)建ssd1306_demo.c,在里面實(shí)現(xiàn)ssd1306的初始化以及l(fā)vgl的初始化,還有l(wèi)vgl需要一直不斷循環(huán)的定時(shí)器和執(zhí)行函數(shù),定時(shí)器需要在執(zhí)行函數(shù)之前。
需要注意的是此定時(shí)器和執(zhí)行函數(shù)可以分成兩個(gè)線程執(zhí)行,但如果這么做,需要為這兩個(gè)線程加上互斥鎖,并且定時(shí)器的間隔時(shí)間需要比執(zhí)行函數(shù)的間隔時(shí)間短。
如果遇到lv_task_handler()執(zhí)行函數(shù)堵死,大概率是內(nèi)存沒(méi)分配夠,將線程的內(nèi)存分配和lvgl的內(nèi)存分配調(diào)大即可。
本次移植到這里就告一段落了,等下一階段有空了再做按鍵的使用。
文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載:
https://ost.51cto.com/resource/2672。
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??