ESPIDF 移植lvgl 8.3

131 阅读2分钟

【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 就是位深  

后续内容参考【ESPIDF通用】LVGL移植ESP32通用教程(一)_哔哩哔哩_bilibili