平台移植

移植文件位于 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);
        void (*fb_clear)(uint8_t *addr, gui_color_t color, uint32_t len);
        //todo
        void (*draw_circle)(draw_circle_t *circle, gui_dispdev_t *dc, gui_rect_t *rect);
        void (*blur)(gui_dispdev_t *dc, gui_rect_t *rect, uint8_t blur_degree, void *cache_mem);
    
        void *(* jpeg_load)(void *input, int len, int *w, int *h, int *channel);
        void (* jpeg_free)(void *);
        void *(* idu_load)(void *input);
        void (* idu_free)(void *);
        bool enable_async;
        bool enable_thread_sync;
        void *hw_acc_cache_mem; //for hardware acceleration cache memory
        uint32_t hw_acc_cache_size; //for hardware acceleration cache memory size
    
        // void (*draw_rectangle)(canvas_rectangle_t *r, struct gui_dispdev *dc);
        // void (*draw_arc)(canvas_arc_t *a, struct gui_dispdev *dc);
        // void (*draw_line)(canvas_line_t *l, struct gui_dispdev *dc);
        // void (*draw_polyline)(canvas_polyline_t *p, struct gui_dispdev *dc);
        // void (*draw_path)(draw_path_t *path, struct gui_dispdev *dc);
        // void (*draw_wave)(canvas_wave_t *w, struct gui_dispdev *dc);
        // void (*draw_palette_wheel)(canvas_palette_wheel_t *pw, struct gui_dispdev *dc);
    
        // void (*draw_svg)(void *svg, uint32_t data_length, struct gui_dispdev *dc, int x, int y,
        //                  float scale, float rotate_degree, float rotate_center_x, float rotate_center_y);
        // void (*begin_path)(canvas_path_t *data);
        // void (*move_to)(canvas_path_t *data, float x, float y);
        // void (*bezier_to)(canvas_path_t *data, float c1x, float c1y, float c2x, float c2y, float x,
        //                   float y);
        // void (*LineTo)(canvas_path_t *data, float x, float y);
    
    } acc_engine_t;
    

显示设备

  • 参考 guidef.hgui_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 fb_measure_enable;
        bool cache_need_clean;
    } gui_dispdev_t;
    
  • 一个典型的 gui_dispdev 结构体初始化示例:

    static struct gui_dispdev dc =
    {
    #ifdef USE_DC_PFB
        .fb_height = LCD_SECTION_HEIGHT,
        .fb_width = DRV_LCD_WIDTH,
        .type = DC_RAMLESS,
    #else
        .fb_height = DRV_LCD_HEIGHT,
        .fb_width = DRV_LCD_WIDTH,
        .type = DC_SINGLE,
    #endif
        .section = {0, 0, 0, 0},
        .section_count = 0,
        .screen_width =  DRV_LCD_WIDTH,
        .screen_height = DRV_LCD_HEIGHT,
        .bit_depth = DRV_PIXEL_BITS,
        .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.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_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.hgui_port_ftl.c

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

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

  • 结构体定义如下:

    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.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_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;
    

休眠管理

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

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