平台移植
移植文件位于 gui_port 文件夹中。需要修改六个文件,其文件名与功能如下。
文件名 |
功能 |
|---|---|
|
加速 |
|
显示设备 |
|
文件系统 |
|
闪存转换层 |
|
输入设备 |
|
操作系统 |
目前已在 FreeRTOS 、 RT-Thread 和 Windows 上进行了移植,可供参考。
加速
参考
guidef.h和gui_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.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 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 |
|---|---|---|---|---|---|
Y |
NA |
NA |
NA |
Y |
|
Y |
Y |
NA |
NA |
Y |
|
Y |
Y |
NA |
NA |
Y |
|
Y |
Y |
Y |
NA |
Y |
|
Y |
Y |
Y |
NA |
Y |
备注
'Y' 表示驱动程序已包含在库中。 'NA' 表示驱动程序尚未包含在库中。
已验证屏幕驱动
以下表格列出了主流芯片支持的与 LCD 相关的驱动 IC 。如果您想了解更多信息,请点击特定芯片的名称。
芯片 |
EK9716 |
ICNA3311 |
NT35510 |
NV3047 |
ST7701S |
ST77903 |
ST7796 |
OTM8009A |
SH8601A |
SH8601Z |
RM69330 |
ST7789 |
NV3041A |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
NA |
NA |
NA |
NA |
NA |
NA |
Y |
NA |
NA |
NA |
Y |
Y |
Y |
|
NA |
NA |
Y |
NA |
NA |
NA |
NA |
NA |
NA |
Y |
NA |
NA |
NA |
|
Y |
Y |
Y |
Y |
Y |
Y |
Y |
NA |
NA |
NA |
NA |
NA |
NA |
|
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 |
|---|---|---|---|---|---|---|---|
Y |
NA |
NA |
NA |
NA |
NA |
NA |
|
NA |
NA |
NA |
NA |
NA |
Y |
Y |
|
NA |
NA |
NA |
Y |
Y |
NA |
NA |
|
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 的相关指导文档中找到。