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

Daniel Hellstrom daniel at gaisler.com
Mon Apr 16 08:49:05 UTC 2012


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?

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 :)

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