平台移植

移植文件位于 gui_port 文件夹中。需要修改六个文件,其文件名与功能如下。

文件名

功能

gui_port_acc.c

加速

gui_port_dc.c

显示设备

gui_port_filesystem.c

文件系统

gui_port_ftl.c

闪存转换层

gui_port_indev.c

输入设备

gui_port_os.c

操作系统

目前已在FreeRTOS、RT-Thread和Windows上进行了移植,可供参考。

加速

  • 参考 guidef.hgui_port_acc.c

  • 需要根据平台型号,定义加速绘制接口,一般是``hw_acc_blit``或者``sw_acc_blit``。

  • 结构体定义如下:

    typedef struct acc_engine
    {
        void (*blit)(draw_img_t *image, gui_dispdev_t *dc, gui_rect_t *rect);
    } acc_engine_t;
    

显示设备

  • 参考 guidef.hgui_port_dc.c

  • 需要定义屏幕的宽度和高度、帧缓冲区地址和模式、分辨率是否缩放等等,并实现刷新函数,结构体定义参考 guidef.h

  • 一个典型的``gui_dispdev``结构体初始化声明如下:

    static struct gui_dispdev dc =
    {
        .bit_depth = DRV_PIXEL_BITS,
        .fb_width = DRV_LCD_WIDTH,
        .fb_height = FB_HEIGHT,
        .screen_width =  DRV_LCD_WIDTH,
        .screen_height = DRV_LCD_HIGHT,
        .dc.disp_buf_1 = disp_write_buff1_port,
        .dc.disp_buf_2 = disp_write_buff2_port,
        .driver_ic_fps = 60,
        .driver_ic_hfp = 10,
        .driver_ic_hbp = 10,
        .driver_ic_active_width = DRV_LCD_WIDTH,
        .type = DC_RAMLESS,
        .adaption = false,
        .section = {0, 0, 0, 0},
        .section_count = 0,
        .lcd_update = port_gui_lcd_update,
        .flash_seq_trans_disable = flash_boost_disable,
        .flash_seq_trans_enable = flash_boost_enable,
        .reset_lcd_timer = reset_vendor_counter,
        .get_lcd_us = read_vendor_counter_no_display,
        .lcd_te_wait = port_lcd_te_wait,
        .dc.scale_x = 1,
        .dc.scale_y = 1,
    };
    
  • DC_SINGLE 模式下,帧缓冲区的大小为 screen_width * screen_height * bit_depth / 8

  • DC_RAMLESS 模式下,使用了两个部分帧缓冲区,大小为``fb_width*fb_height * bit_depth / 8``,此时的``fb_height``是分段高度。

支持接口类型

以下表格列出了主流芯片支持的与LCD相关的接口。如果您想了解更多信息,请点击特定芯片的名称。

芯片

I8080

QSPI

RGB

MIPI

SPI

RTL8762C

Y

NA

NA

NA

Y

RTL8762D

Y

Y

NA

NA

Y

RTL8763E

Y

Y

NA

NA

Y

RTL8772G

Y

Y

Y

NA

Y

RTL8773E

Y

Y

Y

NA

Y

备注

‘Y’ 表示驱动程序已包含在库中。 ‘NA’ 表示驱动程序尚未包含在库中。

已验证屏幕驱动

以下表格列出了主流芯片支持的与LCD相关的驱动IC。如果您想了解更多信息,请点击特定芯片的名称。

芯片

EK9716

ICNA3311

NT35510

NV3047

ST7701S

ST77903

ST7796

OTM8009A

SH8601A

SH8601Z

RM69330

ST7789

NV3041A

RTL8762D

NA

NA

NA

NA

NA

NA

Y

NA

NA

NA

Y

Y

Y

RTL8763E

NA

NA

Y

NA

NA

NA

NA

NA

NA

Y

NA

NA

NA

RTL8772G

Y

Y

Y

Y

Y

Y

Y

NA

NA

NA

NA

NA

NA

RTL8773E

NA

NA

NA

NA

NA

NA

NA

NA

Y

NA

NA

NA

NA

备注

‘Y’ 表示驱动程序已包含在库中。 ‘NA’ 表示驱动程序尚未包含在库中。

文件系统

  • 参考 guidef.hgui_port_filesystem.c

  • 需要定义几个类似 posix 风格的接口操作文件和文件夹。

  • 不使用文件系统时可以填入空指针。

  • 结构体定义如下:

    struct gui_fs
    {
        int (*open)(const char *file, int flags, ...);
        int (*close)(int d);
        int (*read)(int fd, void *buf, size_t len);
        int (*write)(int fd, const void *buf, size_t len);
        int (*lseek)(int fd, int offset, int whence);
        /* directory api*/
        gui_fs_dir *(*opendir)(const char *name);
        struct gui_fs_dirent *(*readdir)(gui_fs_dir *d);
        int (*closedir)(gui_fs_dir *d);
        int (*ioctl)(int fildes, int cmd, ...);
        void (*fstat)(int fildes, gui_fs_stat_t *buf);
    };
    

闪存转换层

  • 参考 guidef.hgui_port_ftl.c

  • 需要定义闪存转换层的三个接口:readwriteerase

  • 不使用闪存转换层时可以填入空指针。

  • 结构体定义如下:

    struct gui_ftl
    {
        int (*read)(uint32_t addr, uint8_t *buf, uint32_t len);
        int (*write)(uint32_t addr, const uint8_t *buf, uint32_t len);
        int (*erase)(uint32_t addr, uint32_t len);
    };
    

输入设备

  • 参考 guidef.hgui_port_indev.c

  • 输入设备包括触摸板、键盘和滚轮,输入信息的结构体如下:

    typedef struct gui_indev
    {
        uint16_t tp_witdh;
        uint16_t tp_height;
        uint32_t touch_timeout_ms;
        uint16_t long_button_time_ms;
        uint16_t short_button_time_ms;
        uint16_t kb_long_button_time_ms;
        uint16_t kb_short_button_time_ms;
        uint16_t quick_slide_time_ms;
    
        void (*ext_button_indicate)(void (*callback)(void));
    
        gui_touch_port_data_t *(*tp_get_data)(void);
    
        gui_kb_port_data_t *(*kb_get_port_data)(void);
    
        gui_wheel_port_data_t *(*wheel_get_port_data)(void);
    } gui_indev_t;
    
  • 如果需要某一种输入设备,需要在``gui_indev``中实现对应的数度获取函数,并填写所需的时间阈值。

触摸芯片

以下表格列出了所有芯片支持的与触摸相关的IC。如果您想了解更多信息,请点击特定芯片的名称。

芯片

CST816S

CHSC6417

FT3169

GT911

ZT2717

CST816T

GT9147

RTL8762D

Y

NA

NA

NA

NA

NA

NA

RTL8763E

NA

NA

NA

NA

NA

Y

Y

RTL8772G

NA

NA

NA

Y

Y

NA

NA

RTL8773E

Y

NA

NA

Y

NA

NA

NA

备注

‘Y’ 表示驱动程序已包含在库中。 ‘NA’ 表示驱动程序尚未包含在库中。

操作系统

  • 参考 guidef.hgui_port_os.c

  • 需要定义线程、定时器、消息队列和内存管理的接口,结构体定义如下:

    typedef struct gui_os_api
    {
        char *name;
        void *(*thread_create)(const char *name, void (*entry)(void *param), void *param,
                               uint32_t stack_size, uint8_t priority);
        bool (*thread_delete)(void *handle);
        bool (*thread_suspend)(void *handle);
        bool (*thread_resume)(void *handle);
        bool (*thread_mdelay)(uint32_t ms);
        uint32_t (*thread_ms_get)(void);
        uint32_t (*thread_us_get)(void);
        bool (*mq_create)(void *handle, const char *name, uint32_t msg_size, uint32_t max_msgs);
        bool (*mq_send)(void *handle, void *buffer, uint32_t size, uint32_t timeout);
        bool (*mq_send_urgent)(void *handle, void *buffer, uint32_t size, uint32_t timeout);
        bool (*mq_recv)(void *handle, void *buffer, uint32_t size, uint32_t timeout);
    
        void *(*f_malloc)(uint32_t);
        void *(*f_realloc)(void *ptr, uint32_t);
        void (*f_free)(void *rmem);
    
        void (*gui_sleep_cb)(void);
    
        void *mem_addr;
        uint32_t mem_size;
    
        uint32_t mem_threshold_size;
        void *lower_mem_addr;
        uint32_t lower_mem_size;
    
        log_func_t log;
        void (*gui_tick_hook)(void);
    } gui_os_api_t;
    

休眠管理

为了降低功耗和增加设备的使用时间,支持睡眠(低功耗)模式。

  • 参考 gui_app.h

    typedef struct gui_app gui_app_t;
    struct gui_app
    {
        gui_obj_t screen;               //!< 控件树的根节点
        const char *xml;                //!< 控件树的设计文件
        uint32_t active_ms;             //!< 屏幕关闭延时
        void *thread_id;                //!< 线程句柄(可选)
        void (* thread_entry)(void *this); //!< 线程入口函数
        void (* ctor)(void *this);      //!< 构造函数
        void (* dtor)(void *this);      //!< 析构函数
        void (* ui_design)(gui_app_t *); //!< UI创建入口函数
        bool lvgl;
        bool arm2d;
        bool close;
        bool next;
        bool close_sync;
    };
    

active_ms 是 gui 应用程序的待机时间,可以在不同的应用程序中定义为不同的值。与其他类型的电子设备一样,当屏幕持续显示一个界面的时间超过待机时间时,设备将进入睡眠模式。在睡眠状态下,通过触摸触摸板、按键或发送消息可以唤醒设备。在芯片手册中,这种外设可以关闭的低功耗状态被称为深度低功耗状态(DLPS)。关于DLPS的更多信息,可以在SDK的相关指导文档中找到。