diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2006-04-24 16:58:41 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2006-04-24 16:58:41 +0000 |
commit | cadb5d1641059adb5bbef5900e2cefee653f2b74 (patch) | |
tree | 6353a9fe2f02c1b89b69e6cf55eef27d24710ce7 /c/src/lib/libbsp/sparc/leon3/console/console.c | |
parent | 2006-04-24 Joel Sherrill <joel@OARcorp.com> (diff) | |
download | rtems-cadb5d1641059adb5bbef5900e2cefee653f2b74.tar.bz2 |
2006-04-24 Jiri Gaisler <jiri@gaisler.com>
Edvin Catovic <edvin@gaisler.com>
PR bsps/972
* ChangeLog, Makefile.am, configure.ac, amba/amba.c, clock/ckinit.c,
console/Makefile.am, console/console.c, console/debugputs.c,
include/Makefile.am, include/amba.h, include/bsp.h, include/leon.h,
leon_smc91111/leon_smc91111.c, startup/bspstart.c, timer/timer.c,
tools/Makefile.am, wrapup/Makefile.am: Added Shared Memory Support
Driver. Added Leon Gaisler Research Ethernet support. Enhanced AMBA
bus support.
* console/debugprintf.c, console/spacewire.c, include/spacewire.h,
leon_greth/.cvsignore, leon_greth/Makefile.am,
leon_greth/leon_greth.c, shmsupp/.cvsignore, shmsupp/Makefile.am,
shmsupp/addrconv.c, shmsupp/getcfg.c, shmsupp/lock.c,
shmsupp/mpisr.c: New files.
Diffstat (limited to 'c/src/lib/libbsp/sparc/leon3/console/console.c')
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/console/console.c | 63 |
1 files changed, 40 insertions, 23 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/console/console.c b/c/src/lib/libbsp/sparc/leon3/console/console.c index 41dd26c449..966bad0948 100644 --- a/c/src/lib/libbsp/sparc/leon3/console/console.c +++ b/c/src/lib/libbsp/sparc/leon3/console/console.c @@ -85,8 +85,29 @@ int console_write_support (int minor, const char *buf, int len) * Console Device Driver Entry Points * */ +int uarts = 0; +static int isinit = 0; +volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS]; + +int scan_uarts() { + unsigned int iobar, conf; + int i; + if (isinit == 0) { + i = 0; uarts = 0; + while (i < amba_conf.apbslv.devnr) { + conf = amba_get_confword(amba_conf.apbslv, i, 0); + if ((amba_vendor(conf) == VENDOR_GAISLER) && (amba_device(conf) == GAISLER_APBUART)){ + iobar = amba_apb_get_membar(amba_conf.apbslv, i); + LEON3_Console_Uart[uarts] = (volatile LEON3_UART_Regs_Map *) amba_iobar_start(amba_conf.apbmst, iobar); + uarts++; + } + i++; + } + isinit = 1; + } + return uarts; +} -volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS]; rtems_device_driver console_initialize( rtems_device_major_number major, @@ -95,52 +116,48 @@ rtems_device_driver console_initialize( ) { rtems_status_code status; - unsigned int iobar, conf; - int i, uarts; + int i; char *console_name = "/dev/console_a"; - + extern rtems_configuration_table Configuration; + int uart0; rtems_termios_initialize(); /* Find UARTs */ - - i = 0; uarts = 0; - while (i < amba_conf.apbslv.devnr) - { - conf = amba_get_confword(amba_conf.apbslv, i, 0); - if ((amba_vendor(conf) == VENDOR_GAISLER) && (amba_device(conf) == GAISLER_APBUART)) - { - iobar = amba_apb_get_membar(amba_conf.apbslv, i); - LEON3_Console_Uart[uarts] = (volatile LEON3_UART_Regs_Map *) amba_iobar_start(amba_conf.apbmst, iobar); - uarts++; - } - i++; - } + scan_uarts(); + if (Configuration.User_multiprocessing_table != NULL) + uart0 = LEON3_Cpu_Index; + else + uart0 = 0; + /* Register Device Names */ - if (uarts) + if (uarts && (uart0 < uarts)) { status = rtems_io_register_name( "/dev/console", major, 0 ); if (status != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred(status); - for (i = 1; i < uarts; i++) + for (i = uart0+1; i < uarts; i++) { console_name[13]++; status = rtems_io_register_name( console_name, major, i); } } - /* * Initialize Hardware */ - for (i = 0; i < uarts; i++) + if ((Configuration.User_multiprocessing_table == NULL) || + ((Configuration.User_multiprocessing_table)->node == 1)) { - LEON3_Console_Uart[i]->ctrl |= LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE; - LEON3_Console_Uart[i]->status = 0; + for (i = uart0; i < uarts; i++) + { + LEON3_Console_Uart[i]->ctrl |= LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE; + LEON3_Console_Uart[i]->status = 0; + } } return RTEMS_SUCCESSFUL; |