移植通用流程

  1. 下载lvgl源码
https://github.com/lvgl/lvgl/
  1. 删除没有用的文件和文件夹

1

  1. 将lv_conf_template.h复制并改名为lv_conf.h

  2. 修改lv_conf.h中的#if 0为#if 1

  3. lvgl代码初始化流程:

    1. 设置分辨率和缓冲区大小。
    #define LV_HOR_RES_MAX 480   // 水平分辨率
    #define LV_VER_RES_MAX 320   // 垂直分辨率
    #define LV_BUF_SIZE (LV_HOR_RES_MAX * 5) // 缓冲区大小(行数)
    
    static lv_disp_draw_buf_t draw_buf;     // LVGL绘制缓冲区 静态分配内存?
    static lv_color_t buf1[LV_BUF_SIZE];    // 第一缓冲区
    static lv_color_t buf2[LV_BUF_SIZE];    // 第二缓冲区(双缓冲)
    
    lv_disp_draw_buf_init(&draw_buf, buf1, buf2, LV_BUF_SIZE);
    
    1. 给lvgl提供心跳时钟
    lv_tick_inc(1); // 可以在定时中断或者linux定时函数中调用
    
    1. 注册显示驱动,为lvgl提供绘图函数
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.hor_res = 480;//设置LVGL实际分辨率
    disp_drv.ver_res = 320;
    disp_drv.flush_cb = my_disp_flush;  // 注册刷新回调
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register(&disp_drv);
    
    1. 提供绘图函数给lvgl
    void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {
    	//调用硬件进行画矩形或者画像素点
        
        // 通知LVGL绘画完成
        lv_disp_flush_ready(disp); 
    }
    
    1. 输入设备(伪代码)
    void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data){
    	data->point.x = x;//具体的x坐标
        data->point.y = y;//具体的y坐标
        data->state = type;//按下的类型
    }
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = evdev_read;
    lv_indev_drv_register(&indev_drv);
    
    1. 在main里面调用lv_init(),在while(1)调用lv_timer_handler()。

    lv_timer_handler()LVGL调度函数,发现需要重绘,安排刷新,发现LVGL定时器完成处理定时回调,分发用户输入事件的回调。

MCU移植

ESP(arduino)

具体移步到

099_lvgl初始化基于esp8266.md

ESP(idf)

待写

常规mcu

待写

Linux移植

具体移步到

099_lvgl移植到imx6ull.md

099_lvgl移植linux-通用.md