Skip to content

Commit 606ec02

Browse files
committed
Fix Portenta_lvgl example
Still only 7.11 compatible
1 parent 590f115 commit 606ec02

File tree

2 files changed

+4
-168
lines changed

2 files changed

+4
-168
lines changed

libraries/LittleVGL/examples/Portenta_lvgl/Portenta_lvgl.ino

Lines changed: 2 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -1,173 +1,9 @@
1-
#include <lvgl.h>
2-
#include "mbed.h"
3-
4-
#include "Portenta_Video.h"
5-
#include "SDRAM.h"
1+
#include "Portenta_LittleVGL.h"
62
#include "lv_demo_widgets.h"
73

8-
static uint32_t lcd_x_size = 0;
9-
static uint32_t lcd_y_size = 0;
10-
11-
static uint16_t * fb;
12-
static lv_disp_drv_t disp_drv;
13-
14-
/* Display flushing */
15-
static void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
16-
{
17-
18-
#if ARDUINO_PORTENTA_H7_M7
19-
SCB_CleanInvalidateDCache();
20-
SCB_InvalidateICache();
21-
#endif
22-
23-
DMA2D_HandleTypeDef * dma2d = stm32_get_DMA2D();
24-
25-
lv_color_t * pDst = (lv_color_t*)fb;
26-
pDst += area->y1 * lcd_x_size + area->x1;
27-
28-
uint32_t w = lv_area_get_width(area);
29-
uint32_t h = lv_area_get_height(area);
30-
/*##-1- Configure the DMA2D Mode, Color Mode and output offset #############*/
31-
dma2d->Init.Mode = DMA2D_M2M;
32-
dma2d->Init.ColorMode = DMA2D_OUTPUT_RGB565;
33-
dma2d->Init.OutputOffset = lcd_x_size - w;
34-
dma2d->Init.AlphaInverted = DMA2D_REGULAR_ALPHA; /* No Output Alpha Inversion*/
35-
dma2d->Init.RedBlueSwap = DMA2D_RB_REGULAR; /* No Output Red & Blue swap */
36-
37-
/*##-2- DMA2D Callbacks Configuration ######################################*/
38-
dma2d->XferCpltCallback = NULL;
39-
40-
/*##-3- Foreground Configuration ###########################################*/
41-
dma2d->LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
42-
dma2d->LayerCfg[1].InputAlpha = 0xFF;
43-
dma2d->LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
44-
dma2d->LayerCfg[1].InputOffset = 0;
45-
dma2d->LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR; /* No ForeGround Red/Blue swap */
46-
dma2d->LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA; /* No ForeGround Alpha inversion */
47-
48-
/* DMA2D Initialization */
49-
if (HAL_DMA2D_Init(dma2d) == HAL_OK) {
50-
if (HAL_DMA2D_ConfigLayer(dma2d, 1) == HAL_OK) {
51-
HAL_DMA2D_Start(dma2d, (uint32_t)color_p, (uint32_t)pDst, w, h);
52-
HAL_DMA2D_PollForTransfer(dma2d, 1000);
53-
}
54-
}
55-
56-
lv_disp_flush_ready(disp); /* tell lvgl that flushing is done */
57-
}
58-
59-
60-
/* If your MCU has hardware accelerator (GPU) then you can use it to blend to memories using opacity
61-
It can be used only in buffered mode (LV_VDB_SIZE != 0 in lv_conf.h)*/
62-
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)
63-
{
64-
65-
#if ARDUINO_PORTENTA_H7_M7
66-
SCB_CleanInvalidateDCache();
67-
#endif
68-
69-
DMA2D_HandleTypeDef * dma2d = stm32_get_DMA2D();
70-
71-
dma2d->Instance = DMA2D;
72-
dma2d->Init.Mode = DMA2D_M2M_BLEND;
73-
dma2d->Init.OutputOffset = 0;
74-
75-
/* Foreground layer */
76-
dma2d->LayerCfg[1].AlphaMode = DMA2D_REPLACE_ALPHA;
77-
dma2d->LayerCfg[1].InputAlpha = opa;
78-
dma2d->LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
79-
dma2d->LayerCfg[1].InputOffset = 0;
80-
dma2d->LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;
81-
82-
/* Background layer */
83-
dma2d->LayerCfg[0].AlphaMode = DMA2D_NO_MODIF_ALPHA;
84-
dma2d->LayerCfg[0].InputColorMode = DMA2D_INPUT_RGB565;
85-
dma2d->LayerCfg[0].InputOffset = 0;
86-
87-
/* DMA2D Initialization */
88-
if (HAL_DMA2D_Init(dma2d) == HAL_OK) {
89-
if (HAL_DMA2D_ConfigLayer(dma2d, 0) == HAL_OK && HAL_DMA2D_ConfigLayer(dma2d, 1) == HAL_OK) {
90-
HAL_DMA2D_BlendingStart(dma2d, (uint32_t) src, (uint32_t) dest, (uint32_t) dest, length, 1);
91-
HAL_DMA2D_PollForTransfer(dma2d, 1000);
92-
}
93-
}
94-
}
95-
96-
/* If your MCU has hardware accelerator (GPU) then you can use it to fill a memory with a color */
97-
static void gpu_fill(lv_disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width,
98-
const lv_area_t * fill_area, lv_color_t color)
99-
{
100-
#if ARDUINO_PORTENTA_H7_M7
101-
SCB_CleanInvalidateDCache();
102-
#endif
103-
104-
DMA2D_HandleTypeDef * dma2d = stm32_get_DMA2D();
105-
106-
lv_color_t * destination = dest_buf + (dest_width * fill_area->y1 + fill_area->x1);
107-
108-
uint32_t w = fill_area->x2 - fill_area->x1 + 1;
109-
dma2d->Instance = DMA2D;
110-
dma2d->Init.Mode = DMA2D_R2M;
111-
dma2d->Init.ColorMode = DMA2D_OUTPUT_RGB565;
112-
dma2d->Init.OutputOffset = dest_width - w;
113-
dma2d->LayerCfg[1].InputAlpha = DMA2D_NO_MODIF_ALPHA;
114-
dma2d->LayerCfg[1].InputColorMode = DMA2D_OUTPUT_RGB565;
115-
116-
/* DMA2D Initialization */
117-
if (HAL_DMA2D_Init(dma2d) == HAL_OK) {
118-
if (HAL_DMA2D_ConfigLayer(dma2d, 1) == HAL_OK) {
119-
lv_coord_t h = lv_area_get_height(fill_area);
120-
if (HAL_DMA2D_BlendingStart(dma2d, lv_color_to32(color), (uint32_t)destination, (uint32_t)destination, w, h) == HAL_OK) {
121-
HAL_DMA2D_PollForTransfer(dma2d, 1000);
122-
}
123-
}
124-
}
125-
}
126-
127-
struct edid recognized_edid;
128-
1294
void setup() {
130-
// put your setup code here, to run once:
131-
int ret = -1;
132-
133-
ret = anx7625_init(0);
134-
if(ret < 0) {
135-
printf("Cannot continue, anx7625 init failed.\n");
136-
while(1);
137-
}
138-
139-
anx7625_wait_hpd_event(0);
140-
anx7625_dp_get_edid(0, &recognized_edid);
141-
anx7625_dp_start(0, &recognized_edid, EDID_MODE_720x480_60Hz);
142-
SDRAM.begin(getFramebufferEnd());
143-
144-
lv_init();
145-
146-
lcd_x_size = stm32_getXSize();
147-
lcd_y_size = stm32_getYSize();
148-
149-
fb = (uint16_t *)getNextFrameBuffer();
150-
getNextFrameBuffer();
151-
152-
static lv_color_t buf[LV_HOR_RES_MAX * LV_VER_RES_MAX / 6];
153-
static lv_disp_buf_t disp_buf;
154-
lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * LV_VER_RES_MAX / 6);
155-
156-
/*Initialize the display*/
157-
lv_disp_drv_init(&disp_drv);
158-
disp_drv.flush_cb = my_disp_flush;
159-
disp_drv.gpu_fill_cb = gpu_fill;
160-
disp_drv.gpu_blend_cb = gpu_blend;
161-
disp_drv.buffer = &disp_buf;
162-
lv_disp_drv_register(&disp_drv);
163-
164-
/*Hell world label*/
165-
//lv_obj_t * label = lv_label_create(lv_scr_act(), NULL);
166-
//lv_label_set_text(label, "Hello Arduino! Dev-7,0");
167-
//lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
168-
5+
portenta_init_video();
1696
lv_demo_widgets();
170-
1717
}
1728

1739
void loop() {

libraries/LittleVGL/examples/Portenta_lvgl/lv_demo_widgets.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ static void controls_create(lv_obj_t * parent)
8989

9090

9191
/*Add some extra top padding to make space for the box titles.*/
92-
lv_obj_set_style_local_pad_top(parent, LV_PAGE_PART_SCRL, LV_STATE_DEFAULT, LV_DPI/3);
92+
lv_obj_set_style_local_pad_top(parent, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, LV_DPI/3);
9393

9494
lv_obj_t * h = lv_cont_create(parent, NULL);
9595
lv_cont_set_layout(h, LV_LAYOUT_COLUMN_LEFT);
@@ -226,7 +226,7 @@ static void visuals_create(lv_obj_t * parent)
226226
lv_obj_set_size(page, LV_HOR_RES / 3, LV_DPI * 2);
227227
lv_page_set_scroll_propagation(page, true);
228228
lv_cont_set_fit2(page, LV_FIT_TIGHT, LV_FIT_NONE);
229-
lv_page_set_scrl_fit(page, LV_FIT_TIGHT);
229+
lv_page_set_scrollable_fit(page, LV_FIT_TIGHT);
230230

231231
lv_obj_t * table1 = lv_table_create(page, NULL);
232232
lv_obj_set_click(table1, false);

0 commit comments

Comments
 (0)