<div dir="ltr"><div dir="ltr"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><br></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Sep 2, 2019 at 4:34 AM Chris Johns <<a href="mailto:chrisj@rtems.org">chrisj@rtems.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
<br>
Thank you for the patch.<br>
<br>
Can this please be moved as lvgl/hello? It would allow for other examples to be<br>
added.<br>
<br>
We need a test for liblvgl.a. Maybe lvgl/wscript can check and not build if not<br>
found.<br>
<br></blockquote><div>OK. Understood. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
On 31/8/19 4:23 am, Vijay Kumar Banerjee wrote:<br>
> ---<br>
>  README             |   2 +-<br>
>  lvgl_hello/README  |   6 ++<br>
>  lvgl_hello/test.c  | 180 +++++++++++++++++++++++++++++++++++++++++++++<br>
>  lvgl_hello/wscript |  25 +++++++<br>
>  wscript            |   1 +<br>
>  5 files changed, 213 insertions(+), 1 deletion(-)<br>
>  create mode 100644 lvgl_hello/README<br>
>  create mode 100644 lvgl_hello/test.c<br>
>  create mode 100644 lvgl_hello/wscript<br>
> <br>
> diff --git a/README b/README<br>
> index 99ca787..f1e127c 100644<br>
> --- a/README<br>
> +++ b/README<br>
> @@ -15,4 +15,4 @@ posix_api    - POSIX API examples (no led)<br>
>  schedsim     - RTEMS Scheduler Simulator examples<br>
>  ticker       - Ticker Variations<br>
>  uboot        - U-Boot interaction examples<br>
> -<br>
> +lvgl_hello   - LittleVGL graphics app example using libbsd framebuffer driver<br>
> diff --git a/lvgl_hello/README b/lvgl_hello/README<br>
> new file mode 100644<br>
> index 0000000..866d0cd<br>
> --- /dev/null<br>
> +++ b/lvgl_hello/README<br>
> @@ -0,0 +1,6 @@<br>
> +This folder contains a sample graphics app using littleVGL library and libbsd<br>
> +The generated exe file can be directly run using a JTAG debugger on a target<br>
> +with the right device tree or this can be converted into an image.<br>
> +<br>
> +For instructions on how to build the image or how to run the exe, please refer<br>
> +to the BSP documentation in <a href="https://docs.rtems.org" rel="noreferrer" target="_blank">https://docs.rtems.org</a><br>
> diff --git a/lvgl_hello/test.c b/lvgl_hello/test.c<br>
> new file mode 100644<br>
> index 0000000..6e0c030<br>
> --- /dev/null<br>
> +++ b/lvgl_hello/test.c<br>
> @@ -0,0 +1,180 @@<br>
> +/*<br>
> + * Copyright (c) 2019 Vijay Kumar Banerjee <<a href="mailto:vijaykumar9597@gmail.com" target="_blank">vijaykumar9597@gmail.com</a>>.<br>
> + * All rights reserved.<br>
> + *<br>
> + * Redistribution and use in source and binary forms, with or without<br>
> + * modification, are permitted provided that the following conditions<br>
> + * are met:<br>
> + * 1. Redistributions of source code must retain the above copyright<br>
> + *    notice, this list of conditions and the following disclaimer.<br>
> + * 2. Redistributions in binary form must reproduce the above copyright<br>
> + *    notice, this list of conditions and the following disclaimer in the<br>
> + *    documentation and/or other materials provided with the distribution.<br>
> + *<br>
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND<br>
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE<br>
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE<br>
> + * ARE DISCLAIMED.   IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE<br>
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL<br>
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS<br>
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)<br>
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT<br>
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY<br>
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF<br>
> + * SUCH DAMAGE.<br>
> + */<br>
> +<br>
> +#include <assert.h><br>
> +#include <stdlib.h><br>
> +#include <sysexits.h><br>
> +<br>
> +#include <rtems.h><br>
> +#include <rtems/bsd/bsd.h><br>
> +#include <rtems/dhcpcd.h><br>
<br>
Needed?<br>
<br>
> +#include <bsp/i2c.h><br>
> +#include <libcpu/am335x.h><br>
<br>
This ...<br>
<br>
> +#include <rtems/irq-extension.h><br>
<br>
 [ Needed? ]<br>
<br></blockquote><div>Not all these headers are needed, they seeped in from the experimental</div><div>app that I made. I'll remove the ones that are unnecessary. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> +#include <rtems/counter.h><br>
> +#include <bsp/bbb-gpio.h><br>
<br>
.. and this header make the example BBB specific. Is there a way this can be<br>
moved into the BBB BSP or libbsd?<br>
<br></blockquote><div>I think bbb-gpio.h isn't needed anymore, so it can just be removed. I'll have a look</div><div>and report. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> +#include <rtems/console.h><br>
> +#include <rtems/shell.h><br>
> +#include <sys/ioctl.h><br>
> +#include <fcntl.h><br>
> +#include <dev/iicbus/iic.h><br>
> +<br>
> +#include <machine/rtems-bsd-commands.h><br>
> +<br>
> +#include <bsp.h><br>
> +<br>
> +#define PRIO_SHELL           150<br>
> +#define STACK_SIZE_SHELL     (64 * 1024)<br>
> +<br>
> +#include <stdio.h><br>
> +#include <string.h><br>
> +#include <unistd.h><br>
> +#include <sys/fcntl.h><br>
> +#include <sys/ioctl.h><br>
> +#include <sys/mman.h><br>
> +#include <sys/time.h><br>
<br>
Which headers are needed in this list?<br>
<br>
> +<br>
> +#include <sys/consio.h><br>
> +#include <sys/fbio.h><br>
> +<br>
> +#include <lvgl.h><br>
> +#include <fbdev.h><br>
> +<br>
> +void<br>
> +libbsdhelper_start_shell(rtems_task_priority prio)<br>
> +{<br>
> +     rtems_status_code sc = rtems_shell_init(<br>
> +             "SHLL",<br>
> +             STACK_SIZE_SHELL,<br>
> +             prio,<br>
> +             CONSOLE_DEVICE_NAME,<br>
> +             false,<br>
> +             true,<br>
> +             NULL<br>
> +     );<br>
> +     assert(sc == RTEMS_SUCCESSFUL);<br>
> +}<br>
> +<br>
> +static void<br>
> +Init(rtems_task_argument arg)<br>
> +{<br>
> +     rtems_status_code sc;<br>
> +     int exit_code;<br>
> +     (void)arg;<br>
> +     static lv_color_t buf[LV_HOR_RES_MAX*10];<br>
> +     static lv_disp_buf_t disp_buf;<br>
> +<br>
> +     puts("\nRTEMS I2C TEST\n");<br>
> +     exit_code = bbb_register_i2c_0();<br>
> +     assert(exit_code == 0);<br>
<br>
Is this needed for the display to work?<br>
<br></blockquote><div>Yes. We need to register the rtems i2c device in order to work with the TDA driver</div><div>as libbsd uses rtems i2c driver. The bbb_register_* is making it bbb specific, what</div><div>do you suggest to make it more generic? </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> +     sc = rtems_bsd_initialize();<br>
> +     assert(sc == RTEMS_SUCCESSFUL);<br>
> +<br>
> +     lv_init();<br>
> +<br>
> +     fbdev_init();<br>
> +<br>
> +     lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX*10);<br>
> +<br>
> +     lv_disp_drv_t disp_drv;<br>
> +     lv_disp_drv_init(&disp_drv);<br>
> +     disp_drv.buffer = &disp_buf;<br>
> +     disp_drv.flush_cb = fbdev_flush;<br>
> +     lv_disp_drv_register(&disp_drv);<br>
> +<br>
> +     lv_obj_t * label = lv_label_create(lv_scr_act(), NULL);<br>
> +     lv_label_set_text(label, "Hello world!");<br>
> +     lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);<br>
> +<br>
> +     lv_tick_inc(5);<br>
> +     lv_task_handler();<br>
> +<br>
> +     /* Some time for USB device to be detected. */<br>
> +     libbsdhelper_start_shell(PRIO_SHELL);<br>
> +<br>
> +<br>
> +     exit(0);<br>
> +}<br>
> +<br>
> +/*<br>
> + * Configure LibBSD.<br>
> + */<br>
> +#define RTEMS_BSD_CONFIG_BSP_CONFIG<br>
> +#define RTEMS_BSD_CONFIG_TERMIOS_KQUEUE_AND_POLL<br>
> +#define RTEMS_BSD_CONFIG_INIT<br>
> +<br>
> +#include <machine/rtems-bsd-config.h><br>
> +<br>
> +/*<br>
> + * Configure RTEMS.<br>
> + */<br>
> +#define CONFIGURE_MICROSECONDS_PER_TICK 1000<br>
> +<br>
> +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER<br>
> +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER<br>
> +#define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER<br>
> +#define CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER<br>
> +#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK<br>
> +<br>
> +#define CONFIGURE_FILESYSTEM_DOSFS<br>
> +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32<br>
> +<br>
> +#define CONFIGURE_UNLIMITED_OBJECTS<br>
> +#define CONFIGURE_UNIFIED_WORK_AREAS<br>
> +#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1<br>
> +<br>
> +#define CONFIGURE_INIT_TASK_STACK_SIZE (64*1024)<br>
> +#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES<br>
> +#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT<br>
> +<br>
> +#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE (32 * 1024)<br>
> +#define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS 4<br>
> +#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE (1 * 1024 * 1024)<br>
> +#define CONFIGURE_BDBUF_READ_AHEAD_TASK_PRIORITY 97<br>
> +#define CONFIGURE_SWAPOUT_TASK_PRIORITY 97<br>
> +<br>
> +//#define CONFIGURE_STACK_CHECKER_ENABLED<br>
> +<br>
> +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE<br>
> +#define CONFIGURE_INIT<br>
> +<br>
> +#include <rtems/confdefs.h><br>
> +<br>
> +/*<br>
> + * Configure Shell.<br>
> + */<br>
> +#include <rtems/netcmds-config.h><br>
> +#include <bsp/irq-info.h><br>
> +#define CONFIGURE_SHELL_COMMANDS_INIT<br>
> +<br>
> +#define CONFIGURE_SHELL_USER_COMMANDS \<br>
> +  &bsp_interrupt_shell_command, \<br>
> +  &rtems_shell_ARP_Command, \<br>
> +  &rtems_shell_I2C_Command<br>
> +<br>
> +#define CONFIGURE_SHELL_COMMANDS_ALL<br>
> +<br>
> +#include <rtems/shellconfig.h><br>
> diff --git a/lvgl_hello/wscript b/lvgl_hello/wscript<br>
> new file mode 100644<br>
> index 0000000..45413ba<br>
> --- /dev/null<br>
> +++ b/lvgl_hello/wscript<br>
<br>
Please move to lvgl/hello/wscript.<br>
<br></blockquote><div>OK. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> @@ -0,0 +1,25 @@<br>
> +# Copyright 2019 Vijay Kumar Banerjee (<a href="mailto:vijaykumar9597@gmail.com" target="_blank">vijaykumar9597@gmail.com</a>)<br>
> +#<br>
> +# This file's license is 2-clause BSD as in this distribution's LICENSE.2 file.<br>
> +#<br>
> +<br>
> +import rtems_waf.rtems as rtems<br>
> +import os<br>
> +<br>
> +def build(bld):<br>
> +    rtems.build(bld)<br>
> +    arch_inc_path = rtems.arch_bsp_include_path(bld.env.RTEMS_VERSION,<br>
> +                                                bld.env.RTEMS_ARCH_BSP)<br>
> +    include_paths = ['',<br>
> +                     'lvgl',<br>
> +                                      'lvgl/src',<br>
> +                     'lv_drivers/display',]<br>
> +<br>
> +    for i in range(0,len(include_paths)):<br>
> +        include_paths[i] = os.path.join(bld.env.PREFIX, arch_inc_path, include_paths[i])<br>
> +<br>
> +    bld(features = 'c cprogram',<br>
> +        target = 'lvgl_hello.exe',<br>
> +        source = ['test.c'],<br>
> +        includes = include_paths,<br>
> +        lib = ['m', 'lvgl', 'bsd'])<br>
> diff --git a/wscript b/wscript<br>
> index 4f5705b..fef95ff 100644<br>
> --- a/wscript<br>
> +++ b/wscript<br>
> @@ -42,6 +42,7 @@ def build(bld):<br>
>      bld.recurse('posix_api')<br>
>      bld.recurse('cxx')<br>
>      bld.recurse('c11')<br>
> +    bld.recurse('lvgl_hello')<br>
<br>
Please change to ...<br>
<br>
 bld.recurse('lvgl')<br>
<br>
.. and add a wscript to check for liblvgl. You will need a `def configure(conf)`<br>
function to check for lvgl in lvgl/wscript. See ...<br>
<br>
<a href="https://git.rtems.org/rtems_waf/tree/rtems_bsd.py#n52" rel="noreferrer" target="_blank">https://git.rtems.org/rtems_waf/tree/rtems_bsd.py#n52</a><br>
<br>
as an example.<br>
<br>
I updated rtems_waf a month ago with better libbsd support. If the rtems_waf<br>
module is updated you will pick up the needed functionality. The top level<br>
wscript file will need to be updated, an example is here ..<br>
<br>
<a href="https://git.rtems.org/chrisj/rtems-examples.git/tree/wscript?h=libbsd-libdl" rel="noreferrer" target="_blank">https://git.rtems.org/chrisj/rtems-examples.git/tree/wscript?h=libbsd-libdl</a><br>
<br>
The module is loaded with ...<br>
<br>
    import rtems_waf.rtems_bsd as rtems_bsd<br>
<br>
then in options() add ...<br>
<br>
    rtems_bsd.options(opt)<br>
<br>
and in bsp_configure() add ...<br>
<br>
    rtems_bsd.bsp_configure(conf, arch_bsp, mandatory = False)<br>
    conf.recurse('lvgl')<br>
<br>
The configure will then be picked up by all BSPs. I suspect with this<br>
functionality you will not need the specifics to find headers or libraries in<br>
the hello/wscript file.<br>
<br></blockquote><div>OK.</div><div>Thanks for the review. I'll do the necessary changes and post a v2. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Thanks<br>
Chris<br>
<br>
>  <br>
>  def rebuild(ctx):<br>
>      import waflib.Options<br>
> <br>
</blockquote></div></div>