summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2010-05-24 15:05:19 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2010-05-24 15:05:19 +0000
commitd17733ccd8ebc56809aec8dd6bb681ff6f23b673 (patch)
tree3f74c53181b626b226660c8f6c8d6b241132532f /c
parentRegenerate. (diff)
downloadrtems-d17733ccd8ebc56809aec8dd6bb681ff6f23b673.tar.bz2
2010-05-24 Joel Sherrill <joel.sherrill@oarcorp.com>
* Makefile.am, amba/amba.c, console/console.c, console/debugputs.c, startup/bspstart.c: Rework initialization order so AMBA bus is scanned earlier. This lets us look for UARTs earlier and support printk as early as bsp_start() returning.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/sparc/leon3/ChangeLog7
-rw-r--r--c/src/lib/libbsp/sparc/leon3/Makefile.am2
-rw-r--r--c/src/lib/libbsp/sparc/leon3/amba/amba.c9
-rw-r--r--c/src/lib/libbsp/sparc/leon3/console/console.c32
-rw-r--r--c/src/lib/libbsp/sparc/leon3/console/debugputs.c32
-rw-r--r--c/src/lib/libbsp/sparc/leon3/startup/bspstart.c5
6 files changed, 54 insertions, 33 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/ChangeLog b/c/src/lib/libbsp/sparc/leon3/ChangeLog
index 2b04f95f17..c8091c8aeb 100644
--- a/c/src/lib/libbsp/sparc/leon3/ChangeLog
+++ b/c/src/lib/libbsp/sparc/leon3/ChangeLog
@@ -1,3 +1,10 @@
+2010-05-24 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * Makefile.am, amba/amba.c, console/console.c, console/debugputs.c,
+ startup/bspstart.c: Rework initialization order so AMBA bus is
+ scanned earlier. This lets us look for UARTs earlier and support
+ printk as early as bsp_start() returning.
+
2010-05-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
* startup/linkcmds: Include basic linker command file and define only
diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am b/c/src/lib/libbsp/sparc/leon3/Makefile.am
index 996c4dc0da..ebe8ffbf41 100644
--- a/c/src/lib/libbsp/sparc/leon3/Makefile.am
+++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am
@@ -39,7 +39,7 @@ libbsp_a_SOURCES =
# startup
libbsp_a_SOURCES += ../../shared/bspclean.c ../../shared/bsplibc.c \
../../shared/bsppost.c ../../shared/bootcard.c startup/bspstart.c \
- ../../sparc/shared/bsppretaskinghook.c \
+ ../../sparc/shared/bsppretaskinghook.c ../../shared/bsppredriverhook.c \
../../sparc/shared/bspgetworkarea.c ../../shared/sbrk.c startup/setvec.c \
startup/spurious.c startup/bspidle.S
# gnatsupp
diff --git a/c/src/lib/libbsp/sparc/leon3/amba/amba.c b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
index ad901df1c0..6f86e27ded 100644
--- a/c/src/lib/libbsp/sparc/leon3/amba/amba.c
+++ b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
@@ -24,9 +24,9 @@ volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs;
int LEON3_Cpu_Index = 0;
/*
- * bsp_predriver_hook
+ * amba_initialize
*
- * BSP predriver hook. Called just before drivers are initialized.
+ * Must be called just before drivers are initialized.
* Used to scan system bus. Probes for AHB masters, AHB slaves and
* APB slaves. Addresses to configuration areas of the AHB masters,
* AHB slaves, APB slaves and APB master are storeds in
@@ -43,8 +43,9 @@ asm(" .text \n"
extern rtems_configuration_table Configuration;
+extern int scan_uarts(void);
-void bsp_predriver_hook(void)
+void amba_initialize(void)
{
int i;
amba_apb_device dev;
@@ -71,4 +72,6 @@ void bsp_predriver_hook(void)
LEON3_Timer_Regs = (volatile LEON3_Timer_Regs_Map *) dev.start;
}
+ /* 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 b3e2c6884e..fee8721dee 100644
--- a/c/src/lib/libbsp/sparc/leon3/console/console.c
+++ b/c/src/lib/libbsp/sparc/leon3/console/console.c
@@ -76,27 +76,8 @@ ssize_t console_write_support (int minor, const char *buf, size_t len)
*
*/
int uarts = 0;
-static int isinit = 0;
volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
-int scan_uarts(void) {
- int i;
- amba_apb_device apbuarts[LEON3_APBUARTS];
-
- 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;
- }
- isinit = 1;
- }
- return uarts;
-}
-
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
@@ -109,10 +90,7 @@ rtems_device_driver console_initialize(
rtems_termios_initialize();
- /* Find UARTs */
- scan_uarts();
-
- /* default to zero and override if multiprocessing */
+ /* default console to zero and override if multiprocessing */
uart0 = 0;
#if defined(RTEMS_MULTIPROCESSING)
if (rtems_configuration_get_user_multiprocessing_table() != NULL)
@@ -120,22 +98,18 @@ rtems_device_driver console_initialize(
#endif
/* Register Device Names */
-
- if (uarts && (uart0 < uarts))
- {
+ if (uarts && (uart0 < uarts)) {
status = rtems_io_register_name( "/dev/console", major, 0 );
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
strcpy(console_name,"/dev/console_a");
- for (i = uart0+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 if ONLY CPU or first CPU in MP system
*/
diff --git a/c/src/lib/libbsp/sparc/leon3/console/debugputs.c b/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
index b6276930d3..2cd0d136e1 100644
--- a/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
+++ b/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
@@ -27,6 +27,38 @@
*/
extern int uarts;
+static int isinit = 0;
+
+/*
+ * Scan for UARTS in configuration
+ */
+int scan_uarts(void)
+{
+ int i;
+ amba_apb_device apbuarts[LEON3_APBUARTS];
+
+ 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;
+ }
+
+ /* initialize uart 0 if present for printk */
+ if ( uarts ) {
+ LEON3_Console_Uart[0]->ctrl |=
+ LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE;
+ LEON3_Console_Uart[0]->status = 0;
+ }
+ isinit = 1;
+ }
+
+ return uarts;
+}
+
/*
* console_outbyte_polled
*
diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c b/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
index fd44df82cf..fbe6b876ed 100644
--- a/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
+++ b/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
@@ -27,6 +27,8 @@
*/
int CPU_SPARC_HAS_SNOOPING;
+extern void amba_initialize(void);
+
/*
* set_snooping
*
@@ -54,4 +56,7 @@ static inline int set_snooping(void)
void bsp_start( void )
{
CPU_SPARC_HAS_SNOOPING = set_snooping();
+
+ /* Find UARTs */
+ amba_initialize();
}