Migrating flush function from lvgl v6 to lvgl v9.2.2

Hi,

I am migrating from lvgl v6 to lvgl v9.2.2.

I registered two buffers, p_buffer_a points to buffer_A and p_buffer_b points to buffer_B.

But now lvgl made the variable lv_display_t private.
Maybe i can access in some other way, perhaps a public function ?!

Register Lcd and touch drivers:

// disp driver register   
    lv_display_t* display = lv_display_create(480, 854);
    lv_display_set_buffers(display, p_buffer_a, p_buffer_b, 480 * 854 * 2, LV_DISPLAY_RENDER_MODE_FULL);    
    lv_display_set_flush_cb(display, lcd_drv_display_flush);
// disp driver register    

// touch driver register    
    lv_indev_t* indev = lv_indev_create();
    lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
    lv_indev_set_read_cb(indev, touch_read);
// touch driver	register

Function to lvgl v9.2.2

void lcd_drv_display_flush( lv_display_t* drv, const lv_area_t* area, uint8_t* color_map )
{  
    uint32_t length = (uint32_t) ( 2 * ( lv_area_get_width(area) * lv_area_get_height(area) ) );  
        
    printf( "\nlength= %lu\n", length );

    if (color_map == p_buffer_a)
    { 
    
    #if lvgl_buffer_psram       
        Cache_WriteBack_Addr( (uint32_t)p_buffer_a, length );   
    #endif    

        lcd_drv_lcd_write_pixels_a( length, area );      
        lv_disp_flush_ready( drv );
    }
    else if(color_map == p_buffer_b )
    {

    #if lvgl_buffer_psram            
        Cache_WriteBack_Addr( (uint32_t)p_buffer_b, length );
    #endif

        lcd_drv_lcd_write_pixels_b( length, area );        
        lv_disp_flush_ready( drv );
    }
    else
    {
        printf("bug");
        return;
    }
}

Function to lvgl v6: Worked function

void lcd_drv_display_flush( lv_disp_drv_t* drv, const lv_area_t* area, lv_color_t* color_map ) 
{  
    (void) color_map;    

    uint32_t length = (uint32_t) ( 2 * ( lv_area_get_width(area) * lv_area_get_height(area) ) );  
        
    printf( "\nlength= %lu\n", length );

    if ( drv->buffer->buf_act == p_buffer_a )
    { 
    
    #if lvgl_buffer_psram       
        Cache_WriteBack_Addr( (uint32_t)p_buffer_a, length );   
    #endif    

        lcd_drv_lcd_write_pixels_a( length, area );      
        lv_disp_flush_ready( drv );
    }
    else if ( drv->buffer->buf_act == p_buffer_b )
    {

    #if lvgl_buffer_psram            
        Cache_WriteBack_Addr( (uint32_t)p_buffer_b, length );
    #endif

        lcd_drv_lcd_write_pixels_b( length, area );        
        lv_disp_flush_ready( drv );
    }
    else
    {
        printf("bug");
        return;
    }
}

Questions:
Will the new function to lvgl v9.2.2 work ?

Is there a way i can read “drv->buffer->buf_act” ?

Thank’s.

From what I tested, both options work:

void lcd_drv_display_flush( lv_display_t* drv, const lv_area_t* area, uint8_t* color_map )
{  
    uint32_t length = (uint32_t) ( 2 * ( lv_area_get_width(area) * lv_area_get_height(area) ) );  
        
    printf( "\nlength= %lu\n", length );

    if (color_map == (uint8_t*)p_buffer_a)
    { 
    
    #if lvgl_buffer_psram       
        Cache_WriteBack_Addr( (uint32_t)p_buffer_a, length );   
    #endif    

        lcd_drv_lcd_write_pixels_a( length, area );      
        lv_disp_flush_ready( drv );
    }
    else if(color_map == (uint8_t*)p_buffer_b )
    {

    #if lvgl_buffer_psram            
        Cache_WriteBack_Addr( (uint32_t)p_buffer_b, length );
    #endif

        lcd_drv_lcd_write_pixels_b( length, area );        
        lv_disp_flush_ready( drv );
    }
    else
    {
        printf("bug");
        return;
    }
}
void lcd_drv_display_flush( lv_display_t* drv, const lv_area_t* area, uint8_t* color_map )
{  
    (void)color_map;
	
	uint32_t length = (uint32_t) ( 2 * ( lv_area_get_width(area) * lv_area_get_height(area) ) ); 
        
    lv_draw_buf_t* p = lv_display_get_buf_active(drv); 
    uint8_t* p_buf_act = p->data;   
    
    printf( "\nlength= %lu\n", length );  // bytes

/*
    printf("\n\nPointers:\n");
    printf("color_map = %p\n", color_map);
    printf("p_buffer_a = %p\n", p_buffer_a);
    printf("p_buffer_b = %p\n", p_buffer_b);
    printf("p->data = %p\n", p->data);
    printf("p_buf_act = %p\n\n", p_buf_act);
*/    
    
    
    if (p_buf_act == (uint8_t*)p_buffer_a)
    { 
    
    #if lvgl_buffer_psram       
        Cache_WriteBack_Addr( (uint32_t)p_buffer_a, length );   
    #endif    

        lcd_drv_lcd_write_pixels_a( length, area );      
        lv_disp_flush_ready( drv );
    }
    else if(p_buf_act == (uint8_t*)p_buffer_b )
    {

    #if lvgl_buffer_psram            
        Cache_WriteBack_Addr( (uint32_t)p_buffer_b, length );
    #endif

        lcd_drv_lcd_write_pixels_b( length, area );        
        lv_disp_flush_ready( drv );
    }
    else
    {
        printf("bug");
        return;
    }
}

In “LV_DISPLAY_RENDER_MODE_FULL” work but with “LV_DISPLAY_RENDER_MODE_DIRECT” dont work, and i dont know why.


.

Hi,

Any suggestions?

Could it be a problem with the microcontroller cache or my display driver ?