Skip to content

[stm32l475] port for LVGL #5204

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Oct 18, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions bsp/stm32/stm32f103-blue-pill/applications/SConscript
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
Import('RTT_ROOT')
Import('rtconfig')
from building import *
import os

cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd, ]
CPPPATH = [cwd]

group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)

list = os.listdir(cwd)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
group = group + SConscript(os.path.join(d, 'SConscript'))

Return('group')
9 changes: 3 additions & 6 deletions bsp/stm32/stm32f407-atk-explorer/applications/SConscript
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import rtconfig
import os
from building import *
import os

cwd = GetCurrentDir()
CPPPATH = [cwd, str(Dir('#'))]
src = Split("""
main.c
""")
CPPPATH = [cwd]
src = Glob('*.c')

group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)

Expand Down
13 changes: 10 additions & 3 deletions bsp/stm32/stm32l475-atk-pandora/applications/SConscript
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
from building import *
import os

cwd = GetCurrentDir()
cwd = GetCurrentDir()

src = Split('''
main.c
''')

if GetDepend(['BSP_USING_SPI_LCD']):
if GetDepend(['BSP_USING_LCD_SAMPLE']):
src += ['lcd_sample.c']

if GetDepend(['PKG_USING_NRF24L01']):
src += ['nrf24l01_init.c']

CPPPATH = [str(Dir('#')), cwd]
CPPPATH = [cwd]

group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)

list = os.listdir(cwd)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
group = group + SConscript(os.path.join(d, 'SConscript'))

Return('group')
3 changes: 0 additions & 3 deletions bsp/stm32/stm32l475-atk-pandora/applications/lcd_sample.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#ifdef BSP_USING_SPI_LCD
#include <drv_lcd.h>
#include <rttlogo.h>

Expand Down Expand Up @@ -45,4 +43,3 @@ static int lcd_sample(void)
return RT_EOK;
}
INIT_APP_EXPORT(lcd_sample);
#endif /* BSP_USING_SPI_LCD */
12 changes: 12 additions & 0 deletions bsp/stm32/stm32l475-atk-pandora/board/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ menu "Onboard Peripheral Drivers"
select BSP_USING_SPI3
default n

config BSP_USING_LCD_SAMPLE
bool "Enable LCD sample"
depends on BSP_USING_SPI_LCD
depends on !BSP_USING_LVGL
default n

config BSP_USING_LVGL
bool "Enable LVGL for LCD"
select BSP_USING_SPI_LCD
select PKG_USING_LVGL
default n

config BSP_USING_SDCARD
bool "Enable SDCARD (spi1)"
select BSP_USING_SPI
Expand Down
61 changes: 55 additions & 6 deletions bsp/stm32/stm32l475-atk-pandora/board/ports/drv_lcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@
* 2018-08-14 flybreak the first version
* 2018-09-18 balanceTWK add sleep mode function
* 2018-09-27 ZYLX optimized display speed
* 2021-10-17 Meco Man add lcd_fill_array()
*/

#include <rtdevice.h>
#include "drv_spi.h"
#include "drv_lcd.h"
#include <drv_lcd.h>
#include "drv_lcd_font.h"
#include "drv_gpio.h"
#include <drv_gpio.h>

#define DBG_SECTION_NAME "LCD"
#define DBG_COLOR
#define DBG_LEVEL DBG_LOG
#define DBG_TAG "drv.lcd"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>

#define LCD_PWR_PIN GET_PIN(B, 7)
Expand Down Expand Up @@ -375,7 +375,7 @@ void lcd_fill(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_ui
rt_uint32_t size = 0, size_remain = 0;
rt_uint8_t *fill_buf = RT_NULL;

size = (x_end - x_start) * (y_end - y_start) * 2;
size = (x_end - x_start + 1) * (y_end - y_start + 1) * 2;

if (size > LCD_CLEAR_SEND_NUMBER)
{
Expand Down Expand Up @@ -426,6 +426,55 @@ void lcd_fill(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_ui
}
}

/**
* full color array on the lcd.
*
* @param x_start start of x position
* @param y_start start of y position
* @param x_end end of x position
* @param y_end end of y position
* @param color Fill color array's pointer
*
* @return void
*/
void lcd_fill_array(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, void *pcolor)
{
rt_uint32_t size = 0, size_remain = 0;

size = (x_end - x_start + 1) * (y_end - y_start + 1) * 2;

if (size > LCD_CLEAR_SEND_NUMBER)
{
/* the number of remaining to be filled */
size_remain = size - LCD_CLEAR_SEND_NUMBER;
size = LCD_CLEAR_SEND_NUMBER;
}

lcd_address_set(x_start, y_start, x_end, y_end);

/* fast fill */
while (1)
{
rt_pin_write(LCD_DC_PIN, PIN_HIGH);
rt_spi_send(spi_dev_lcd, pcolor, size);

/* Fill completed */
if (size_remain == 0)
break;

/* calculate the number of fill next time */
if (size_remain > LCD_CLEAR_SEND_NUMBER)
{
size_remain = size_remain - LCD_CLEAR_SEND_NUMBER;
}
else
{
size = size_remain;
size_remain = 0;
}
}
}

/**
* display a line on the lcd.
*
Expand Down
2 changes: 1 addition & 1 deletion bsp/stm32/stm32l475-atk-pandora/board/ports/drv_lcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void lcd_draw_circle(rt_uint16_t x0, rt_uint16_t y0, rt_uint8_t r);
void lcd_draw_line(rt_uint16_t x1, rt_uint16_t y1, rt_uint16_t x2, rt_uint16_t y2);
void lcd_draw_rectangle(rt_uint16_t x1, rt_uint16_t y1, rt_uint16_t x2, rt_uint16_t y2);
void lcd_fill(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, rt_uint16_t color);

void lcd_fill_array(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, void *pcolor);
void lcd_show_num(rt_uint16_t x, rt_uint16_t y, rt_uint32_t num, rt_uint8_t len, rt_uint32_t size);
rt_err_t lcd_show_string(rt_uint16_t x, rt_uint16_t y, rt_uint32_t size, const char *fmt, ...);
rt_err_t lcd_show_image(rt_uint16_t x, rt_uint16_t y, rt_uint16_t length, rt_uint16_t wide, const rt_uint8_t *p);
Expand Down
9 changes: 9 additions & 0 deletions bsp/stm32/stm32l475-atk-pandora/board/ports/lvgl/SConscript
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from building import *

cwd = GetCurrentDir()

src = Glob('*.c')
CPPPATH = [cwd]

group = DefineGroup('LVGL', src, depend = ['BSP_USING_LVGL'], CPPPATH = CPPPATH)
Return('group')
16 changes: 16 additions & 0 deletions bsp/stm32/stm32l475-atk-pandora/board/ports/lvgl/lv_conf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-10-18 Meco Man First version
*/

#ifndef LV_CONF_H
#define LV_CONF_H

#define LV_COLOR_16_SWAP 1

#endif
154 changes: 154 additions & 0 deletions bsp/stm32/stm32l475-atk-pandora/board/ports/lvgl/lvgl_demo.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-10-17 Meco Man First version
*/

#include <rtthread.h>
#include <lvgl.h>
#include <drv_lcd.h>
#define DBG_TAG "LVGL"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>

#ifndef LV_THREAD_STACK_SIZE
#define LV_THREAD_STACK_SIZE 2048
#endif

#ifndef LV_THREAD_PRIO
#define LV_THREAD_PRIO (RT_THREAD_PRIORITY_MAX*2/3)
#endif

static void lv_example_get_started_1(void);
static void lv_example_get_started_3(void);

#define MY_DISP_HOR_RES 240 /* 240*240 */

/*A static or global variable to store the buffers*/
static lv_disp_draw_buf_t disp_buf;

/*Static or global buffer(s). The second buffer is optional*/
static lv_color_t buf_1[MY_DISP_HOR_RES * 10];
static lv_color_t buf_2[MY_DISP_HOR_RES * 10];

static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/

/*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)
{
lcd_fill_array(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);
}

static void lvgl_thread(void *parameter)
{
lv_init();

/*Initialize `disp_buf` with the buffer(s). With only one buffer use NULL instead buf_2 */
lv_disp_draw_buf_init(&disp_buf, buf_1, buf_2, MY_DISP_HOR_RES*10);

lv_disp_drv_init(&disp_drv); /*Basic initialization*/

/*Set the resolution of the display*/
disp_drv.hor_res = MY_DISP_HOR_RES;
disp_drv.ver_res = MY_DISP_HOR_RES;

/*Set a display buffer*/
disp_drv.draw_buf = &disp_buf;

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

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

lv_example_get_started_1();
lv_example_get_started_3();

while(1)
{
lv_task_handler();
rt_thread_mdelay(10);
}
}

static int lvgl_demo_init(void)
{
rt_thread_t tid;

tid = rt_thread_create("lvgl", lvgl_thread, RT_NULL, LV_THREAD_STACK_SIZE, LV_THREAD_PRIO, 0);
rt_thread_startup(tid);

return 0;
}
INIT_COMPONENT_EXPORT(lvgl_demo_init);

/* ------------------- demo1 ----------------------- */

static void btn_event_cb(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * btn = lv_event_get_target(e);
if(code == LV_EVENT_CLICKED) {
static uint8_t cnt = 0;
cnt++;

/*Get the first child of the button which is the label and change its text*/
lv_obj_t * label = lv_obj_get_child(btn, 0);
lv_label_set_text_fmt(label, "Button: %d", cnt);
}
}

/**
* Create a button with a label and react on click event.
*/
static void lv_example_get_started_1(void)
{
lv_obj_t * btn = lv_btn_create(lv_scr_act()); /*Add a button the current screen*/
lv_obj_set_pos(btn, 10, 10); /*Set its position*/
lv_obj_set_size(btn, 120, 50); /*Set its size*/
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL); /*Assign a callback to the button*/

lv_obj_t * label = lv_label_create(btn); /*Add a label to the button*/
lv_label_set_text(label, "Button"); /*Set the labels text*/
lv_obj_center(label);
}

/* ------------------- demo3 ----------------------- */

static lv_obj_t * label;

static void slider_event_cb(lv_event_t * e)
{
lv_obj_t * slider = lv_event_get_target(e);

/*Refresh the text*/
lv_label_set_text_fmt(label, "%d", (int)lv_slider_get_value(slider));
lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15); /*Align top of the slider*/
}

/**
* Create a slider and write its value on a label.
*/
static void lv_example_get_started_3(void)
{
/*Create a slider in the center of the display*/
lv_obj_t * slider = lv_slider_create(lv_scr_act());
lv_obj_set_width(slider, 200); /*Set the width*/
lv_obj_center(slider); /*Align to the center of the parent (screen)*/
lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL); /*Assign an event function*/

/*Create a label below the slider*/
label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "0");
lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15); /*Align top of the slider*/
}