RT-Thread论坛
直播中

donatello1996

7年用户 687经验值
擅长:处理器/DSP 控制/MCU RF/无线
私信 关注
[经验]

【Vision Board创客营连载体验】RA8D1-Vision Board 成功移植LVGL9.1(非GPU2D加速模式)

       截至文章发布日期,GPU2D加速模式下的显示仍然有bug,而且还挺严重,因此先分享不使用GPU2D加速模式的LVGL9.1图形库移植。
       LVGL9.1的代码风格与之前用的LVGL8.3存在较大差异,源码库的各个源文件也有一定程度的改名,特别是按键触摸回调函数的更新,让我之前刚刚适应的LVGL8.3的风格与之起了很大的冲突,目前我RA8D1-Vision Board的工程移植LVGL9.1,显示上没有任何问题,触摸也能正常响应。
23.jpg

       光看源码列表就可以看出与LVGL8.3的极大差异:
24.jpg 25.jpg 26.jpg 27.jpg 28.jpg 29.jpg 30.jpg 31.jpg 32.jpg 33.jpg 34.jpg 35.jpg 36.jpg 37.jpg

然后依旧是跟LVGL8.3版本移植一致的步骤,重写disp_flush函数:
  1. static void disp_flush(lv_display_t * disp_drv, const lv_area_t * area, uint8_t * px_map)

    {

            int i = 0;

            if(disp_flush_enabled)

            {

                    uint16_t x , y;

                    for(y = area->y1; y <= area->y2; y++)

                    {

                                    for(x = area->x1; x <= area->x2; x++)

                                    {

                                            //*(px_map) = 0xff - *(px_map);

                                            lcd_current_working_buffer[(y * MY_DISP_HOR_RES) + x] = (*(px_map) << 8) | *(px_map + 1);

                                            px_map += 2;

                                    }

                    }

  2. //                printf("area = %d.\n" , (area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1));

  3. //                LVGL_Draw_G2d(area->x1 , area->y1 , area->x2 , area->y2 , px_map);

            }

  4.         lv_display_flush_ready(disp_drv);

    }

不一样的是,LVGL9.1库默认的缓存数据类型为u8,而不是LVGL8.3的数据结构类型,因此需要做u8->u16的数据格式转换,一个非常简单的小算法;

数据位数16位,配置一致:
38.jpg

LVGL初始化函数中设置刷屏缓存为10行一个缓存单位,设置50行也行:
  1. void lv_port_disp_init(void)

    {

        /*-------------------------

         * Initialize your display

         * -----------------------*/

        disp_init();

  2.     /*------------------------------------

         * Create a display and set a flush_cb

         * -----------------------------------*/

        lv_display_t * disp = lv_display_create(MY_DISP_HOR_RES, MY_DISP_VER_RES);

        lv_display_set_flush_cb(disp, disp_flush);

  3.     /* Example 1

         * One buffer for partial rendering*/

        static lv_color_t buf_1_1[MY_DISP_HOR_RES * 10];                          /*A buffer for 10 rows*/

        lv_display_set_buffers(disp, buf_1_1, NULL, sizeof(buf_1_1), LV_DISPLAY_RENDER_MODE_PARTIAL);

  4. //    /* Example 2

    //     * Two buffers for partial rendering

    //     * In flush_cb DMA or similar hardware should be used to update the display in the background.*/

    //    static lv_color_t buf_2_1[MY_DISP_HOR_RES * 10];

    //    static lv_color_t buf_2_2[MY_DISP_HOR_RES * 10];

    //    lv_display_set_buffers(disp, buf_2_1, buf_2_2, sizeof(buf_2_1), LV_DISPLAY_RENDER_MODE_PARTIAL);

  5. //    /* Example 3

    //     * Two buffers screen sized buffer for double buffering.

    //     * Both LV_DISPLAY_RENDER_MODE_DIRECT and LV_DISPLAY_RENDER_MODE_FULL works, see their comments*/

    //    static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES];

    //    static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES];

    //    lv_display_set_buffers(disp, buf_3_1, buf_3_2, sizeof(buf_3_1), LV_DISPLAY_RENDER_MODE_DIRECT);

  6. }

  7. 添加4个按钮:

    void lv_example_button_1(void)

    {

           

            lv_obj_t *label;

            dropdown_font = &lv_font_montserrat_22;

            dropdown_width = 150;

  8.         btn1 = lv_button_create(lv_screen_active());

            lv_obj_set_size(btn1, 200 , 50);

            lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL);

            lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -40);

            lv_obj_remove_flag(btn1, LV_OBJ_FLAG_PRESS_LOCK);

  9.         label = lv_label_create(btn1);

            lv_label_set_text(label, "Button");

            lv_obj_set_style_text_font(label, dropdown_font, LV_PART_MAIN);

            lv_obj_set_width(label, dropdown_width);

            lv_obj_center(label);

  10.         btn2 = lv_button_create(lv_screen_active());

            lv_obj_set_size(btn2 , 200 , 50);

            lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_ALL, NULL);

            lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 40);

            lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);

            lv_obj_set_height(btn2, LV_SIZE_CONTENT);

  11.         label = lv_label_create(btn2);

            lv_label_set_text(label, "Toggle");

            lv_obj_set_style_text_font(label, dropdown_font, LV_PART_MAIN);

            lv_obj_set_width(label, dropdown_width);

            lv_obj_center(label);

           

            btn3 = lv_button_create(lv_screen_active());

            lv_obj_set_size(btn3, 200 , 50);

            lv_obj_add_event_cb(btn3, event_handler, LV_EVENT_ALL, NULL);

            lv_obj_align(btn3, LV_ALIGN_CENTER, 300, -40);

            lv_obj_remove_flag(btn3, LV_OBJ_FLAG_PRESS_LOCK);

  12.         label = lv_label_create(btn3);

            lv_label_set_text(label, "Button");

            lv_obj_set_style_text_font(label, dropdown_font, LV_PART_MAIN);

            lv_obj_set_width(label, dropdown_width);

            lv_obj_center(label);

  13.         btn4 = lv_button_create(lv_screen_active());

            lv_obj_set_size(btn4 , 200 , 50);

            lv_obj_add_event_cb(btn4, event_handler, LV_EVENT_ALL, NULL);

            lv_obj_align(btn4, LV_ALIGN_CENTER, 300 , 40);

            lv_obj_add_flag(btn4, LV_OBJ_FLAG_CHECKABLE);

            lv_obj_set_height(btn4, LV_SIZE_CONTENT);

  14.         label = lv_label_create(btn4);

            lv_label_set_text(label, "Toggle");

            lv_obj_set_style_text_font(label, dropdown_font, LV_PART_MAIN);

            lv_obj_set_width(label, dropdown_width);

            lv_obj_center(label);

  15. }


触摸部分,直接使用之前已经调试好的FT_5426驱动:
  1. extern uint8_t FT5426_Scan();

  2. static void touchpad_read(lv_indev_t * indev_drv, lv_indev_data_t * data)

    {

            static int32_t last_x = 0;

            static int32_t last_y = 0;

  3.         FT5426_Scan();

            if(touchpad_is_pressed())

            {

                            touchpad_get_xy(&last_x, &last_y);

                            data->state = LV_INDEV_STATE_PR;

            }

            else {

                            data->state = LV_INDEV_STATE_REL;

            }

  4.         /*Set the last pressed coordinates*/

            data->point.x = last_x;

            data->point.y = last_y;

    }

  5. extern uint16_t touch_x[5];

    extern uint16_t touch_y[5];

  6. extern uint16_t touch_sta;

  7. #define TP_PRES_DOWN                                                                    0x8000

  8. static bool touchpad_is_pressed(void)

    {

            if (touch_sta == 0xc001)

            {

                            return true;

            }

            return false;

    }

  9. static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)

    {

            (*x) = touch_x[0];

            (*y) = touch_y[0];

    }

39.jpg 微信图片_20240530205823.jpg 微信图片_20240530205826.jpg 微信图片_20240530205829.jpg

更多回帖

发帖
×
20
完善资料,
赚取积分