平台移植

移植文件位于 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.h 和 gui_port_acc.c。

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

  • 结构体定义如下:

    typedef struct acc_engine
    {
        const gui_blit_ops_t *blit;
        void (*fb_clear)(uint8_t *addr, gui_color_t color, uint32_t len);
        gui_blur_ops_t *blur;
        const gui_jpeg_ops_t *jpeg;
        const gui_png_ops_t *png;
        const gui_idu_ops_t *idu;
        bool enable_thread_sync;
        void *cache_mem;
        uint32_t cache_size;
    
    } acc_engine_t;
    

显示设备

  • 参考 guidef.h 和 gui_port_dc.c。

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

  • 结构体定义如下:

    typedef struct gui_dispdev
    {
        /* width and height */
        uint16_t screen_width;
        uint16_t screen_height;
        uint16_t fb_width;
        uint16_t fb_height;
        uint16_t bit_depth;
        uint16_t driver_ic_scan_line_time_us;
        uint16_t host_write_line_time_us;
        uint16_t target_w;
        uint16_t target_h;
        T_GUI_DC_TYPE type;
        T_GUI_PFB_TYPE pfb_type;
        /* pixel data */
        uint8_t *frame_buf;
        uint8_t *shot_buf;
        uint8_t *disp_buf_1;
        uint8_t *disp_buf_2;
    
        gui_rect_t section;
        uint32_t section_count;
        uint32_t section_total;
        void (*lcd_update)(struct gui_dispdev *dc);
        void (*direct_draw_bitmap_to_lcd)(int16_t x, int16_t y, int16_t width, int16_t height,
                                          const uint8_t *bitmap);
        void (*virtual_lcd_update)(struct gui_dispdev *dc);
        int (*flash_seq_trans_enable)(void);
        int (*flash_seq_trans_disable)(void);
        uint32_t (*get_lcd_us)(void);
        void (*reset_lcd_timer)(void);
        void (*lcd_te_wait)(void);
        void (*lcd_power_on)(void);
        void (*lcd_power_off)(void);
        void (*lcd_draw_sync)(void);
        uint8_t *lcd_gram;
        uint32_t frame_count;
        bool draw_fb_measure_enable;
        bool cache_need_clean;
    } gui_dispdev_t;
    
  • 一个典型的 gui_dispdev 结构体初始化示例:

    /* The screen fields are written by gui_port_dc_init() before gui_dc_info_register(),
     * so a project.json on the command line can override the DRV_LCD_* defaults. */
    static struct gui_dispdev dc =
    {
        .section = {0, 0, 0, 0},
        .section_count = 0,
        .lcd_update = port_gui_lcd_update,
    
    };
    
  • 在 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.h 和 gui_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_dir_t *(*opendir)(const char *name);
        struct gui_fs_dirent *(*readdir)(gui_dir_t *d);
        int (*closedir)(gui_dir_t *d);
        int (*ioctl)(int fildes, int cmd, ...);
        void (*fstat)(int fildes, gui_fstat_t *buf);
    };
    

闪存转换层

  • 参考 guidef.h 和 gui_port_ftl.c

  • 需要定义闪存转换层的三个接口: read , write , erase。

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

  • 结构体定义如下:

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

输入设备

  • 参考 guidef.h 和 gui_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_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.h 和 gui_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;
    

休眠管理

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

在芯片手册中,这种外设可以关闭的低功耗状态被称为深度低功耗状态(DLPS)。关于 DLPS 的更多信息,可以在 SDK 的相关指导文档中找到。