[PATCH 33.2 3/5] LEON3: updated console driver for new AMBAPP layer
Gedare Bloom
gedare at rtems.org
Sun Apr 15 18:53:26 UTC 2012
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?
-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
More information about the devel
mailing list