Skip to content

Commit bfcbfe1

Browse files
committed
lvgl/drivers: Fix flush after rotation
Drivers were not working correctly when lvgl performed display rotation. Now display can switch between horizontal and vertical layout. ILI9341 rotation adjusted to work same as for other drivers (rotation went in different direction before) Signed-off-by: Jerzy Kasenberg <[email protected]>
1 parent 575433f commit bfcbfe1

File tree

4 files changed

+30
-13
lines changed

4 files changed

+30
-13
lines changed

hw/drivers/display/lvgl/tft/ili9341/src/ili9341.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@
132132

133133
static const uint8_t madctl[] = {
134134
MADCTL_MX,
135-
MADCTL_MX | MADCTL_MY | MADCTL_MV,
136-
MADCTL_MY,
137135
MADCTL_MV,
136+
MADCTL_MY,
137+
MADCTL_MX | MADCTL_MY | MADCTL_MV,
138138
};
139139

140140
void
@@ -231,17 +231,20 @@ void
231231
ili9341_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p)
232232
{
233233
uint8_t cmd[5];
234+
lv_disp_t *disp = lv_disp_get_default();
235+
lv_coord_t hor_res = lv_disp_get_hor_res(disp);
236+
lv_coord_t ver_res = lv_disp_get_ver_res(disp);
234237

235-
if (area->x2 < 0 || area->y2 < 0 || area->x1 >= ILI9341_HOR_RES || area->y1 >= ILI9341_VER_RES) {
238+
if (area->x2 < 0 || area->y2 < 0 || area->x1 >= hor_res || area->y1 >= ver_res) {
236239
lv_disp_flush_ready(drv);
237240
return;
238241
}
239242

240243
/* Truncate the area to the screen */
241244
int32_t act_x1 = area->x1 < 0 ? 0 : area->x1;
242245
int32_t act_y1 = area->y1 < 0 ? 0 : area->y1;
243-
int32_t act_x2 = area->x2 >= ILI9341_HOR_RES ? ILI9341_HOR_RES - 1 : area->x2;
244-
int32_t act_y2 = area->y2 >= ILI9341_VER_RES ? ILI9341_VER_RES - 1 : area->y2;
246+
int32_t act_x2 = area->x2 >= hor_res ? hor_res - 1 : area->x2;
247+
int32_t act_y2 = area->y2 >= ver_res ? ver_res - 1 : area->y2;
245248

246249
/* Column address */
247250
cmd[0] = ILI9341_CASET;

hw/drivers/display/lvgl/tft/ili9486/src/ili9486.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,17 +190,20 @@ void
190190
ili9486_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p)
191191
{
192192
uint8_t cmd[5];
193+
lv_disp_t *disp = lv_disp_get_default();
194+
lv_coord_t hor_res = lv_disp_get_hor_res(disp);
195+
lv_coord_t ver_res = lv_disp_get_ver_res(disp);
193196

194-
if (area->x2 < 0 || area->y2 < 0 || area->x1 >= ILI9486_HOR_RES || area->y1 >= ILI9486_VER_RES) {
197+
if (area->x2 < 0 || area->y2 < 0 || area->x1 >= hor_res || area->y1 >= ver_res) {
195198
lv_disp_flush_ready(drv);
196199
return;
197200
}
198201

199202
/* Truncate the area to the screen */
200203
int32_t act_x1 = area->x1 < 0 ? 0 : area->x1;
201204
int32_t act_y1 = area->y1 < 0 ? 0 : area->y1;
202-
int32_t act_x2 = area->x2 >= ILI9486_HOR_RES ? ILI9486_HOR_RES - 1 : area->x2;
203-
int32_t act_y2 = area->y2 >= ILI9486_VER_RES ? ILI9486_VER_RES - 1 : area->y2;
205+
int32_t act_x2 = area->x2 >= hor_res ? hor_res - 1 : area->x2;
206+
int32_t act_y2 = area->y2 >= ver_res ? ver_res - 1 : area->y2;
204207

205208
/* Column address */
206209
cmd[0] = ILI9486_CASET;

hw/drivers/display/lvgl/tft/st7735s/src/st7735s.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,17 +183,20 @@ void
183183
st7735s_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p)
184184
{
185185
uint8_t cmd[5];
186+
lv_disp_t *disp = lv_disp_get_default();
187+
lv_coord_t hor_res = lv_disp_get_hor_res(disp);
188+
lv_coord_t ver_res = lv_disp_get_ver_res(disp);
186189

187-
if (area->x2 < 0 || area->y2 < 0 || area->x1 >= ST7735S_HOR_RES || area->y1 >= ST7735S_VER_RES) {
190+
if (area->x2 < 0 || area->y2 < 0 || area->x1 >= hor_res || area->y1 >= ver_res) {
188191
lv_disp_flush_ready(drv);
189192
return;
190193
}
191194

192195
/* Truncate the area to the screen */
193196
int32_t act_x1 = area->x1 < 0 ? 0 : area->x1;
194197
int32_t act_y1 = area->y1 < 0 ? 0 : area->y1;
195-
int32_t act_x2 = area->x2 >= ST7735S_HOR_RES ? ST7735S_HOR_RES - 1 : area->x2;
196-
int32_t act_y2 = area->y2 >= ST7735S_VER_RES ? ST7735S_VER_RES - 1 : area->y2;
198+
int32_t act_x2 = area->x2 >= hor_res ? hor_res - 1 : area->x2;
199+
int32_t act_y2 = area->y2 >= ver_res ? ver_res - 1 : area->y2;
197200

198201
/* Column address */
199202
cmd[0] = ST7735S_CASET;

hw/drivers/display/lvgl/tft/st7789/src/st7789.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,20 @@ void
209209
st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p)
210210
{
211211
uint8_t cmd[5];
212+
lv_disp_t *disp = lv_disp_get_default();
213+
lv_coord_t hor_res = lv_disp_get_hor_res(disp);
214+
lv_coord_t ver_res = lv_disp_get_ver_res(disp);
215+
216+
if (area->x2 < 0 || area->y2 < 0 || area->x1 >= hor_res || area->y1 >= ver_res) {
217+
lv_disp_flush_ready(drv);
218+
return;
219+
}
212220

213221
/* Truncate the area to the screen */
214222
int32_t offsetx1 = area->x1 < 0 ? 0 : area->x1;
215223
int32_t offsety1 = area->y1 < 0 ? 0 : area->y1;
216-
int32_t offsetx2 = area->x2 >= ST7789_HOR_RES ? ST7789_HOR_RES - 1 : area->x2;
217-
int32_t offsety2 = area->y2 >= ST7789_VER_RES ? ST7789_VER_RES - 1 : area->y2;
224+
int32_t offsetx2 = area->x2 >= hor_res ? hor_res - 1 : area->x2;
225+
int32_t offsety2 = area->y2 >= ver_res ? ver_res - 1 : area->y2;
218226

219227
#if (CONFIG_LV_TFT_DISPLAY_OFFSETS)
220228
offsetx1 += CONFIG_LV_TFT_DISPLAY_X_OFFSET;

0 commit comments

Comments
 (0)