[PATCH] Add lvgl_hello: Sample Hello world app using littleVGL and libbsd

Chris Johns chrisj at rtems.org
Sun Sep 1 23:07:44 UTC 2019


Hi,


Thank you for the patch.

Can this please be moved as lvgl/hello? It would allow for other examples to be
added.

We need a test for liblvgl.a. Maybe lvgl/wscript can check and not build if not
found.

On 31/8/19 4:23 am, Vijay Kumar Banerjee wrote:
> ---
>  README             |   2 +-
>  lvgl_hello/README  |   6 ++
>  lvgl_hello/test.c  | 180 +++++++++++++++++++++++++++++++++++++++++++++
>  lvgl_hello/wscript |  25 +++++++
>  wscript            |   1 +
>  5 files changed, 213 insertions(+), 1 deletion(-)
>  create mode 100644 lvgl_hello/README
>  create mode 100644 lvgl_hello/test.c
>  create mode 100644 lvgl_hello/wscript
> 
> diff --git a/README b/README
> index 99ca787..f1e127c 100644
> --- a/README
> +++ b/README
> @@ -15,4 +15,4 @@ posix_api    - POSIX API examples (no led)
>  schedsim     - RTEMS Scheduler Simulator examples
>  ticker       - Ticker Variations
>  uboot        - U-Boot interaction examples
> -
> +lvgl_hello   - LittleVGL graphics app example using libbsd framebuffer driver
> diff --git a/lvgl_hello/README b/lvgl_hello/README
> new file mode 100644
> index 0000000..866d0cd
> --- /dev/null
> +++ b/lvgl_hello/README
> @@ -0,0 +1,6 @@
> +This folder contains a sample graphics app using littleVGL library and libbsd
> +The generated exe file can be directly run using a JTAG debugger on a target
> +with the right device tree or this can be converted into an image.
> +
> +For instructions on how to build the image or how to run the exe, please refer
> +to the BSP documentation in https://docs.rtems.org
> diff --git a/lvgl_hello/test.c b/lvgl_hello/test.c
> new file mode 100644
> index 0000000..6e0c030
> --- /dev/null
> +++ b/lvgl_hello/test.c
> @@ -0,0 +1,180 @@
> +/*
> + * Copyright (c) 2019 Vijay Kumar Banerjee <vijaykumar9597 at gmail.com>.
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.	IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#include <assert.h>
> +#include <stdlib.h>
> +#include <sysexits.h>
> +
> +#include <rtems.h>
> +#include <rtems/bsd/bsd.h>
> +#include <rtems/dhcpcd.h>

Needed?

> +#include <bsp/i2c.h>
> +#include <libcpu/am335x.h>

This ...

> +#include <rtems/irq-extension.h>

 [ Needed? ]

> +#include <rtems/counter.h>
> +#include <bsp/bbb-gpio.h>

.. and this header make the example BBB specific. Is there a way this can be
moved into the BBB BSP or libbsd?

> +#include <rtems/console.h>
> +#include <rtems/shell.h>
> +#include <sys/ioctl.h>
> +#include <fcntl.h>
> +#include <dev/iicbus/iic.h>
> +
> +#include <machine/rtems-bsd-commands.h>
> +
> +#include <bsp.h>
> +
> +#define PRIO_SHELL		150
> +#define STACK_SIZE_SHELL	(64 * 1024)
> +
> +#include <stdio.h>
> +#include <string.h>
> +#include <unistd.h>
> +#include <sys/fcntl.h>
> +#include <sys/ioctl.h>
> +#include <sys/mman.h>
> +#include <sys/time.h>

Which headers are needed in this list?

> +
> +#include <sys/consio.h>
> +#include <sys/fbio.h>
> +
> +#include <lvgl.h>
> +#include <fbdev.h>
> +
> +void
> +libbsdhelper_start_shell(rtems_task_priority prio)
> +{
> +	rtems_status_code sc = rtems_shell_init(
> +		"SHLL",
> +		STACK_SIZE_SHELL,
> +		prio,
> +		CONSOLE_DEVICE_NAME,
> +		false,
> +		true,
> +		NULL
> +	);
> +	assert(sc == RTEMS_SUCCESSFUL);
> +}
> +
> +static void
> +Init(rtems_task_argument arg)
> +{
> +	rtems_status_code sc;
> +	int exit_code;
> +	(void)arg;
> +	static lv_color_t buf[LV_HOR_RES_MAX*10];
> +	static lv_disp_buf_t disp_buf;
> +
> +	puts("\nRTEMS I2C TEST\n");
> +	exit_code = bbb_register_i2c_0();
> +	assert(exit_code == 0);

Is this needed for the display to work?

> +	sc = rtems_bsd_initialize();
> +	assert(sc == RTEMS_SUCCESSFUL);
> +
> +	lv_init();
> +
> +	fbdev_init();
> +
> +	lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX*10);
> +
> +	lv_disp_drv_t disp_drv;
> +	lv_disp_drv_init(&disp_drv);
> +	disp_drv.buffer = &disp_buf;
> +	disp_drv.flush_cb = fbdev_flush;
> +	lv_disp_drv_register(&disp_drv);
> +
> +	lv_obj_t * label = lv_label_create(lv_scr_act(), NULL);
> +	lv_label_set_text(label, "Hello world!");
> +	lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
> +
> +	lv_tick_inc(5);
> +	lv_task_handler();
> +
> +	/* Some time for USB device to be detected. */
> +	libbsdhelper_start_shell(PRIO_SHELL);
> +
> +
> +	exit(0);
> +}
> +
> +/*
> + * Configure LibBSD.
> + */
> +#define RTEMS_BSD_CONFIG_BSP_CONFIG
> +#define RTEMS_BSD_CONFIG_TERMIOS_KQUEUE_AND_POLL
> +#define RTEMS_BSD_CONFIG_INIT
> +
> +#include <machine/rtems-bsd-config.h>
> +
> +/*
> + * Configure RTEMS.
> + */
> +#define CONFIGURE_MICROSECONDS_PER_TICK 1000
> +
> +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> +#define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
> +#define CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
> +#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
> +
> +#define CONFIGURE_FILESYSTEM_DOSFS
> +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
> +
> +#define CONFIGURE_UNLIMITED_OBJECTS
> +#define CONFIGURE_UNIFIED_WORK_AREAS
> +#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
> +
> +#define CONFIGURE_INIT_TASK_STACK_SIZE (64*1024)
> +#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
> +#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
> +
> +#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE (32 * 1024)
> +#define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS 4
> +#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE (1 * 1024 * 1024)
> +#define CONFIGURE_BDBUF_READ_AHEAD_TASK_PRIORITY 97
> +#define CONFIGURE_SWAPOUT_TASK_PRIORITY 97
> +
> +//#define CONFIGURE_STACK_CHECKER_ENABLED
> +
> +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> +#define CONFIGURE_INIT
> +
> +#include <rtems/confdefs.h>
> +
> +/*
> + * Configure Shell.
> + */
> +#include <rtems/netcmds-config.h>
> +#include <bsp/irq-info.h>
> +#define CONFIGURE_SHELL_COMMANDS_INIT
> +
> +#define CONFIGURE_SHELL_USER_COMMANDS \
> +  &bsp_interrupt_shell_command, \
> +  &rtems_shell_ARP_Command, \
> +  &rtems_shell_I2C_Command
> +
> +#define CONFIGURE_SHELL_COMMANDS_ALL
> +
> +#include <rtems/shellconfig.h>
> diff --git a/lvgl_hello/wscript b/lvgl_hello/wscript
> new file mode 100644
> index 0000000..45413ba
> --- /dev/null
> +++ b/lvgl_hello/wscript

Please move to lvgl/hello/wscript.

> @@ -0,0 +1,25 @@
> +# Copyright 2019 Vijay Kumar Banerjee (vijaykumar9597 at gmail.com)
> +#
> +# This file's license is 2-clause BSD as in this distribution's LICENSE.2 file.
> +#
> +
> +import rtems_waf.rtems as rtems
> +import os
> +
> +def build(bld):
> +    rtems.build(bld)
> +    arch_inc_path = rtems.arch_bsp_include_path(bld.env.RTEMS_VERSION,
> +                                                bld.env.RTEMS_ARCH_BSP)
> +    include_paths = ['',
> +                     'lvgl',
> +					 'lvgl/src',
> +                     'lv_drivers/display',]
> +
> +    for i in range(0,len(include_paths)):
> +        include_paths[i] = os.path.join(bld.env.PREFIX, arch_inc_path, include_paths[i])
> +
> +    bld(features = 'c cprogram',
> +        target = 'lvgl_hello.exe',
> +        source = ['test.c'],
> +        includes = include_paths,
> +        lib = ['m', 'lvgl', 'bsd'])
> diff --git a/wscript b/wscript
> index 4f5705b..fef95ff 100644
> --- a/wscript
> +++ b/wscript
> @@ -42,6 +42,7 @@ def build(bld):
>      bld.recurse('posix_api')
>      bld.recurse('cxx')
>      bld.recurse('c11')
> +    bld.recurse('lvgl_hello')

Please change to ...

 bld.recurse('lvgl')

.. and add a wscript to check for liblvgl. You will need a `def configure(conf)`
function to check for lvgl in lvgl/wscript. See ...

https://git.rtems.org/rtems_waf/tree/rtems_bsd.py#n52

as an example.

I updated rtems_waf a month ago with better libbsd support. If the rtems_waf
module is updated you will pick up the needed functionality. The top level
wscript file will need to be updated, an example is here ..

https://git.rtems.org/chrisj/rtems-examples.git/tree/wscript?h=libbsd-libdl

The module is loaded with ...

    import rtems_waf.rtems_bsd as rtems_bsd

then in options() add ...

    rtems_bsd.options(opt)

and in bsp_configure() add ...

    rtems_bsd.bsp_configure(conf, arch_bsp, mandatory = False)
    conf.recurse('lvgl')

The configure will then be picked up by all BSPs. I suspect with this
functionality you will not need the specifics to find headers or libraries in
the hello/wscript file.

Thanks
Chris

>  
>  def rebuild(ctx):
>      import waflib.Options
> 


More information about the devel mailing list