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

Joel Sherrill joel.sherrill at OARcorp.com
Tue Apr 17 16:09:48 UTC 2012


Daniel

I think you just picked a bad name with BSP_NUMBER_OF_TERMIOS_PORTS
since it reminded me of code which was removed between 4.9
and 4.10 which did something similar in bsp.h but impacted confdefs.h.
AFAIK there is nothing in the tree now where the BSP has impact
on the minimum number of termios ports configured.

The BSP can have lots of potential termios ports and the application
can disable termios and ignore them all. With no resources reserved.

But still very close to the CONFIGURE_xxx name and best to avoid
confusion.

I just wanted to clarify what I was thinking since it didn't match the
current code.

--joel

On 04/17/2012 06:40 AM, Daniel Hellstrom wrote:
> On 04/16/2012 05:31 PM, Joel Sherrill wrote:
>> On 04/16/2012 10:09 AM, Gedare Bloom wrote:
>>> 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.
>> Right. Consider a PC or any other board which can take add-on cards.
>> The BSP knows the UARTs on the base board but cannot account for
>> any add-ons.
> I agree, and with LEON the on-chip peripherals are plug-and-played like add-on boards.
>
>> For example, I know of an RTEMS application with an embedded PC
>> that has almost 40 serial ports.
>>>> 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.
>> CONFIGURE_NUMBER_OF_TERMIOS_PORTS is only used to
>> reserve enough RTEMS workspace so you can open all
>> termios ports concurrently.  This is currently the only use
>> since termios only uses semaphores.
>>
>> #define CONFIGURE_TERMIOS_SEMAPHORES \
>>      ((CONFIGURE_NUMBER_OF_TERMIOS_PORTS * 4) + 1)
> Ok, I see.
>
>> Daniel.. if the user has PCI and plugs in an 8-port UART board,
>> then your allocation of memory for those 8 ports is unnecessary.
> If a PCI UART add-on board is added, another driver must be used. Since it will probably not be a APBUART on PCI, and the APBUART driver only supports on-chip APBUARTs. However, together with our
> driver manager I am able to reuse the code in the APBUART driver for both on-chip and AMBA-over-PCI devices, in order to support that I have introduced a new console.c (called cons.c).
>
>> And whether the hardware has N termios ports or not, the
>> application may choose not to use them all and not need
>> the reserved workspace.
>>
>> I would lean to eliminating BSP_NUMBER_OF_TERMIOS_PORTS
> Note that I'm not introducing a new limitation here, the old code has always been limited to LEON3_APBUARTS uarts. I have just renamed it to BSP_NUMBER_OF_TERMIOS_PORTS, perhaps I should not have done
> that. Old code:
>
> int uarts = 0;
> volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
>
> I will try to eliminate BSP_NUMBER_OF_TERMIOS_PORTS as soon as I can, now that bsp_early_malloc() is in the BSP, I can make this dynamic. And as Joel say, the number of BSP UARTs should not depend on
> the TERMIOS layer.
>
> Daniel
>
>
>>>> 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
>>>>>
>>


-- 
Joel Sherrill, Ph.D.             Director of Research&   Development
joel.sherrill at OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
     Support Available             (256) 722-9985





More information about the devel mailing list