[PATCH 012/111] LEON3: implemented BSP DRVMGR startup initialization
Daniel Hellstrom
daniel at gaisler.com
Thu Feb 26 16:38:14 UTC 2015
---
c/src/lib/libbsp/sparc/leon3/amba/amba.c | 50 ++++++++++++++++++++
c/src/lib/libbsp/sparc/leon3/clock/ckinit.c | 10 ++++
c/src/lib/libbsp/sparc/leon3/console/console.c | 10 ++++
.../lib/libbsp/sparc/leon3/startup/bsppredriver.c | 32 ++++++++++++-
4 files changed, 101 insertions(+), 1 deletions(-)
diff --git a/c/src/lib/libbsp/sparc/leon3/amba/amba.c b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
index 8655ee3..8e6cef5 100644
--- a/c/src/lib/libbsp/sparc/leon3/amba/amba.c
+++ b/c/src/lib/libbsp/sparc/leon3/amba/amba.c
@@ -26,6 +26,46 @@ int leon3_timer_core_index __attribute__((weak)) = 0;
*/
struct ambapp_bus ambapp_plb;
+/* If RTEMS_DRVMGR_STARTUP is defined extra code is added that
+ * registers the GRLIB AMBA PnP bus driver as root driver.
+ */
+#ifdef RTEMS_DRVMGR_STARTUP
+#include <drvmgr/drvmgr.h>
+#include <drvmgr/ambapp_bus_grlib.h>
+
+extern void gptimer_register_drv (void);
+extern void apbuart_cons_register_drv(void);
+/* All drivers included by BSP, this is overridden by the user by including
+ * the drvmgr_confdefs.h. By default the Timer and UART driver are included.
+ */
+struct drvmgr_drv_reg_func drvmgr_drivers[] __attribute__((weak)) =
+{
+ {gptimer_register_drv},
+ {apbuart_cons_register_drv},
+ {NULL} /* End array with NULL */
+};
+
+/* Driver resources configuration for AMBA root bus. It is declared weak
+ * so that the user may override it, if the defualt settings are not
+ * enough.
+ */
+struct drvmgr_bus_res grlib_drv_resources __attribute__((weak)) =
+{
+ .next = NULL,
+ .resource =
+ {
+ RES_EMPTY,
+ }
+};
+
+/* GRLIB AMBA bus configuration (the LEON3 root bus configuration) */
+struct grlib_config grlib_bus_config =
+{
+ &ambapp_plb, /* AMBAPP bus setup */
+ &grlib_drv_resources, /* Driver configuration */
+};
+#endif
+
rtems_interrupt_lock LEON3_IrqCtrl_Lock =
RTEMS_INTERRUPT_LOCK_INITIALIZER("LEON3 IrqCtrl");
@@ -87,6 +127,12 @@ void amba_initialize(void)
/* Init Extended IRQ controller if available */
leon3_ext_irq_init();
+ /* If we are running without Driver Manager at startup, we must still
+ * assure that Timer and Console UART is working. So we can not
+ * depend on the DrvMgr capable Timer and Console UART drivers,
+ * instead we use the small-footprint drivers.
+ */
+#ifndef RTEMS_DRVMGR_STARTUP
/* find GP Timer */
adev = (void *)ambapp_for_each(&ambapp_plb, (OPTIONS_ALL|OPTIONS_APB_SLVS),
VENDOR_GAISLER, GAISLER_GPTIMER,
@@ -110,4 +156,8 @@ void amba_initialize(void)
if (leon3_timer_prescaler)
LEON3_Timer_Regs->scaler_reload = leon3_timer_prescaler;
}
+#else
+ /* Register Root bus, Use GRLIB AMBA PnP bus as root bus for LEON3 */
+ ambapp_grlib_root_register(&grlib_bus_config);
+#endif
}
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
index 15050eb..227b7c0 100644
--- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
@@ -25,6 +25,14 @@
#include <ambapp.h>
#include <rtems/score/profiling.h>
+/* The LEON3 BSP Timer driver can rely on the Driver Manager if the
+ * DrvMgr is initialized during startup. Otherwise the classic driver
+ * must be used.
+ *
+ * The DrvMgr Clock driver is located in the shared/timer directory
+ */
+#ifndef RTEMS_DRVMGR_STARTUP
+
#if SIMSPARC_FAST_IDLE==1
#define CLOCK_DRIVER_USE_FAST_IDLE 1
#endif
@@ -156,3 +164,5 @@ static uint32_t bsp_clock_nanoseconds_since_last_tick(void)
bsp_clock_nanoseconds_since_last_tick
#include "../../../shared/clockdrv_shell.h"
+
+#endif
diff --git a/c/src/lib/libbsp/sparc/leon3/console/console.c b/c/src/lib/libbsp/sparc/leon3/console/console.c
index 35767ce..4140bd6 100644
--- a/c/src/lib/libbsp/sparc/leon3/console/console.c
+++ b/c/src/lib/libbsp/sparc/leon3/console/console.c
@@ -30,6 +30,14 @@
#include <bsp/fatal.h>
#include <apbuart_termios.h>
+/* The LEON3 BSP UART driver can rely on the Driver Manager if the
+ * DrvMgr is initialized during startup. Otherwise the classic driver
+ * must be used.
+ *
+ * The DrvMgr APBUART driver is located in the shared/uart directory
+ */
+#ifndef RTEMS_DRVMGR_STARTUP
+
int syscon_uart_index __attribute__((weak)) = 0;
/* body is in debugputs.c */
@@ -157,3 +165,5 @@ rtems_device_driver console_initialize(
return RTEMS_SUCCESSFUL;
}
+
+#endif
diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bsppredriver.c b/c/src/lib/libbsp/sparc/leon3/startup/bsppredriver.c
index a45d9d3..bdc1ab8 100644
--- a/c/src/lib/libbsp/sparc/leon3/startup/bsppredriver.c
+++ b/c/src/lib/libbsp/sparc/leon3/startup/bsppredriver.c
@@ -16,6 +16,14 @@
#include <bsp.h>
#include <bsp/bootcard.h>
+static void leon3_interrupt_common_init( void )
+{
+ /* Initialize shared interrupt handling, must be done after IRQ
+ * controller has been found and initialized.
+ */
+ BSP_shared_interrupt_init();
+}
+
/*
* bsp_predriver_hook
*
@@ -24,8 +32,30 @@
*/
void bsp_predriver_hook( void )
{
+#ifndef RTEMS_DRVMGR_STARTUP
+ leon3_interrupt_common_init();
+#endif
+}
+
+#ifdef RTEMS_DRVMGR_STARTUP
+/*
+ * bsp_driver_level_hook
+ *
+ * BSP driver level hook. Called just after drivers have reached initialization
+ * level 'level' (1,2,3,4). See exinit.c for meaning of the every level.
+ *
+ * Initializes the BSP Interrupt layer
+ * After Level 1 we can trust that interrupt controller and system
+ * clock timer drivers now have been initialized.
+ */
+void bsp_driver_level_hook( int level )
+{
/* Initialize shared interrupt handling, must be done after IRQ
* controller has been found and initialized.
*/
- BSP_shared_interrupt_init();
+ if (level != 1)
+ return;
+
+ leon3_interrupt_common_init();
}
+#endif
--
1.7.0.4
More information about the devel
mailing list