【ESPIDF通用】LVGL移植ESP32通用教程(一)_哔哩哔哩_bilibili
1.显示屏和触摸的驱动函数 我使用的是JD9365 esp32P4使用的是DSI 双数据线驱动。
触摸是gsl3680 iic芯片
2.拿到源码后 将源码总文件命名为lvgl ,将lvgl->example->porting 接口文件剪切到lvgl同级,方便调用,espidf的文件引用较为复杂。 名称可以可以不该,我这里写成了lv_porting.
3.将lv_porting(porting)内的文件的后缀 _templete 删掉 然后在里面所有的。h文件中的_TEMPLETE 后缀也删除
将disp和indev中的 #if 0 改成1 .c .h 两个文件都需要改。这两个第一个是显示屏接口函数,第二个是触摸屏接口函数。 都需要使用。 fs为文件管理系统接口函数,后续可以打开。
4.在disp 中需要修改屏幕尺寸 缓存方式 屏幕初始化函数 屏幕刷新函数 屏幕刷新函数调用的是esp_lcd_panel_draw_bitmap();里面涉及到的句柄需要在 显示屏底层extern
需要注意的是 根据显示屏的位数 lvgl 提供 8 16 32三种模式 我的显示屏是24位 需要选择16位深然后在屏幕刷新函数中 进行位数转换,我这里使用的是esp32的psram去开辟缓冲区。
static void rgb565_to_rgb888(const uint16_t *src, uint8_t *dst, size_t pixel_count){ for (size_t i = 0; i < pixel_count; i++) { uint16_t pixel = src[i]; uint8_t r5 = (pixel >> 11) & 0x1F; uint8_t g6 = (pixel >> 5) & 0x3F; uint8_t b5 = pixel & 0x1F; uint8_t r8 = (r5 << 3) | (r5 >> 2); uint8_t g8 = (g6 << 2) | (g6 >> 4); uint8_t b8 = (b5 << 3) | (b5 >> 2); dst[i * 3 + 0] = r8; dst[i * 3 + 1] = g8; dst[i * 3 + 2] = b8; }}
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p){ int32_t w = area->x2 - area->x1 + 1; int32_t h = area->y2 - area->y1 + 1; size_t pixel_count = w * h; // 第一次分配 PSRAM if(buf24 == NULL) { buf24 = heap_caps_malloc(3 * pixel_count, MALLOC_CAP_SPIRAM); if(buf24 == NULL) { // 内存不足,直接结束刷新 lv_disp_flush_ready(disp_drv); return; } } // RGB565 → RGB888 rgb565_to_rgb888((const uint16_t *)color_p, buf24, pixel_count); // 注意 esp_lcd_panel_draw_bitmap 的 x2, y2 是 "右下角 + 1" esp_lcd_panel_draw_bitmap(panel_handle, area->x1, area->y1, area->x2 + 1, area->y2 + 1, buf24); // 告诉 LVGL 刷新完成 lv_disp_flush_ready(disp_drv);}
5.关于位深的选择在根目录lv_conf_temple.h 把他改名为lv_conf.h
将他启动后,LV_COLOR_DEPTH 就是位深