中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

AWTK 中怎么實現一個 LCD 接口

發布時間:2021-08-10 13:42:11 來源:億速云 閱讀:121 作者:Leah 欄目:互聯網科技

這期內容當中小編將會給大家帶來有關AWTK 中怎么實現一個 LCD 接口,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、基于寄存器實現的 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 是更好的選擇。

二、基于片段幀緩沖實現的 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 實現的 LCD

這是在嵌入式平臺上最常見的方式。一般有兩個 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);
}

四、基于 vgcanvas 實現的 LCD

在支持 OpenGL 3D 硬件加速的平臺上(如 PC 和手機),我們使用 nanovg 把 OpenGL 封裝成 vgcanvas 的接口,在 vgcanvas 基礎之上實現 LCD。lcd_vgcanvas.inc 將 vgcanvas 封裝成 LCD 的接口,這里出于可移植性考慮,并沒有直接基于 nanovg 的函數,而是基于 vgcanvas 的接口,所以在沒有 GPU 時,如果 CPU 夠強大,也是可以基于 agg/picasso 去實現的 LCD。

上述就是小編為大家分享的AWTK 中怎么實現一個 LCD 接口了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嵊州市| 宜黄县| 沾益县| 弋阳县| 阿拉尔市| 苏州市| 海阳市| 句容市| 光山县| 德庆县| 义马市| 鄂尔多斯市| 北宁市| 台中市| 绵阳市| 漾濞| 张家港市| 酒泉市| 葵青区| 绍兴市| 虹口区| 大渡口区| 怀柔区| 灵宝市| 绍兴县| 金湖县| 凌源市| 高阳县| 合水县| 江口县| 丽水市| 汾西县| 班戈县| 北票市| 灌云县| 深水埗区| 永顺县| 吴江市| 玉树县| 建宁县| 遵义市|