[PATCH 33.2 3/5] LEON3: updated console driver for new AMBAPP layer

Gedare Bloom gedare at rtems.org
Mon Apr 16 15:09:54 UTC 2012


On Mon, Apr 16, 2012 at 4:49 AM, Daniel Hellstrom <daniel at gaisler.com> wrote:
> On 04/16/2012 01:21 AM, Joel Sherrill wrote:
>>
>> On 04/15/2012 01:53 PM, Gedare Bloom wrote:
>>>
>>> This seems ok. I found BSP_NUMBER_OF_TERMIOS_PORTS a little
>>> confusing--does it have any relation with
>>> CONFIGURE_NUMBER_OF_TERMIOS_PORTS or just is it similar in name?
>>>
>> It is intended to be the number known to be on the board
>> as a minimum. So rather than CONFIGURE_NUMBER_OF_TERMIOS_PORTS
>> defaulting to 1 when you enable console, it defaults to that
>> number.
>>
>> It may make sense to do away with that and let the user
>> just fail if they under configure.
>>
>> It is a component into CONFIGURE_NUMBER_OF_TERMIOS_PORTS.
>>
>> Dropping it would be OK if it doesn't stop a console from
>> initializing at all on a board with N>1 ports when running
>> hello world
>
>
> BSP_NUMBER_OF_TERMIOS_PORTS is the maximum number of UARTs the BSP supports.
> CONFIGURE_NUMBER_OF_TERMIOS_PORTS is termios-internal and is not available
> when the BSP builds?
>
I believe that is the case. The big no-no is for the BSP to define
that number itself.

> Now that the bsp_early_malloc() patch has been accepted, I might change this
> behavior in a future patch so that the private structures are allocated
> dynamically after probing how many UARTs are available. Probably it is not
> worth probing it, since it may take more space with the extra instructions
> than the current excess private data. On the other hand it is one single
> function call with the new AMBAPP layer to find the number of cores.
>
> Another possibility would be if CONFIGURE_NUMBER_OF_TERMIOS_PORTS were saved
> in a "configuration structure" I could have dynamically supported the user's
> configuration, by using bsp_early_malloc(sizeof(priv) * config->no_ports) in
> my UART init code... in the future :)
>
Yes that might be nice. It should be in one of the configuration
structures defined in confdefs. I'm not sure exactly what you have to
pull in to use it, I think config.h in the sapi has those structure
definitions.

> Thanks,
> Daniel
>
>
>>> -Gedare
>>>
>>> On Tue, Apr 10, 2012 at 7:33 AM, Daniel Hellstrom<daniel at gaisler.com>
>>>  wrote:
>>>>
>>>> Signed-off-by: Daniel Hellstrom<daniel at gaisler.com>
>>>> ---
>>>>  c/src/lib/libbsp/sparc/leon3/amba/amba.c         |    5 --
>>>>  c/src/lib/libbsp/sparc/leon3/console/console.c   |   51
>>>> +++++++++++++++++++---
>>>>  c/src/lib/libbsp/sparc/leon3/console/debugputs.c |   42
>>>> ++++++++---------
>>>>  c/src/lib/libbsp/sparc/leon3/include/amba.h      |    1 -
>>>>  c/src/lib/libbsp/sparc/leon3/include/bsp.h       |    3 +
>>>>  c/src/lib/libbsp/sparc/leon3/include/leon.h      |    7 ---
>>>>  c/src/lib/libbsp/sparc/leon3/startup/bspstart.c  |    9 +++-
>>>>  7 files changed, 75 insertions(+), 43 deletions(-)
>>>>
>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>>>> b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>>>> index e41d0aa..60281f3 100644
>>>> --- a/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>>>> +++ b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
>>>> @@ -39,8 +39,6 @@ volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs;
>>>>  *  amba_ahb_masters, amba_ahb_slaves and amba.
>>>>  */
>>>>
>>>> -extern int scan_uarts(void);
>>>> -
>>>>  void amba_initialize(void)
>>>>  {
>>>>   int icsel;
>>>> @@ -95,7 +93,4 @@ void amba_initialize(void)
>>>>     ambapp_freq_init(&ambapp_plb, adev,
>>>>                      (LEON3_Timer_Regs->scaler_reload + 1) * 1000000);
>>>>   }
>>>> -
>>>> -  /* find UARTS */
>>>> -  scan_uarts();
>>>>  }
>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/console/console.c
>>>> b/c/src/lib/libbsp/sparc/leon3/console/console.c
>>>> index 320aa37..fa67d37 100644
>>>> --- a/c/src/lib/libbsp/sparc/leon3/console/console.c
>>>> +++ b/c/src/lib/libbsp/sparc/leon3/console/console.c
>>>> @@ -62,6 +62,12 @@ extern int apbuart_inbyte_nonblocking(ambapp_apb_uart
>>>> *regs);
>>>>
>>>>  /* body is in debugputs.c */
>>>>
>>>> +struct apbuart_priv {
>>>> +  ambapp_apb_uart *regs;
>>>> +  unsigned int freq_hz;
>>>> +};
>>>> +static struct apbuart_priv apbuarts[BSP_NUMBER_OF_TERMIOS_PORTS];
>>>> +static int uarts = 0;
>>>>
>>>>  /*
>>>>  *  Console Termios Support Entry Points
>>>> @@ -78,7 +84,7 @@ ssize_t console_write_support (int minor, const char
>>>> *buf, size_t len)
>>>>     port = minor - 1;
>>>>
>>>>   while (nwrite<  len) {
>>>> -    apbuart_outbyte_polled((ambapp_apb_uart*)LEON3_Console_Uart[port],
>>>> *buf++);
>>>> +    apbuart_outbyte_polled(apbuarts[port].regs, *buf++);
>>>>     nwrite++;
>>>>   }
>>>>   return nwrite;
>>>> @@ -93,15 +99,44 @@ int console_pollRead(int minor)
>>>>   else
>>>>     port = minor - 1;
>>>>
>>>> -  return
>>>> apbuart_inbyte_nonblocking((ambapp_apb_uart*)LEON3_Console_Uart[port]);
>>>> +  return apbuart_inbyte_nonblocking(apbuarts[port].regs);
>>>> +}
>>>> +
>>>> +/* AMBA PP find routine. Extract AMBA PnP information into data
>>>> structure. */
>>>> +int find_matching_apbuart(struct ambapp_dev *dev, int index, void *arg)
>>>> +{
>>>> +  struct ambapp_apb_info *apb = (struct ambapp_apb_info *)dev->devinfo;
>>>> +
>>>> +  /* Extract needed information of one APBUART */
>>>> +  apbuarts[uarts].regs = (ambapp_apb_uart *)apb->start;
>>>> +  /* Get APBUART core frequency, it is assumed that it is the same
>>>> +   * as Bus frequency where the UART is situated
>>>> +   */
>>>> +  apbuarts[uarts].freq_hz = ambapp_freq_get(&ambapp_plb, dev);
>>>> +  uarts++;
>>>> +
>>>> +  if (uarts>= BSP_NUMBER_OF_TERMIOS_PORTS)
>>>> +    return 1; /* Satisfied number of UARTs, stop search */
>>>> +  else
>>>> +    return 0; /* Continue searching for more UARTs */
>>>> +}
>>>> +
>>>> +/* Find all UARTs */
>>>> +int console_scan_uarts(void)
>>>> +{
>>>> +  memset(apbuarts, 0, sizeof(apbuarts));
>>>> +
>>>> +  /* Find APBUART cores */
>>>> +  ambapp_for_each(&ambapp_plb, (OPTIONS_ALL|OPTIONS_APB_SLVS),
>>>> VENDOR_GAISLER,
>>>> +                  GAISLER_APBUART, find_matching_apbuart, NULL);
>>>> +
>>>> +  return uarts;
>>>>  }
>>>>
>>>>  /*
>>>>  *  Console Device Driver Entry Points
>>>>  *
>>>>  */
>>>> -int uarts = 0;
>>>> -volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
>>>>
>>>>  rtems_device_driver console_initialize(
>>>>   rtems_device_major_number  major,
>>>> @@ -115,6 +150,9 @@ rtems_device_driver console_initialize(
>>>>
>>>>   rtems_termios_initialize();
>>>>
>>>> +  /* Find UARTs */
>>>> +  console_scan_uarts();
>>>> +
>>>>   /* Update syscon_uart_index to index used as /dev/console
>>>>    * Let user select System console by setting syscon_uart_index. If the
>>>>    * BSP is to provide the default UART (syscon_uart_index==0):
>>>> @@ -190,9 +228,8 @@ rtems_device_driver console_open(
>>>>     port = minor - 1;
>>>>
>>>>   /* Initialize UART on opening */
>>>> -  LEON3_Console_Uart[port]->ctrl |= LEON_REG_UART_CTRL_RE |
>>>> -                                     LEON_REG_UART_CTRL_TE;
>>>> -  LEON3_Console_Uart[port]->status = 0;
>>>> +  apbuarts[port]->regs->ctrl |= LEON_REG_UART_CTRL_RE |
>>>> LEON_REG_UART_CTRL_TE;
>>>> +  apbuarts[port]->regs->status = 0;
>>>>
>>>>   return RTEMS_SUCCESSFUL;
>>>>  }
>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
>>>> b/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
>>>> index 43c6d7d..c6e0648 100644
>>>> --- a/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
>>>> +++ b/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
>>>> @@ -23,11 +23,6 @@
>>>>  #include<assert.h>
>>>>  #include<stdio.h>
>>>>
>>>> -/*
>>>> - * Number of uarts on AMBA bus
>>>> - */
>>>> -extern int uarts;
>>>> -
>>>>  static int isinit = 0;
>>>>
>>>>  /* Let user override which on-chip APBUART will be debug UART
>>>> @@ -40,24 +35,16 @@ static int isinit = 0;
>>>>  int debug_uart_index __attribute__((weak)) = 0;
>>>>  ambapp_apb_uart *dbg_uart = NULL;
>>>>
>>>> -/*
>>>> - *  Scan for UARTS in configuration
>>>> +/* Initialize the BSP system debug console layer. It will scan AMBA
>>>> Plu&Play
>>>> + * for a debug APBUART and enable RX/TX for that UART.
>>>>  */
>>>> -int scan_uarts(void)
>>>> +int bsp_debug_uart_init(void)
>>>>  {
>>>>   int i;
>>>> -  amba_apb_device apbuarts[LEON3_APBUARTS];
>>>> +  struct ambapp_dev *adev;
>>>> +  struct ambapp_apb_info *apb;
>>>>
>>>>   if (isinit == 0) {
>>>> -    i = 0;
>>>> -    uarts = 0;
>>>> -
>>>> -    uarts = amba_find_apbslvs(
>>>> -&amba_conf, VENDOR_GAISLER, GAISLER_APBUART, apbuarts, LEON3_APBUARTS);
>>>> -    for(i=0; i<uarts; i++) {
>>>> -      LEON3_Console_Uart[i] = (volatile LEON3_UART_Regs_Map
>>>> *)apbuarts[i].start;
>>>> -    }
>>>> -
>>>>     /* Update debug_uart_index to index used as debug console.
>>>>      * Let user select Debug console by setting debug_uart_index. If the
>>>>      * BSP is to provide the default UART (debug_uart_index==0):
>>>> @@ -74,16 +61,27 @@ int scan_uarts(void)
>>>>       debug_uart_index = debug_uart_index - 1; /* User selected
>>>> dbg-console */
>>>>     }
>>>>
>>>> -    /* initialize debug uart if present for printk */
>>>> -    if (debug_uart_index<  uarts) {
>>>> -      dbg_uart = (ambapp_apb_uart
>>>> *)LEON3_Console_Uart[debug_uart_index];
>>>> +    /* Find APBUART core for System Debug Console */
>>>> +    i = debug_uart_index;
>>>> +    adev = (void *)ambapp_for_each(&ambapp_plb,
>>>> (OPTIONS_ALL|OPTIONS_APB_SLVS),
>>>> +                                   VENDOR_GAISLER, GAISLER_APBUART,
>>>> +                                   ambapp_find_by_idx, (void *)&i);
>>>> +    if (adev) {
>>>> +      /* Found a matching debug console, initialize debug uart if
>>>> present
>>>> +       * for printk
>>>> +       */
>>>> +      apb = (struct ambapp_apb_info *)adev->devinfo;
>>>> +      dbg_uart = (ambapp_apb_uart *)apb->start;
>>>>       dbg_uart->ctrl |= LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE;
>>>>       dbg_uart->status = 0;
>>>>     }
>>>>     isinit = 1;
>>>>   }
>>>>
>>>> -  return uarts;
>>>> +  if (dbg_uart == NULL)
>>>> +    return 0;
>>>> +  else
>>>> +    return 1;
>>>>  }
>>>>
>>>>  /*
>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/include/amba.h
>>>> b/c/src/lib/libbsp/sparc/leon3/include/amba.h
>>>> index aa13f2c..32b4a42 100644
>>>> --- a/c/src/lib/libbsp/sparc/leon3/include/amba.h
>>>> +++ b/c/src/lib/libbsp/sparc/leon3/include/amba.h
>>>> @@ -25,7 +25,6 @@
>>>>  #define LEON3_AHB_MASTERS 64
>>>>  #define LEON3_AHB_SLAVES 64
>>>>  #define LEON3_APB_SLAVES 16
>>>> -#define LEON3_APBUARTS 8
>>>>
>>>>  #include<ambapp.h>
>>>>
>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/include/bsp.h
>>>> b/c/src/lib/libbsp/sparc/leon3/include/bsp.h
>>>> index e5ae2c1..d883064 100644
>>>> --- a/c/src/lib/libbsp/sparc/leon3/include/bsp.h
>>>> +++ b/c/src/lib/libbsp/sparc/leon3/include/bsp.h
>>>> @@ -41,6 +41,9 @@ extern "C" {
>>>>  void *bsp_idle_thread( uintptr_t ignored );
>>>>  #define BSP_IDLE_TASK_BODY bsp_idle_thread
>>>>
>>>> +/* Maximum supported APBUARTs by BSP */
>>>> +#define BSP_NUMBER_OF_TERMIOS_PORTS 8
>>>> +
>>>>  /*
>>>>  * Network driver configuration
>>>>  */
>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/include/leon.h
>>>> b/c/src/lib/libbsp/sparc/leon3/include/leon.h
>>>> index 819800c..da752b2 100644
>>>> --- a/c/src/lib/libbsp/sparc/leon3/include/leon.h
>>>> +++ b/c/src/lib/libbsp/sparc/leon3/include/leon.h
>>>> @@ -47,12 +47,6 @@ extern "C" {
>>>>     (_trap)<= 0x1F )
>>>>
>>>>  typedef struct {
>>>> -  volatile unsigned int data;
>>>> -  volatile unsigned int status;
>>>> -  volatile unsigned int ctrl;
>>>> -} LEON3_UART_Regs_Map;
>>>> -
>>>> -typedef struct {
>>>>   volatile unsigned int value;
>>>>   volatile unsigned int reload;
>>>>   volatile unsigned int conf;
>>>> @@ -147,7 +141,6 @@ typedef struct {
>>>>
>>>>  extern volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs;  /* LEON3
>>>> Interrupt Controller */
>>>>  extern volatile LEON3_Timer_Regs_Map *LEON3_Timer_Regs; /* LEON3 GP
>>>> Timer */
>>>> -extern volatile LEON3_UART_Regs_Map
>>>> *LEON3_Console_Uart[LEON3_APBUARTS];
>>>>
>>>>  /* LEON3 CPU Index of boot CPU */
>>>>  extern int LEON3_Cpu_Index;
>>>> diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
>>>> b/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
>>>> index 9cad164..50fa5e5 100644
>>>> --- a/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
>>>> +++ b/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
>>>> @@ -31,6 +31,7 @@ int CPU_SPARC_HAS_SNOOPING;
>>>>  int LEON3_Cpu_Index = 0;
>>>>
>>>>  extern void amba_initialize(void);
>>>> +extern void bsp_debug_uart_init(void);
>>>>
>>>>  /*
>>>>  * set_snooping
>>>> @@ -75,6 +76,12 @@ void bsp_start( void )
>>>>    */
>>>>   LEON3_Cpu_Index = (get_asr17()>>  28)&  3;
>>>>
>>>> -  /* Find UARTs */
>>>> +  /* Scan AMBA Plug&Play and parse it into a RAM description
>>>> (ambapp_plb),
>>>> +   * find GPTIMER for bus frequency, find IRQ Controller and initialize
>>>> +   * interrupt support
>>>> +   */
>>>>   amba_initialize();
>>>> +
>>>> +  /* find debug UART for printk() */
>>>> +  bsp_debug_uart_init();
>>>>  }
>>>> --
>>>> 1.7.0.4
>>>>
>>>> _______________________________________________
>>>> rtems-devel mailing list
>>>> rtems-devel at rtems.org
>>>> http://www.rtems.org/mailman/listinfo/rtems-devel
>>>
>>> _______________________________________________
>>> rtems-devel mailing list
>>> rtems-devel at rtems.org
>>> http://www.rtems.org/mailman/listinfo/rtems-devel
>>
>>
>>
>




More information about the devel mailing list