与 Studio “搏斗”
很奇怪,用 Studio 2.2.4 创建的瑞萨 RA6M4 项目里没有 RT-Thread Settings、Board Information、
RA Smart Configuration 等三个条目。
几番折腾未果后,重新安装 Studio 后问题解决,随后尝试为项目添加 LVGL 软件包。
奇怪的事情再次发生了:滚动条转了几个小时,没有任何进展。报着死马当活马医的想法,安装了 Env 工具。
先 pkgs --upgrade 再 pkgs --update,LVGL 软件包终于安装成功。
用 Smart Configuration 为项目添加 SPI0。
换用 Keil
受够了 Eclipse 了,使用 scons --target=mdk5 命令生成 Keil MDK5 工程。
移植 LVGL
为了本次实验,专门买了一块 3.5 寸触摸屏 。
以我拙见,LVGL 应该已经移植到 RT-Thread components/drivers (如 SPI)之上,所有实现了
RT-Thread SPI 接口的芯片都可以直接使用 LVGL。
但是事实上,LVGL 被移植到了 BSP 之上。
将 drv_spi_ili9488.c 添加到项目,好在这个模块是基于 RT-Thread SPI driver 实现,
简化掉一些不需要的内容就完成了移植。
LVGL Thread
LVGL 在一个单独的 Thread 里运行(这里我们测试 benchmark 示例):
void lv_entry(void *_)
{
lv_port_init();
lv_demo_benchmark();
while (1)
{
lv_task_handler();
rt_thread_mdelay(2);
}
}
void hal_entry(void)
{
rt_thread_t tid = rt_thread_create("lvgl", lv_entry, RT_NULL,
4096, RT_MAIN_THREAD_PRIORITY, 20);
rt_thread_startup(tid);
//...
}
实现绘制
依据 lv_port_disp_template.c 照葫芦画瓢创建 lv_port_disp.c。
基于点(lcd_draw_point_color)的绘制实现如下:
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
int32_t x;
int32_t y;
for(y = area->y1; y <= area->y2; y++) {
for(x = area->x1; x <= area->x2; x++) {
lcd_draw_point_color(x, y, color_p->full);
color_p++;
}
}
lv_disp_flush_ready(disp_drv);
}
显然,这种绘制方式效率非常低。drv_spi_ili9488.c 还提供了另一种批量填充方法 lcd_fill_array,利用这个函数重新实现 disp_flush 如下:
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
lcd_fill_array(area->x1, area->y1, area->x2, area->y2, color_p);
lv_disp_flush_ready(disp_drv);
}
RA6M4 使用 DMA 实现 lcd_fill_array 所需要的 SPI 数据传输,效率很高。
最后
很遗憾,lcd_fill_array 效果很不稳定,可能是杜邦线上的干扰,可能是 BSP 代码有问题。
lcd_draw_point_color 效率太低,刷新一次屏幕大概需要半分钟。
原作者:FLWX_7778
更多回帖