[PATCH 33.2 3/5] LEON3: updated console driver for new AMBAPP layer
Joel Sherrill
joel.sherrill at OARcorp.com
Mon Apr 16 15:31:24 UTC 2012
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.
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)
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.
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
>> 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