lv_port_disp.c lvgl711 - JohnHau/mis GitHub Wiki

/**

  • @file lv_port_disp_templ.c

*/

/Copy this file as "lv_port_disp.c" and set this value to "1" to enable content/ #if 1

/*********************

  •  INCLUDES
    

/ #include "lv_port_disp.h" #include "porting/ST7565.h" /

  •  DEFINES
    

*********************/

/**********************

  •  TYPEDEFS
    

**********************/

/**********************

  • STATIC PROTOTYPES **********************/ // static void disp_init(void);

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p); #if LV_USE_GPU static void gpu_blend(lv_disp_drv_t * disp_drv, lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa); static void gpu_fill(lv_disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width, const lv_area_t * fill_area, lv_color_t color); #endif

/**********************

  • STATIC VARIABLES **********************/

/**********************

  •  MACROS
    

**********************/

/**********************

  • GLOBAL FUNCTIONS **********************/

void lv_port_disp_init(void) { /------------------------- * Initialize your display * -----------------------/ //disp_init();

/*-----------------------------
 * Create a buffer for drawing
 *----------------------------*/

/* LVGL requires a buffer where it draws the objects. The buffer's has to be greater than 1 display row
 *
 * There are three buffering configurations:
 * 1. Create ONE buffer with some rows: 
 *      LVGL will draw the display's content here and writes it to your display
 * 
 * 2. Create TWO buffer with some rows: 
 *      LVGL will draw the display's content to a buffer and writes it your display.
 *      You should use DMA to write the buffer's content to the display.
 *      It will enable LVGL to draw the next part of the screen to the other buffer while
 *      the data is being sent form the first buffer. It makes rendering and flushing parallel.
 * 
 * 3. Create TWO screen-sized buffer: 
 *      Similar to 2) but the buffer have to be screen sized. When LVGL is ready it will give the
 *      whole frame to display. This way you only need to change the frame buffer's address instead of
 *      copying the pixels.
 * */

/* Example for 1) */
static lv_disp_buf_t disp_buf_1;
//static lv_color_t buf1_1[LV_HOR_RES_MAX * 118U];                      /*A buffer for 59 rows*/
//lv_disp_buf_init(&disp_buf_1, buf1_1, NULL, LV_HOR_RES_MAX * 118U);   /*Initialize the display buffer*/
lv_disp_buf_init(&disp_buf_1, lcd_fb, NULL, LV_HOR_RES_MAX * LV_VER_RES_MAX);

#if 0 /* Example for 2) */ static lv_disp_buf_t disp_buf_2; static lv_color_t buf2_1[LV_HOR_RES_MAX * 10]; /A buffer for 10 rows/ static lv_color_t buf2_2[LV_HOR_RES_MAX * 10]; /An other buffer for 10 rows/ lv_disp_buf_init(&disp_buf_2, buf2_1, buf2_2, LV_HOR_RES_MAX * 10); /Initialize the display buffer/

/* Example for 3) */
static lv_disp_buf_t disp_buf_3;
static lv_color_t buf3_1[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*A screen sized buffer*/
static lv_color_t buf3_2[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*An other screen sized buffer*/
lv_disp_buf_init(&disp_buf_3, buf3_1, buf3_2, LV_HOR_RES_MAX * LV_VER_RES_MAX);   /*Initialize the display buffer*/

#endif

/*-----------------------------------
 * Register the display in LVGL
 *----------------------------------*/

lv_disp_drv_t disp_drv;                         /*Descriptor of a display driver*/
lv_disp_drv_init(&disp_drv);                    /*Basic initialization*/

/*Set up the functions to access to your display*/

/*Set the resolution of the display*/
//disp_drv.hor_res = 281;//128;
//disp_drv.ver_res = 118;//64;

/*Used to copy the buffer's content to the display*/
disp_drv.flush_cb = disp_flush;
disp_drv.set_px_cb 	= st7565_set_px_cb;
disp_drv.rounder_cb = st7565_rounder_cb;

/*Set a display buffer*/
disp_drv.buffer = &disp_buf_1;

#if LV_USE_GPU /Optionally add functions to access the GPU. (Only in buffered mode, LV_VDB_SIZE != 0)/

/*Blend two color array using opacity*/
disp_drv.gpu_blend_cb = gpu_blend;

/*Fill a memory array with a color*/
disp_drv.gpu_fill_cb = gpu_fill;

#endif

/*Finally register the driver*/
lv_disp_drv_register(&disp_drv);

}

/**********************

  • STATIC FUNCTIONS *********************/ #pragma diag_suppress=Pe177 / Initialize your display and the required peripherals. / static void disp_init(void) { /You code here/ } #pragma diag_default=Pe177 / Flush the content of the internal buffer the specific area on the display

  • You can use DMA or any hardware acceleration to do this operation in the background but

  • 'lv_disp_flush_ready()' has to be called when finished. / static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { /The most simple case (but also the slowest) to put all pixels to the screen one-by-one/ #if 0 int32_t x; int32_t y; for(y = area->y1; y <= area->y2; y++) { for(x = area->x1; x <= area->x2; x++) { / Put a pixel to the display. For example: / / put_px(x, y, color_p)/ color_p++; } } #endif

    //st7565_flush(area->x1, area->y1, area->x2, area->y2,color_p); st7565_flush1(area->x1, area->y1, area->x2, area->y2,color_p);

    /* IMPORTANT!!!

    • Inform the graphics library that you are ready with the flushing*/ lv_disp_flush_ready(disp_drv); }

/OPTIONAL: GPU INTERFACE/ #if LV_USE_GPU

/* If your MCU has hardware accelerator (GPU) then you can use it to blend to memories using opacity

  • It can be used only in buffered mode (LV_VDB_SIZE != 0 in lv_conf.h)*/ static void gpu_blend(lv_disp_drv_t * disp_drv, lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa) { /It's an example code which should be done by your GPU/ uint32_t i; for(i = 0; i < length; i++) { dest[i] = lv_color_mix(dest[i], src[i], opa); } }

/* If your MCU has hardware accelerator (GPU) then you can use it to fill a memory with a color

  • It can be used only in buffered mode (LV_VDB_SIZE != 0 in lv_conf.h)*/ static void gpu_fill(lv_disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width, const lv_area_t * fill_area, lv_color_t color) { /It's an example code which should be done by your GPU/ int32_t x, y; dest_buf += dest_width * fill_area->y1; /Go to the first line/

    for(y = fill_area->y1; y <= fill_area->y2; y++) { for(x = fill_area->x1; x <= fill_area->x2; x++) { dest_buf[x] = color; } dest_buf+=dest_width; /Go to the next line/ } }

#endif /LV_USE_GPU/

#else /* Enable this file at the top */

/* This dummy typedef exists purely to silence -Wpedantic. */ typedef int keep_pedantic_happy; #endif

⚠️ **GitHub.com Fallback** ⚠️