搜索
bottom↓
回复: 14

AWTK 中 LCD 接口的四种实现方式

[复制链接]

出0入0汤圆

发表于 2019-11-14 10:21:30 | 显示全部楼层 |阅读模式
本帖最后由 lixianjing 于 2019-11-14 10:23 编辑

AWTK 中 LCD 接口的四种实现方式

LCD 是对显示设备的抽象,提供了基本的绘图函数。自己去实现 LCD 接口虽然不难,但是需要花费不少功夫,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:

    1. #include "tftlcd.h"
    2. #include "tkc/mem.h"
    3. #include "lcd/lcd_reg.h"

    4. typedef uint16_t pixel_t;

    5. #define LCD_FORMAT BITMAP_FMT_BGR565
    6. #define pixel_from_rgb(r, g, b)                                                \
    7.   ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3))
    8. #define pixel_to_rgba(p)                                                       \
    9.   { (0xff &amp; ((p >> 11) << 3)), (0xff &amp; ((p >> 5) << 2)), (0xff &amp; (p << 3)) }

    10. #define set_window_func LCD_Set_Window
    11. #define write_data_func AA*****ta_Color

    12. #include "base/pixel.h"
    13. #include "blend/pixel_ops.inc"
    14. #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:

    1. #include "tftlcd.h"

    2. #include "tkc/mem.h"
    3. #include "lcd/lcd_mem_fragment.h"

    4. typedef uint16_t pixel_t;

    5. #define LCD_FORMAT BITMAP_FMT_BGR565
    6. #define pixel_from_rgb(r, g, b)                                                \
    7.   ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3))
    8. #define pixel_to_rgba(p)                                                       \
    9.   { (0xff &amp; ((p >> 11) << 3)), (0xff &amp; ((p >> 5) << 2)), (0xff &amp; (p << 3)) }

    10. #define set_window_func LCD_Set_Window
    11. #define write_data_func AA*****ta_Color

    12. #include "base/pixel.h"
    13. #include "blend/pixel_ops.inc"
    14. #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 的实现:

    1. extern u32 *ltdc_framebuf[2];
    2. #define online_fb_addr (uint8_t*)ltdc_framebuf[0]
    3. #define offline_fb_addr (uint8_t*)ltdc_framebuf[1]

    4. lcd_t* platform_create_lcd(wh_t w, wh_t h) {
    5.   return lcd_mem_rgb565_create_double_fb(w, h, online_fb_addr, offline_fb_addr);
    6. }
    复制代码


    四、基于 vgcanvas 实现的 LCD

    在支持 OpenGL 3D 硬件加速的平台上(如 PC 和手机),我们使用 nanovg 把 OpenGL 封装成 vgcanvas 的接口,在 vgcanvas 基础之上实现 LCD。lcd_vgcanvas.inc 将 vgcanvas 封装成 LCD 的接口,这里出于可移植性考虑,并没有直接基于 nanovg 的函数,而是基于 vgcanvas 的接口,所以在没有 GPU 时,如果 CPU 够强大,也是可以基于 agg/picasso 去实现的 LCD。

    这种方式实现,一般不会在嵌入平台上使用,读者不需要关注它。


    总结

    以上几种实现方式,基本上涵盖了最常用的场景,所以在移植 AWTK 到新的平台时,并不需要在实现 LCD 接口上费多少功夫。
  • 出0入0汤圆

    发表于 2019-11-14 10:33:19 | 显示全部楼层
    支持,大力支持。

    出0入0汤圆

    发表于 2019-11-14 12:49:19 来自手机 | 显示全部楼层
    顶。。。。支持。

    出130入0汤圆

    发表于 2019-11-14 12:57:14 来自手机 | 显示全部楼层
    很好,有时间试试这个gui

    出0入0汤圆

    发表于 2019-11-14 13:54:49 | 显示全部楼层
    刚刚意识到楼主是AWTK的原作者
    膜拜

    出0入8汤圆

    发表于 2019-11-14 14:04:59 | 显示全部楼层
    顶,多谢分享!

    出0入0汤圆

    发表于 2020-1-30 23:02:52 | 显示全部楼层
    大神 李先静, 关注AWTK

    出0入0汤圆

    发表于 2020-1-31 01:54:58 | 显示全部楼层
    看着真不错,不过这个能支持单色屏么?工业设备上160*160、320*240的单色屏很多的

    出0入17汤圆

    发表于 2020-1-31 11:27:31 来自手机 | 显示全部楼层
    膜拜楼主

    出0入0汤圆

    发表于 2020-1-31 18:24:26 | 显示全部楼层
    这个很强

    出0入0汤圆

    发表于 2020-3-7 10:35:04 | 显示全部楼层
    请问有没人用过awtk,我现在显示的方字不对,有没人知怎么回事呀。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x

    出0入0汤圆

    发表于 2020-3-12 21:31:09 | 显示全部楼层
    楼主在吗?请问移植到linux上运行后出现白屏的现象,可能是什么问题?谢谢!

    出0入0汤圆

    发表于 2020-4-17 00:00:33 | 显示全部楼层
    在自己的orangepi上跑起来了,还截了个图,很好的GUI

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x

    出0入0汤圆

    发表于 2020-5-3 00:37:03 | 显示全部楼层
    强大,感谢作者

    出0入0汤圆

    发表于 2020-6-16 13:10:34 | 显示全部楼层
    支持国产,希望能成立一个专版
    回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

    GMT+8, 2024-4-19 04:45

    © Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

    快速回复 返回顶部 返回列表