[PATCH] bsp/raspberrypi: Updated the console API.

Christian Mauderer list at c-mauderer.de
Fri Jan 3 13:33:28 UTC 2020


On 03/01/2020 13:31, Niteesh wrote:
> On Fri, Jan 3, 2020 at 3:48 PM Christian Mauderer <list at c-mauderer.de
> <mailto:list at c-mauderer.de>> wrote:
> 
>     On 03/01/2020 11:11, Niteesh wrote:
>     > Great, please do have a look at the FDT patch I sent today.
> 
>     The FDT patch looks OK too. I thought it's clear when I said that I'll
>     push it together with this one in a few days.
> 
>  
> Sorry, I was reading that on mobile and somehow missed it. 

No problem.

> 
>     > I would like to work on something else now, do you have something
>     > interesting
>     > for me to do?
> 
>     That depends on what you want to do. I think your original intention was
>     to get the serial console running on the RPi3? So maybe add that?
> 
>  
> I did try that, but qemu-system-aarch64 doesn't accept exe file formats,
> I tried
> converting it to .img file, but then it doesn't run. Is there some way
> to convert to
> get elf files as output instead of exe? Is it possible to convert exe to
> elf, maybe we have
> to do some symbol table and header manipulation?

exe is a commonly used ending for an elf file. They are the same. Just
use the "file" utility on some of the generated exe files and it will
tell you that you have a

    ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically
linked, with debug_info, not stripped

It seems the qemu only emulates an aarch64? I was sure that the rpi3 has
an 32bit fallback? Otherwise rpi3 would be another architecture.

> 
>     It would be also great if you could write down some lines on how to
>     start the BSP on qemu or on a real hardware for the manual. It doesn't
>     have to be an extensive chapter. Some hints like "use objcopy like
>     that..., start qemu like this, ..." can be already very helpful.
> 
>  
> I will send in a documentation patch on how to run executables in qemu in a
> couple of days. 

Thanks.

> 
>     Joel suggested a tester integration for the raspberry BSP on qemu in
>     another mail thread.
> 
>  
> By tester integration, you mean writing a tester.cfg which will automate
> testing using
> rtems-test right?

Right.

> 
>     You might want to start to discuss your toppic for GSoC in some more
>     details. Gedare gave some hints in the other mail thread too.
> 
> 
> Won't there be any idea's list? because I am literally confused about
> what to choose.
> Everything seems interesting to me, I just fear if I would pick
> something big, that I am
> not capable of finishing.

Usually that list is the open projects list which is not yet up to date.
But we allways encourage students to pick projects that interests them.

Don't worry about having a project that is too big. Just ask about
anything that interests you and we will help you defining work packets
in the right size. In the worst case you will get the answer that it's
too big for one GSoC but that you can reach some part of it.

Let's discuss the details in the other thread.

> I have gone through previous GSOC projects and have selected a few which
> I found
> quite interesting to me. I listed them in the other thread* What do you
> want to study in GSOC 2020?*
> have a look at it.
> It is still not clear of what has been accomplished? Based on the
> feedback and suggestions from
> the community, I will choose, a particular project and start working on it.
> 
>     But don't hesitate to pick any other topic that picks your eye. I'm not
>     giving orders here. Take them just as some hints what could be possible
>     from my point of view.
> 
>     >
>     > On Fri, Jan 3, 2020 at 3:39 PM Christian Mauderer
>     <list at c-mauderer.de <mailto:list at c-mauderer.de>
>     > <mailto:list at c-mauderer.de <mailto:list at c-mauderer.de>>> wrote:
>     >
>     >     Hello Niteesh,
>     >
>     >     looks good to me. The UART works for a Pi1 and a Pi2. The
>     Framebuffer
>     >     console doesn't but it doesn't work either before this patch
>     and as far
>     >     as I can tell you took over the logic correctly. So I don't
>     think this
>     >     patch will break anything that isn't already broken.
>     >
>     >     I'll give the patch some more days for others to review and if
>     no one
>     >     objects, I'll push it together with the "Enable FDT support"
>     and my two
>     >     patches that fix the SDRAM stuff.
>     >
>     >     Best regards
>     >
>     >     Christian
>     >
>     >     On 03/01/2020 09:26, G S Niteesh wrote:
>     >     > Replaces the legacy termios API with new termios API (#3034)
>     >     > Replaces the custom PL011 serial driver with RTEMS arm-pl011.
>     >     > Update #3034
>     >     > ---
>     >     >  bsps/arm/raspberrypi/console/console-config.c | 148
>     ++++++++++++----
>     >     >  bsps/arm/raspberrypi/console/console_select.c | 114
>     ------------
>     >     >  bsps/arm/raspberrypi/console/fbcons.c         |  78 ++++----
>     >     >  bsps/arm/raspberrypi/console/usart.c          | 167
>     >     ------------------
>     >     >  bsps/arm/raspberrypi/include/bsp.h            |   2 +
>     >     >  bsps/arm/raspberrypi/include/bsp/fbcons.h     |  17 +-
>     >     >  .../arm/raspberrypi/include/bsp/raspberrypi.h |  54 ++----
>     >     >  bsps/arm/raspberrypi/include/bsp/usart.h      |   5 +-
>     >     >  bsps/arm/raspberrypi/start/bspstart.c         |  15 ++
>     >     >  c/src/lib/libbsp/arm/raspberrypi/Makefile.am  |   6 +-
>     >     >  10 files changed, 199 insertions(+), 407 deletions(-)
>     >     >  delete mode 100644
>     bsps/arm/raspberrypi/console/console_select.c
>     >     >  delete mode 100644 bsps/arm/raspberrypi/console/usart.c
>     >     >
>     >     > diff --git a/bsps/arm/raspberrypi/console/console-config.c
>     >     b/bsps/arm/raspberrypi/console/console-config.c
>     >     > index d2186c918b..4000fd1c50 100644
>     >     > --- a/bsps/arm/raspberrypi/console/console-config.c
>     >     > +++ b/bsps/arm/raspberrypi/console/console-config.c
>     >     > @@ -19,50 +19,132 @@
>     >     >   */
>     >     > 
>     >     >  #include <rtems/bspIo.h>
>     >     > -
>     >     > -#include <libchip/serial.h>
>     >     > +#include <rtems/console.h>
>     >     > +#include <rtems/sysinit.h>
>     >     > 
>     >     >  #include <bspopts.h>
>     >     > -#include <bsp/irq.h>
>     >     > -#include <bsp/usart.h>
>     >     > +#include <bsp.h>
>     >     >  #include <bsp/raspberrypi.h>
>     >     > +#include <bsp/usart.h>
>     >     > +#include <bsp/arm-pl011.h>
>     >     >  #include <bsp/fbcons.h>
>     >     > +#include <bsp/console-termios.h>
>     >     > +#include <bsp/fdt.h>
>     >     > +#include <bsp/fatal.h>
>     >     > +
>     >     > +#include <libfdt.h>
>     >     > +#include <libchip/serial.h>
>     >     > +
>     >     > +#define UART0     "/dev/ttyS0"
>     >     > +#define FBCONS    "/dev/fbcons"
>     >     > +
>     >     > +arm_pl011_context pl011_context;
>     >     > +
>     >     > +rpi_fb_context fb_context;
>     >     > +
>     >     > +static void output_char_serial(char c)
>     >     > +{
>     >     > +  arm_pl011_write_polled(&pl011_context.base, c);
>     >     > +}
>     >     > +
>     >     > +void output_char_fb(char c)
>     >     > +{
>     >     > +  fbcons_write_polled(&fb_context.base, c);
>     >     > +}
>     >     > 
>     >     > -console_tbl Console_Configuration_Ports [] = {
>     >     > -    {
>     >     > -      .sDeviceName = "/dev/ttyS0",
>     >     > -      .deviceType = SERIAL_CUSTOM,
>     >     > -      .pDeviceFns = &bcm2835_usart_fns,
>     >     > -      .deviceProbe = NULL,
>     >     > -      .pDeviceFlow = NULL,
>     >     > -      .ulCtrlPort1 = BCM2835_UART0_BASE,
>     >     > -      .ulCtrlPort2 = 0,
>     >     > -      .ulClock = USART0_DEFAULT_BAUD,
>     >     > -      .ulIntVector = BCM2835_IRQ_ID_UART
>     >     > -    },
>     >     > -    {
>     >     > -      .sDeviceName ="/dev/fbcons",
>     >     > -      .deviceType = SERIAL_CUSTOM,
>     >     > -      .pDeviceFns = &fbcons_fns,
>     >     > -      .deviceProbe = fbcons_probe,
>     >     > -      .pDeviceFlow = NULL,
>     >     > -    },
>     >     > -};
>     >     > -
>     >     > -#define PORT_COUNT \
>     >     > -  (sizeof(Console_Configuration_Ports) \
>     >     > -    / sizeof(Console_Configuration_Ports [0]))
>     >     > -
>     >     > -unsigned long Console_Configuration_Count = PORT_COUNT;
>     >     > +static void init_ctx_arm_pl011(
>     >     > +  const void *fdt,
>     >     > +  int node
>     >     > +)
>     >     > +{
>     >     > +  arm_pl011_context *ctx = &pl011_context;
>     >     > +  rtems_termios_device_context_initialize(&ctx->base, "UART");
>     >     > +  ctx->regs = raspberrypi_get_reg_of_node(fdt, node);
>     >     > +}
>     >     > +
>     >     > +static void register_fb( void )
>     >     > +{
>     >     > +  if (fbcons_probe(&fb_context.base) == true) {
>     >     > +    rtems_termios_device_install(
>     >     > +      FBCONS,
>     >     > +      &fbcons_fns,
>     >     > +      NULL,
>     >     > +      &fb_context.base);
>     >     > +  }
>     >     > +}
>     >     > +
>     >     > +static void console_select( void )
>     >     > +{
>     >     > +  const char *opt;
>     >     > +
>     >     > +  opt = rpi_cmdline_get_arg("--console=");
>     >     > +
>     >     > +  if ( opt ) {
>     >     > +    if ( strncmp( opt, "fbcons", sizeof( "fbcons" ) - 1 )
>     == 0 ) {
>     >     > +      if ( rpi_video_is_initialized() > 0 ) {
>     >     > +        BSP_output_char = output_char_fb;
>     >     > +        link(FBCONS, CONSOLE_DEVICE_NAME);
>     >     > +        return ;
>     >     > +      }
>     >     > +    }
>     >     > +  }
>     >     > +  BSP_output_char = output_char_serial;
>     >     > +  link(UART0, CONSOLE_DEVICE_NAME);
>     >     > +}
>     >     > +
>     >     > +static void uart_probe(void)
>     >     > +{
>     >     > +  static bool initialized = false;
>     >     > +  const void *fdt;
>     >     > +  int node;
>     >     > +
>     >     > +  if ( initialized ) {
>     >     > +    return ;
>     >     > +  }
>     >     > +
>     >     > +  fdt = bsp_fdt_get();
>     >     > +  node = fdt_node_offset_by_compatible(fdt, -1,
>     >     "brcm,bcm2835-pl011");
>     >     > +
>     >     > +  init_ctx_arm_pl011(fdt, node);
>     >     > +
>     >     > +  initialized = true;
>     >     > +}
>     >     > 
>     >     >  static void output_char(char c)
>     >     >  {
>     >     > -  const console_fns *con =
>     >     > -    Console_Configuration_Ports
>     [Console_Port_Minor].pDeviceFns;
>     >     > +  uart_probe();
>     >     > +  output_char_serial(c);
>     >     > +}
>     >     > +
>     >     > +rtems_status_code console_initialize(
>     >     > +  rtems_device_major_number major,
>     >     > +  rtems_device_minor_number minor,
>     >     > +  void *arg
>     >     > +)
>     >     > +{
>     >     > +  rtems_termios_initialize();
>     >     > 
>     >     > -  con->deviceWritePolled((int) Console_Port_Minor, c);
>     >     > +  uart_probe();
>     >     > +  rtems_termios_device_install(
>     >     > +    UART0,
>     >     > +    &arm_pl011_fns,
>     >     > +    NULL,
>     >     > +    &pl011_context.base
>     >     > +  );
>     >     > +
>     >     > +  register_fb();
>     >     > +
>     >     > +  console_select();
>     >     > +
>     >     > +  return RTEMS_SUCCESSFUL;
>     >     >  }
>     >     > 
>     >     >  BSP_output_char_function_type BSP_output_char = output_char;
>     >     > 
>     >     >  BSP_polling_getchar_function_type BSP_poll_char = NULL;
>     >     > +
>     >     > +RTEMS_SYSINIT_ITEM(
>     >     > +  uart_probe,
>     >     > +  RTEMS_SYSINIT_BSP_START,
>     >     > +  RTEMS_SYSINIT_ORDER_LAST
>     >     > +);
>     >     > \ No newline at end of file
>     >     > diff --git a/bsps/arm/raspberrypi/console/console_select.c
>     >     b/bsps/arm/raspberrypi/console/console_select.c
>     >     > deleted file mode 100644
>     >     > index bd246ca868..0000000000
>     >     > --- a/bsps/arm/raspberrypi/console/console_select.c
>     >     > +++ /dev/null
>     >     > @@ -1,114 +0,0 @@
>     >     > -/**
>     >     > - * @file
>     >     > - *
>     >     > - * @ingroup raspberrypi_console
>     >     > - *
>     >     > - * @brief console select
>     >     > - */
>     >     > -
>     >     > -/*
>     >     > - * Copyright (c) 2015 Yang Qiao
>     >     > - *
>     >     > - *  The license and distribution terms for this file may be
>     >     > - *  found in the file LICENSE in this distribution or at
>     >     > - *
>     >     > - *  http://www.rtems.org/license/LICENSE
>     >     > - *
>     >     > - */
>     >     > -
>     >     > -#include <bsp.h>
>     >     > -#include <bsp/fatal.h>
>     >     > -#include <rtems/libio.h>
>     >     > -#include <stdlib.h>
>     >     > -#include <string.h>
>     >     > -#include <assert.h>
>     >     > -#include <termios.h>
>     >     > -
>     >     > -#include <rtems/termiostypes.h>
>     >     > -#include <libchip/serial.h>
>     >     > -#include "../../shared/dev/serial/legacy-console.h"
>     >     > -#include <bsp/rpi-fb.h>
>     >     > -
>     >     > -rtems_device_minor_number BSPPrintkPort = 0;
>     >     > -
>     >     > -/*
>     >     > - * Method to return true if the device associated with the
>     >     > - * minor number probs available.
>     >     > - */
>     >     > -static bool bsp_Is_Available( rtems_device_minor_number minor )
>     >     > -{
>     >     > -  console_tbl *cptr = Console_Port_Tbl[ minor ];
>     >     > -
>     >     > -  /*
>     >     > -   * First perform the configuration dependent probe, then the
>     >     > -   * device dependent probe
>     >     > -   */
>     >     > -  if ( ( !cptr->deviceProbe || cptr->deviceProbe( minor ) ) &&
>     >     > -       cptr->pDeviceFns->deviceProbe( minor ) ) {
>     >     > -    return true;
>     >     > -  }
>     >     > -
>     >     > -  return false;
>     >     > -}
>     >     > -
>     >     > -/*
>     >     > - * Method to return the first available device.
>     >     > - */
>     >     > -static rtems_device_minor_number
>     bsp_First_Available_Device( void )
>     >     > -{
>     >     > -  rtems_device_minor_number minor;
>     >     > -
>     >     > -  for ( minor = 0; minor < Console_Port_Count; minor++ ) {
>     >     > -    console_tbl *cptr = Console_Port_Tbl[ minor ];
>     >     > -
>     >     > -    /*
>     >     > -     * First perform the configuration dependent probe,
>     then the
>     >     > -     * device dependent probe
>     >     > -     */
>     >     > -
>     >     > -    if ( ( !cptr->deviceProbe || cptr->deviceProbe( minor )
>     ) &&
>     >     > -         cptr->pDeviceFns->deviceProbe( minor ) ) {
>     >     > -      return minor;
>     >     > -    }
>     >     > -  }
>     >     > -
>     >     > -  /*
>     >     > -   *  Error No devices were found.  We will want to bail here.
>     >     > -   */
>     >     > -  bsp_fatal( BSP_FATAL_CONSOLE_NO_DEV );
>     >     > -}
>     >     > -
>     >     > -void bsp_console_select( void )
>     >     > -{
>     >     > -  /*
>     >     > -   *  Reset Console_Port_Minor and
>     >     > -   *  BSPPrintkPort here if desired.
>     >     > -   *
>     >     > -   *  This default version allows the bsp to set these
>     >     > -   *  values at creation and will not touch them again
>     >     > -   *  unless the selected port number is not available.
>     >     > -   */
>     >     > -  const char *opt;
>     >     > -
>     >     > -  Console_Port_Minor = BSP_CONSOLE_UART0;
>     >     > -  BSPPrintkPort = BSP_CONSOLE_UART0;
>     >     > -
>     >     > -  opt = rpi_cmdline_get_arg( "--console=" );
>     >     > -
>     >     > -  if ( opt ) {
>     >     > -    if ( strncmp( opt, "fbcons", sizeof( "fbcons" ) - 1 )
>     == 0 ) {
>     >     > -      if ( rpi_video_is_initialized() > 0 ) {
>     >     > -        Console_Port_Minor = BSP_CONSOLE_FB;
>     >     > -        BSPPrintkPort = BSP_CONSOLE_FB;
>     >     > -      }
>     >     > -    }
>     >     > -  }
>     >     > -
>     >     > -  /*
>     >     > -   * If the device that was selected isn't available then
>     >     > -   * let the user know and select the first available device.
>     >     > -   */
>     >     > -  if ( !bsp_Is_Available( Console_Port_Minor ) ) {
>     >     > -    Console_Port_Minor = bsp_First_Available_Device();
>     >     > -  }
>     >     > -}
>     >     > diff --git a/bsps/arm/raspberrypi/console/fbcons.c
>     >     b/bsps/arm/raspberrypi/console/fbcons.c
>     >     > index 3669ba458d..0c0a5087ce 100644
>     >     > --- a/bsps/arm/raspberrypi/console/fbcons.c
>     >     > +++ b/bsps/arm/raspberrypi/console/fbcons.c
>     >     > @@ -18,6 +18,7 @@
>     >     > 
>     >     >  #include <rtems.h>
>     >     >  #include <rtems/libio.h>
>     >     > +#include <rtems/termiostypes.h>
>     >     > 
>     >     >  #include <stdlib.h>
>     >     > 
>     >     > @@ -29,15 +30,6 @@
>     >     >  #include <bsp/vc.h>
>     >     >  #include <bsp/rpi-fb.h>
>     >     > 
>     >     > -/*
>     >     > - *  fbcons_init
>     >     > - *
>     >     > - *  This function initializes the fb console to a quiecsent
>     state.
>     >     > - */
>     >     > -static void fbcons_init( int minor )
>     >     > -{
>     >     > -}
>     >     > -
>     >     >  /*
>     >     >   *  fbcons_open
>     >     >   *
>     >     > @@ -45,13 +37,14 @@ static void fbcons_init( int minor )
>     >     >   *
>     >     >   *  Default state is 9600 baud, 8 bits, No parity, and 1
>     stop bit.
>     >     >   */
>     >     > -static int fbcons_open(
>     >     > -  int   major,
>     >     > -  int   minor,
>     >     > -  void *arg
>     >     > +static bool fbcons_open(
>     >     > +  struct rtems_termios_tty *tty,
>     >     > +  rtems_termios_device_context *base,
>     >     > +  struct termios *term,
>     >     > +  rtems_libio_open_close_args_t *args
>     >     >  )
>     >     >  {
>     >     > -  return RTEMS_SUCCESSFUL;
>     >     > +  return true;
>     >     >  }
>     >     > 
>     >     >  /*
>     >     > @@ -59,13 +52,12 @@ static int fbcons_open(
>     >     >   *
>     >     >   *  This function shuts down the requested port.
>     >     >   */
>     >     > -static int fbcons_close(
>     >     > -  int   major,
>     >     > -  int   minor,
>     >     > -  void *arg
>     >     > +static void fbcons_close(
>     >     > +  struct rtems_termios_tty *tty,
>     >     > +  rtems_termios_device_context *base,
>     >     > +  rtems_libio_open_close_args_t *args
>     >     >  )
>     >     >  {
>     >     > -  return ( RTEMS_SUCCESSFUL );
>     >     >  }
>     >     > 
>     >     >  /*
>     >     > @@ -73,8 +65,8 @@ static int fbcons_close(
>     >     >   *
>     >     >   *  This routine polls out the requested character.
>     >     >   */
>     >     > -static void fbcons_write_polled(
>     >     > -  int  minor,
>     >     > +void fbcons_write_polled(
>     >     > +  rtems_termios_device_context *base,
>     >     >    char c
>     >     >  )
>     >     >  {
>     >     > @@ -90,8 +82,8 @@ static void fbcons_write_polled(
>     >     >   *  Console Termios output entry point when using polled
>     output.
>     >     >   *
>     >     >   */
>     >     > -static ssize_t fbcons_write_support_polled(
>     >     > -  int         minor,
>     >     > +static void fbcons_write_support_polled(
>     >     > +  rtems_termios_device_context *base,
>     >     >    const char *buf,
>     >     >    size_t      len
>     >     >  )
>     >     > @@ -102,14 +94,9 @@ static ssize_t fbcons_write_support_polled(
>     >     >     * poll each byte in the string out of the port.
>     >     >     */
>     >     >    while ( nwrite < len ) {
>     >     > -    fbcons_write_polled( minor, *buf++ );
>     >     > +    fbcons_write_polled( base, *buf++ );
>     >     >      nwrite++;
>     >     >    }
>     >     > -
>     >     > -  /*
>     >     > -   * return the number of bytes written.
>     >     > -   */
>     >     > -  return nwrite;
>     >     >  }
>     >     > 
>     >     >  /*
>     >     > @@ -117,7 +104,9 @@ static ssize_t fbcons_write_support_polled(
>     >     >   *
>     >     >   *  Console Termios polling input entry point.
>     >     >   */
>     >     > -static int fbcons_inbyte_nonblocking_polled( int minor )
>     >     > +static int fbcons_inbyte_nonblocking_polled(
>     >     > +  rtems_termios_device_context *base
>     >     > +)
>     >     >  {
>     >     >    // if( rtems_kbpoll() ) {
>     >     >    //   int c = getch();
>     >     > @@ -133,15 +122,17 @@ static int
>     fbcons_inbyte_nonblocking_polled(
>     >     int minor )
>     >     >   *  This function sets the UART channel to reflect the
>     requested
>     >     termios
>     >     >   *  port settings.
>     >     >   */
>     >     > -static int fbcons_set_attributes(
>     >     > -  int                   minor,
>     >     > +static bool fbcons_set_attributes(
>     >     > +  rtems_termios_device_context *base,
>     >     >    const struct termios *t
>     >     >  )
>     >     >  {
>     >     > -  return 0;
>     >     > +  return true;
>     >     >  }
>     >     > 
>     >     > -bool fbcons_probe( int minor )
>     >     > +bool fbcons_probe(
>     >     > +  rtems_termios_device_context *context
>     >     > +)
>     >     >  {
>     >     >    // rtems_status_code status;
>     >     >    static bool firstTime = true;
>     >     > @@ -163,15 +154,12 @@ bool fbcons_probe( int minor )
>     >     >    return ret;
>     >     >  }
>     >     > 
>     >     > -const console_fns fbcons_fns =
>     >     > +const rtems_termios_device_handler fbcons_fns =
>     >     >  {
>     >     > -  .deviceProbe = libchip_serial_default_probe,     /*
>     deviceProbe */
>     >     > -  .deviceFirstOpen = fbcons_open,                 /*
>     >     deviceFirstOpen */
>     >     > -  .deviceLastClose = fbcons_close,                /*
>     >     deviceLastClose */
>     >     > -  .deviceRead = fbcons_inbyte_nonblocking_polled, /*
>     deviceRead */
>     >     > -  .deviceWrite = fbcons_write_support_polled,     /*
>     deviceWrite */
>     >     > -  .deviceInitialize = fbcons_init,                /*
>     >     deviceInitialize */
>     >     > -  .deviceWritePolled = fbcons_write_polled,       /*
>     >     deviceWritePolled */
>     >     > -  .deviceSetAttributes = fbcons_set_attributes,   /*
>     >     deviceSetAttributes */
>     >     > -  .deviceOutputUsesInterrupts = FALSE,           /*
>     >     deviceOutputUsesInterrupts*/
>     >     > -};
>     >     > +  .first_open = fbcons_open,
>     >     > +  .last_close = fbcons_close,
>     >     > +  .poll_read = fbcons_inbyte_nonblocking_polled,
>     >     > +  .write = fbcons_write_support_polled,
>     >     > +  .set_attributes = fbcons_set_attributes,
>     >     > +  .mode = TERMIOS_POLLED
>     >     > +};
>     >     > \ No newline at end of file
>     >     > diff --git a/bsps/arm/raspberrypi/console/usart.c
>     >     b/bsps/arm/raspberrypi/console/usart.c
>     >     > deleted file mode 100644
>     >     > index 25fb523621..0000000000
>     >     > --- a/bsps/arm/raspberrypi/console/usart.c
>     >     > +++ /dev/null
>     >     > @@ -1,167 +0,0 @@
>     >     > -/**
>     >     > - * @file
>     >     > - *
>     >     > - * @ingroup raspberrypi_usart
>     >     > - *
>     >     > - * @brief USART support.
>     >     > - */
>     >     > -
>     >     > -/*
>     >     > - * Copyright (c) 2013 Alan Cudmore
>     >     > - *
>     >     > - *  The license and distribution terms for this file may be
>     >     > - *  found in the file LICENSE in this distribution or at
>     >     > - *
>     >     > - *  http://www.rtems.org/license/LICENSE
>     >     > - *
>     >     > - */
>     >     > -
>     >     > -#include <libchip/sersupp.h>
>     >     > -
>     >     > -#include <bsp.h>
>     >     > -#include <bsp/irq.h>
>     >     > -#include <bsp/usart.h>
>     >     > -#include <bsp/raspberrypi.h>
>     >     > -#include <rtems/bspIo.h>
>     >     > -
>     >     > -static void usart_delay(uint32_t n)
>     >     > -{
>     >     > - volatile uint32_t i = 0;
>     >     > -
>     >     > - for(i = 0; i < n; i++)
>     >     > -   ;
>     >     > -}
>     >     > -
>     >     > -#if 0
>     >     > -/*
>     >     > - *  These will be useful when the driver supports interrupt
>     >     driven IO.
>     >     > - */
>     >     > -static rtems_vector_number usart_get_irq_number(const
>     console_tbl
>     >     *ct)
>     >     > -{
>     >     > -  return ct->ulIntVector;
>     >     > -}
>     >     > -
>     >     > -static uint32_t usart_get_baud(const console_tbl *ct)
>     >     > -{
>     >     > -  return ct->ulClock;
>     >     > -}
>     >     > -#endif
>     >     > -
>     >     > -static void usart_set_baud(int minor, int baud)
>     >     > -{
>     >     > - /*
>     >     > -  * Nothing for now
>     >     > -  */
>     >     > - return;
>     >     > -}
>     >     > -
>     >     > -static void usart_initialize(int minor)
>     >     > -{
>     >     > -  unsigned int gpio_reg;
>     >     > -
>     >     > -  /*
>     >     > -  ** Program GPIO pins for UART 0
>     >     > -  */
>     >     > -  gpio_reg = BCM2835_REG(BCM2835_GPIO_GPFSEL1);
>     >     > -  gpio_reg &= ~(7<<12);    /* gpio14 */
>     >     > -  gpio_reg |=  (4<<12);    /* alt0   */
>     >     > -  gpio_reg &= ~(7<<15);    /* gpio15 */
>     >     > -  gpio_reg |=  (4<<15);    /* alt0   */
>     >     > -  BCM2835_REG(BCM2835_GPIO_GPFSEL1) = gpio_reg;
>     >     > -
>     >     > -  BCM2835_REG(BCM2835_GPIO_GPPUD) = 0;
>     >     > -  usart_delay(150);
>     >     > -  BCM2835_REG(BCM2835_GPIO_GPPUDCLK0) = (1<<14)|(1<<15);
>     >     > -  usart_delay(150);
>     >     > -  BCM2835_REG(BCM2835_GPIO_GPPUDCLK0) = 0;
>     >     > -
>     >     > -  /*
>     >     > -  ** Init the PL011 UART
>     >     > -  */
>     >     > -  BCM2835_REG(BCM2835_UART0_CR)   = 0;
>     >     > -  BCM2835_REG(BCM2835_UART0_ICR)  = 0x7FF;
>     >     > -  BCM2835_REG(BCM2835_UART0_IMSC) = 0;
>     >     > -  BCM2835_REG(BCM2835_UART0_IBRD) = 1;
>     >     > -  BCM2835_REG(BCM2835_UART0_FBRD) = 40;
>     >     > -  BCM2835_REG(BCM2835_UART0_LCRH) = 0x70;
>     >     > -  BCM2835_REG(BCM2835_UART0_RSRECR) =  0;
>     >     > -
>     >     > -  BCM2835_REG(BCM2835_UART0_CR)   = 0x301;
>     >     > -
>     >     > -  BCM2835_REG(BCM2835_UART0_IMSC) = BCM2835_UART0_IMSC_RX;
>     >     > -
>     >     > -  usart_set_baud(minor, 115000);
>     >     > -}
>     >     > -
>     >     > -static int usart_first_open(int major, int minor, void *arg)
>     >     > -{
>     >     > -  rtems_libio_open_close_args_t *oc =
>     >     (rtems_libio_open_close_args_t *) arg;
>     >     > -  struct rtems_termios_tty *tty = (struct rtems_termios_tty *)
>     >     oc->iop->data1;
>     >     > -  const console_tbl *ct = Console_Port_Tbl [minor];
>     >     > -  console_data *cd = &Console_Port_Data [minor];
>     >     > -
>     >     > -  cd->termios_data = tty;
>     >     > -  rtems_termios_set_initial_baud(tty, ct->ulClock);
>     >     > -
>     >     > -  return 0;
>     >     > -}
>     >     > -
>     >     > -static int usart_last_close(int major, int minor, void *arg)
>     >     > -{
>     >     > -  return 0;
>     >     > -}
>     >     > -
>     >     > -static int usart_read_polled(int minor)
>     >     > -{
>     >     > -  if (minor == 0) {
>     >     > -    if (((BCM2835_REG(BCM2835_UART0_FR)) &
>     BCM2835_UART0_FR_RXFE)
>     >     == 0) {
>     >     > -       return((BCM2835_REG(BCM2835_UART0_DR)) & 0xFF );
>     >     > -    } else {
>     >     > -      return -1;
>     >     > -    }
>     >     > -  } else {
>     >     > -    printk("Unknown console minor number: %d\n", minor);
>     >     > -    return -1;
>     >     > -  }
>     >     > -}
>     >     > -
>     >     > -static void usart_write_polled(int minor, char c)
>     >     > -{
>     >     > -   while (1) {
>     >     > -     if ((BCM2835_REG(BCM2835_UART0_FR) &
>     BCM2835_UART0_FR_TXFF)
>     >     == 0)
>     >     > -       break;
>     >     > -   }
>     >     > -   BCM2835_REG(BCM2835_UART0_DR) = c;
>     >     > -}
>     >     > -
>     >     > -static ssize_t usart_write_support_polled(
>     >     > -  int minor,
>     >     > -  const char *s,
>     >     > -  size_t n
>     >     > -)
>     >     > -{
>     >     > -  ssize_t i = 0;
>     >     > -
>     >     > -  for (i = 0; i < n; ++i) {
>     >     > -    usart_write_polled(minor, s [i]);
>     >     > -  }
>     >     > -
>     >     > -  return n;
>     >     > -}
>     >     > -
>     >     > -static int usart_set_attributes(int minor, const struct termios
>     >     *term)
>     >     > -{
>     >     > -  return -1;
>     >     > -}
>     >     > -
>     >     > -const console_fns bcm2835_usart_fns = {
>     >     > -  .deviceProbe = libchip_serial_default_probe,
>     >     > -  .deviceFirstOpen = usart_first_open,
>     >     > -  .deviceLastClose = usart_last_close,
>     >     > -  .deviceRead = usart_read_polled,
>     >     > -  .deviceWrite = usart_write_support_polled,
>     >     > -  .deviceInitialize = usart_initialize,
>     >     > -  .deviceWritePolled = usart_write_polled,
>     >     > -  .deviceSetAttributes = usart_set_attributes,
>     >     > -  .deviceOutputUsesInterrupts = false
>     >     > -};
>     >     > diff --git a/bsps/arm/raspberrypi/include/bsp.h
>     >     b/bsps/arm/raspberrypi/include/bsp.h
>     >     > index b81d19cd76..190dd16184 100644
>     >     > --- a/bsps/arm/raspberrypi/include/bsp.h
>     >     > +++ b/bsps/arm/raspberrypi/include/bsp.h
>     >     > @@ -54,6 +54,8 @@ extern "C" {
>     >     >  #define BSP_CONSOLE_UART0   0
>     >     >  #define BSP_CONSOLE_FB      1
>     >     > 
>     >     > +void *raspberrypi_get_reg_of_node(const void *fdt, int node);
>     >     > +
>     >     >  void rpi_init_cmdline(void);
>     >     >  const char *rpi_cmdline_get_cached(void);
>     >     >  const char *rpi_cmdline_get_raw(void);
>     >     > diff --git a/bsps/arm/raspberrypi/include/bsp/fbcons.h
>     >     b/bsps/arm/raspberrypi/include/bsp/fbcons.h
>     >     > index d0e126699a..9de75ee5a4 100644
>     >     > --- a/bsps/arm/raspberrypi/include/bsp/fbcons.h
>     >     > +++ b/bsps/arm/raspberrypi/include/bsp/fbcons.h
>     >     > @@ -33,12 +33,25 @@ extern "C" {
>     >     > 
>     >     >  #define FB_CONSOLE 0x50492835
>     >     > 
>     >     > -bool fbcons_probe( int minor );
>     >     > +bool fbcons_probe(
>     >     > +  rtems_termios_device_context *base
>     >     > + );
>     >     > +
>     >     > +void fbcons_write_polled(
>     >     > +  rtems_termios_device_context *base,
>     >     > +  char c
>     >     > +);
>     >     > +
>     >     > +void output_char_fb(char c);
>     >     > +
>     >     > +typedef struct {
>     >     > +    rtems_termios_device_context base;
>     >     > +} rpi_fb_context ;
>     >     > 
>     >     >  /*
>     >     >   * Driver function table
>     >     >   */
>     >     > -extern const console_fns fbcons_fns;
>     >     > +extern const rtems_termios_device_handler fbcons_fns;
>     >     > 
>     >     >  #ifdef __cplusplus
>     >     >  }
>     >     > diff --git a/bsps/arm/raspberrypi/include/bsp/raspberrypi.h
>     >     b/bsps/arm/raspberrypi/include/bsp/raspberrypi.h
>     >     > index 40c80cf408..eeb48c42f1 100644
>     >     > --- a/bsps/arm/raspberrypi/include/bsp/raspberrypi.h
>     >     > +++ b/bsps/arm/raspberrypi/include/bsp/raspberrypi.h
>     >     > @@ -53,12 +53,24 @@
>     >     >   */
>     >     > 
>     >     >  #if (BSP_IS_RPI2 == 1)
>     >     > -   #define RPI_PERIPHERAL_BASE      0x3F000000
>     >     > +  #define RPI_PERIPHERAL_BASE    0x3F000000
>     >     > +  #define BASE_OFFSET            0X3F000000
>     >     >  #else
>     >     > -   #define RPI_PERIPHERAL_BASE      0x20000000
>     >     > +  #define RPI_PERIPHERAL_BASE    0x20000000
>     >     > +  #define BASE_OFFSET            0X5E000000
>     >     >  #endif
>     >     > 
>     >     > -#define RPI_PERIPHERAL_SIZE         0x01000000
>     >     > +#define RPI_PERIPHERAL_SIZE      0x01000000
>     >     > +
>     >     > +/**
>     >     > + * @name Bus to Physical address translation
>     >     > + *       Macro.
>     >     > + * @{
>     >     > + */
>     >     > +
>     >     > +#define BUS_TO_PHY(x)            ((x) - BASE_OFFSET)
>     >     > +
>     >     > +/** @} */
>     >     > 
>     >     >  /**
>     >     >   * @name Internal ARM Timer Registers
>     >     > @@ -184,42 +196,6 @@
>     >     > 
>     >     >  /** @} */
>     >     > 
>     >     > -/**
>     >     > - * @name UART 0 (PL011) Registers
>     >     > - *
>     >     > - * @{
>     >     > - */
>     >     > -
>     >     > -#define BCM2835_UART0_BASE       (RPI_PERIPHERAL_BASE +
>     0x201000)
>     >     > -
>     >     > -#define BCM2835_UART0_DR         (BCM2835_UART0_BASE + 0x00)
>     >     > -#define BCM2835_UART0_RSRECR     (BCM2835_UART0_BASE + 0x04)
>     >     > -#define BCM2835_UART0_FR         (BCM2835_UART0_BASE + 0x18)
>     >     > -#define BCM2835_UART0_ILPR       (BCM2835_UART0_BASE + 0x20)
>     >     > -#define BCM2835_UART0_IBRD       (BCM2835_UART0_BASE + 0x24)
>     >     > -#define BCM2835_UART0_FBRD       (BCM2835_UART0_BASE + 0x28)
>     >     > -#define BCM2835_UART0_LCRH       (BCM2835_UART0_BASE + 0x2C)
>     >     > -#define BCM2835_UART0_CR         (BCM2835_UART0_BASE + 0x30)
>     >     > -#define BCM2835_UART0_IFLS       (BCM2835_UART0_BASE + 0x34)
>     >     > -#define BCM2835_UART0_IMSC       (BCM2835_UART0_BASE + 0x38)
>     >     > -#define BCM2835_UART0_RIS        (BCM2835_UART0_BASE + 0x3C)
>     >     > -#define BCM2835_UART0_MIS        (BCM2835_UART0_BASE + 0x40)
>     >     > -#define BCM2835_UART0_ICR        (BCM2835_UART0_BASE + 0x44)
>     >     > -#define BCM2835_UART0_DMACR      (BCM2835_UART0_BASE + 0x48)
>     >     > -#define BCM2835_UART0_ITCR       (BCM2835_UART0_BASE + 0x80)
>     >     > -#define BCM2835_UART0_ITIP       (BCM2835_UART0_BASE + 0x84)
>     >     > -#define BCM2835_UART0_ITOP       (BCM2835_UART0_BASE + 0x88)
>     >     > -#define BCM2835_UART0_TDR        (BCM2835_UART0_BASE + 0x8C)
>     >     > -
>     >     > -#define BCM2835_UART0_MIS_RX    0x10
>     >     > -#define BCM2835_UART0_MIS_TX    0x20
>     >     > -#define BCM2835_UART0_IMSC_RX   0x10
>     >     > -#define BCM2835_UART0_IMSC_TX   0x20
>     >     > -#define BCM2835_UART0_FR_RXFE   0x10
>     >     > -#define BCM2835_UART0_FR_TXFF   0x20
>     >     > -#define BCM2835_UART0_ICR_RX    0x10
>     >     > -#define BCM2835_UART0_ICR_TX    0x20
>     >     > -
>     >     >  /** @} */
>     >     > 
>     >     >  /**
>     >     > diff --git a/bsps/arm/raspberrypi/include/bsp/usart.h
>     >     b/bsps/arm/raspberrypi/include/bsp/usart.h
>     >     > index d3e710c5e9..abbf53626c 100644
>     >     > --- a/bsps/arm/raspberrypi/include/bsp/usart.h
>     >     > +++ b/bsps/arm/raspberrypi/include/bsp/usart.h
>     >     > @@ -32,9 +32,8 @@
>     >     >  extern "C" {
>     >     >  #endif /* __cplusplus */
>     >     > 
>     >     > -#define USART0_DEFAULT_BAUD 115000
>     >     > -
>     >     > -extern const console_fns bcm2835_usart_fns;
>     >     > +#define PL011_DEFAULT_BAUD 115000
>     >     > +#define BCM2835_PL011_BASE (RPI_PERIPHERAL_BASE + 0x201000)
>     >     > 
>     >     >  #ifdef __cplusplus
>     >     >  }
>     >     > diff --git a/bsps/arm/raspberrypi/start/bspstart.c
>     >     b/bsps/arm/raspberrypi/start/bspstart.c
>     >     > index 6ff286f840..49896e4d47 100644
>     >     > --- a/bsps/arm/raspberrypi/start/bspstart.c
>     >     > +++ b/bsps/arm/raspberrypi/start/bspstart.c
>     >     > @@ -24,6 +24,8 @@
>     >     >  #include <bsp/raspberrypi.h>
>     >     >  #include <bsp/vc.h>
>     >     > 
>     >     > +#include <libfdt.h>
>     >     > +
>     >     >  static const struct {
>     >     >      uint32_t code;
>     >     >      const char* label;
>     >     > @@ -86,6 +88,19 @@ static const char* rpi_mem[] =
>     >     > 
>     >     >  #define NUMOF(_s) (sizeof(_s) / sizeof(_s[0]))
>     >     > 
>     >     > +void *raspberrypi_get_reg_of_node(const void *fdt, int node)
>     >     > +{
>     >     > +  int len;
>     >     > +  const uint32_t *val;
>     >     > +
>     >     > +  val = fdt_getprop(fdt, node, "reg", &len);
>     >     > +  if (val == NULL || len < 4) {
>     >     > +    return NULL;
>     >     > +  }
>     >     > +
>     >     > +  return (BUS_TO_PHY((void *) fdt32_to_cpu(val[0])));
>     >     > +}
>     >     > +
>     >     >  void bsp_start(void)
>     >     >  {
>     >     >      bcm2835_get_board_spec_entries spec = { 0 };
>     >     > diff --git a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
>     >     b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
>     >     > index 77aa360977..57562c10c7 100644
>     >     > --- a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
>     >     > +++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am
>     >     > @@ -64,11 +64,9 @@ librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/arm/shared/cp15/arm-cp15-set-exc
>     >     >  librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/arm/raspberrypi/irq/irq.c
>     >     > 
>     >     >  # Console
>     >     > -librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/shared/dev/serial/legacy-console.c
>     >     > -librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/shared/dev/serial/legacy-console-control.c
>     >     > +librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/shared/dev/serial/console-termios.c
>     >     > +librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/arm/shared/serial/arm-pl011.c
>     >     >  librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/arm/raspberrypi/console/console-config.c
>     >     > -librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/arm/raspberrypi/console/console_select.c
>     >     > -librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/arm/raspberrypi/console/usart.c
>     >     >  librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/arm/raspberrypi/console/fb.c
>     >     >  librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/arm/raspberrypi/console/fbcons.c
>     >     >  librtemsbsp_a_SOURCES +=
>     >     ../../../../../../bsps/arm/raspberrypi/console/outch.c
>     >     >
>     >
> 


More information about the devel mailing list