您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關AWTK 中怎么實現一個 LCD 接口,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在低端的嵌入式平臺上,內存只有幾十 KB,沒有足夠的內存使用 framebuffer,通常直接向寄存器中寫入坐標和顏色數據。lcd_reg.inc 提供了基于寄存器實現的 LCD,用它實現不同平臺的 LCD 時,只需要提供兩個宏即可:
set_window_func 設置要寫入顏色數據的區域,相對于每次設置坐標而言,可以極大提高工作效率。
write_data_func 寫入顏色數據。
下面是 STMF103ze 上 LCD 的實現,這里把 set_window_func 定義為 TFT_SetWindow,把 write_data_func 定義為 TFT_WriteData:
#include "tftlcd.h" #include "tkc/mem.h" #include "lcd/lcd_reg.h" typedef uint16_t pixel_t; #define LCD_FORMAT BITMAP_FMT_BGR565 #define pixel_from_rgb(r, g, b) \ ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3)) #define pixel_to_rgba(p) \ { (0xff & ((p >> 11) << 3)), (0xff & ((p >> 5) << 2)), (0xff & (p << 3)) } #define set_window_func LCD_Set_Window #define write_data_func LCD_WriteData_Color #include "base/pixel.h" #include "blend/pixel_ops.inc" #include "lcd/lcd_reg.inc"
基于寄存器實現的實現有幾個限制:
由于內存和 CPU 性能的問題,不提供任何類型的動畫。
由于讀取 LCD 當前內容速度很慢,所以需要與底色進行混合時,由 GUI 自己處理 (APP 無需關心)。
屏幕大時會出現閃爍。
在 AWTK 中,不再推薦此方法,基于片段幀緩沖實現的 LCD 是更好的選擇。
在低端的嵌入式平臺上,內存只有幾十 KB,沒有足夠的內存創建一屏的幀緩沖,而使用基于寄存器的方式屏幕容易閃爍。
比較好的辦法是,創建一小塊幀緩沖,把屏幕分成很多小塊,一次只繪制一小塊。由于有臟矩形機制,除了打開新窗口時,在正常情況下,繪制速度仍然很快,可以有效的解決閃速問題。
lcd_mem_fragment.inc 提供了基于片段幀緩沖實現的 LCD,用它實現不同平臺的 LCD 時,只需要提供兩個宏即可:
set_window_func 設置要寫入顏色數據的區域,相對于每次設置坐標而言,可以極大提高工作效率。
write_data_func 寫入顏色數據。
下面是 STMF103ze 上 LCD 的實現,這里把 set_window_func 定義為 TFT_SetWindow,把 write_data_func 定義為 TFT_WriteData:
#include "tftlcd.h" #include "tkc/mem.h" #include "lcd/lcd_mem_fragment.h" typedef uint16_t pixel_t; #define LCD_FORMAT BITMAP_FMT_BGR565 #define pixel_from_rgb(r, g, b) \ ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3)) #define pixel_to_rgba(p) \ { (0xff & ((p >> 11) << 3)), (0xff & ((p >> 5) << 2)), (0xff & (p << 3)) } #define set_window_func LCD_Set_Window #define write_data_func LCD_WriteData_Color #include "base/pixel.h" #include "blend/pixel_ops.inc" #include "lcd/lcd_mem_fragment.inc"
這是在嵌入式平臺上最常見的方式。一般有兩個 framebuffer,一個稱為 online framebuffer,一個稱為 offline framebuffer。online framebuffer 是當前現實的內容,offline framebuffer 是 GUI 當前正在繪制的內容。lcd_mem_rgb565 提供了 rgb565 格式的 LCD 實現,lcd_mem_rgba8888 提供了 rgba8888 格式的 LCD 實現,它們都是在 lcd_mem.inc 基礎上實現的,要增加新的格式也是很方便的。
下面是 STMF429 上 LCD 的實現:
extern u32 *ltdc_framebuf[2]; #define online_fb_addr (uint8_t*)ltdc_framebuf[0] #define offline_fb_addr (uint8_t*)ltdc_framebuf[1] lcd_t* platform_create_lcd(wh_t w, wh_t h) { return lcd_mem_rgb565_create_double_fb(w, h, online_fb_addr, offline_fb_addr); }
在支持 OpenGL 3D 硬件加速的平臺上(如 PC 和手機),我們使用 nanovg 把 OpenGL 封裝成 vgcanvas 的接口,在 vgcanvas 基礎之上實現 LCD。lcd_vgcanvas.inc 將 vgcanvas 封裝成 LCD 的接口,這里出于可移植性考慮,并沒有直接基于 nanovg 的函數,而是基于 vgcanvas 的接口,所以在沒有 GPU 時,如果 CPU 夠強大,也是可以基于 agg/picasso 去實現的 LCD。
上述就是小編為大家分享的AWTK 中怎么實現一個 LCD 接口了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。