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

Vijay Kumar Banerjee vijaykumar9597 at gmail.com
Mon Sep 2 07:42:57 UTC 2019


On Mon, Sep 2, 2019 at 4:34 AM Chris Johns <chrisj at rtems.org> wrote:

> 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.
>
> OK. Understood.

> 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? ]
>
> Not all these headers are needed, they seeped in from the experimental
app that I made. I'll remove the ones that are unnecessary.

> > +#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?
>
> I think bbb-gpio.h isn't needed anymore, so it can just be removed. I'll
have a look
and report.

> > +#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?
>
> Yes. We need to register the rtems i2c device in order to work with the
TDA driver
as libbsd uses rtems i2c driver. The bbb_register_* is making it bbb
specific, what
do you suggest to make it more generic?

> > +     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.
>
> OK.

> > @@ -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.
>
> OK.
Thanks for the review. I'll do the necessary changes and post a v2.

> Thanks
> Chris
>
> >
> >  def rebuild(ctx):
> >      import waflib.Options
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20190902/3117cad7/attachment-0001.html>


More information about the devel mailing list