forked from Imagelibrary/rtems
arm/a9mpcore: Add support to get the clock via a weak linkage function.
This allows an application to provide a localised clock freq with needing to go down the BSP opts path. This is important with the Zynq where the Xilinx tools generate the frequency.
This commit is contained in:
@@ -18,9 +18,19 @@
|
|||||||
|
|
||||||
#define A9MPCORE_PT ((volatile a9mpcore_pt *) BSP_ARM_A9MPCORE_PT_BASE)
|
#define A9MPCORE_PT ((volatile a9mpcore_pt *) BSP_ARM_A9MPCORE_PT_BASE)
|
||||||
|
|
||||||
|
static uint64_t a9mpcore_clock_last_tick_k;
|
||||||
|
|
||||||
/* This is defined in clockdrv_shell.h */
|
/* This is defined in clockdrv_shell.h */
|
||||||
void Clock_isr(rtems_irq_hdl_param arg);
|
void Clock_isr(rtems_irq_hdl_param arg);
|
||||||
|
|
||||||
|
uint32_t a9mpcore_clock_periphclk(void) __attribute__ ((weak));
|
||||||
|
|
||||||
|
uint32_t a9mpcore_clock_periphclk(void)
|
||||||
|
{
|
||||||
|
/* default to the BSP option. */
|
||||||
|
return BSP_ARM_A9MPCORE_PERIPHCLK;
|
||||||
|
}
|
||||||
|
|
||||||
static void a9mpcore_clock_at_tick(void)
|
static void a9mpcore_clock_at_tick(void)
|
||||||
{
|
{
|
||||||
volatile a9mpcore_pt *pt = A9MPCORE_PT;
|
volatile a9mpcore_pt *pt = A9MPCORE_PT;
|
||||||
@@ -50,9 +60,12 @@ static void a9mpcore_clock_handler_install(void)
|
|||||||
static void a9mpcore_clock_initialize(void)
|
static void a9mpcore_clock_initialize(void)
|
||||||
{
|
{
|
||||||
volatile a9mpcore_pt *pt = A9MPCORE_PT;
|
volatile a9mpcore_pt *pt = A9MPCORE_PT;
|
||||||
uint64_t interval = ((uint64_t) BSP_ARM_A9MPCORE_PERIPHCLK
|
uint64_t periphclk = (uint64_t) a9mpcore_clock_periphclk();
|
||||||
|
uint64_t interval = (periphclk
|
||||||
* (uint64_t) rtems_configuration_get_microseconds_per_tick()) / 1000000;
|
* (uint64_t) rtems_configuration_get_microseconds_per_tick()) / 1000000;
|
||||||
|
|
||||||
|
a9mpcore_clock_last_tick_k = (1000000000ULL << 32) / periphclk;
|
||||||
|
|
||||||
pt->load = (uint32_t) interval - 1;
|
pt->load = (uint32_t) interval - 1;
|
||||||
pt->ctrl = A9MPCORE_PT_CTRL_AUTO_RLD
|
pt->ctrl = A9MPCORE_PT_CTRL_AUTO_RLD
|
||||||
| A9MPCORE_PT_CTRL_IRQ_EN
|
| A9MPCORE_PT_CTRL_IRQ_EN
|
||||||
@@ -83,7 +96,7 @@ static void a9mpcore_clock_cleanup(void)
|
|||||||
static uint32_t a9mpcore_clock_nanoseconds_since_last_tick(void)
|
static uint32_t a9mpcore_clock_nanoseconds_since_last_tick(void)
|
||||||
{
|
{
|
||||||
volatile a9mpcore_pt *pt = A9MPCORE_PT;
|
volatile a9mpcore_pt *pt = A9MPCORE_PT;
|
||||||
uint64_t k = (1000000000ULL << 32) / BSP_ARM_A9MPCORE_PERIPHCLK;
|
uint64_t k = a9mpcore_clock_last_tick_k;
|
||||||
uint32_t c = pt->cntr;
|
uint32_t c = pt->cntr;
|
||||||
uint32_t p = pt->load + 1;
|
uint32_t p = pt->load + 1;
|
||||||
|
|
||||||
|
|||||||
29
c/src/lib/libbsp/arm/shared/include/arm-a9mpcore-clock.h
Normal file
29
c/src/lib/libbsp/arm/shared/include/arm-a9mpcore-clock.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Chris Johns <chrisj@rtems.org>. All rights reserved.
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIBBSP_ARM_SHARED_ARM_A9MPCORE_CLOCK_H
|
||||||
|
#define LIBBSP_ARM_SHARED_ARM_A9MPCORE_CLOCK_H
|
||||||
|
|
||||||
|
#include <bsp.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the peripheral clock. For systems such as the zynq this
|
||||||
|
* is controlled by the PL logic generation and can vary. Provide this
|
||||||
|
* function in your application to override the BSP default.
|
||||||
|
*/
|
||||||
|
uint32_t a9mpcore_clock_periphclk(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* LIBBSP_ARM_SHARED_ARM_A9MPCORE_CLOCK_H */
|
||||||
@@ -33,6 +33,7 @@ include_bsp_HEADERS += ../../shared/include/irq-info.h
|
|||||||
include_bsp_HEADERS += ../../shared/include/stackalloc.h
|
include_bsp_HEADERS += ../../shared/include/stackalloc.h
|
||||||
include_bsp_HEADERS += ../../shared/tod.h
|
include_bsp_HEADERS += ../../shared/tod.h
|
||||||
include_bsp_HEADERS += ../shared/include/start.h
|
include_bsp_HEADERS += ../shared/include/start.h
|
||||||
|
include_bsp_HEADERS += ../shared/include/arm-a9mpcore-clock.h
|
||||||
include_bsp_HEADERS += ../shared/include/arm-a9mpcore-irq.h
|
include_bsp_HEADERS += ../shared/include/arm-a9mpcore-irq.h
|
||||||
include_bsp_HEADERS += ../shared/include/arm-a9mpcore-regs.h
|
include_bsp_HEADERS += ../shared/include/arm-a9mpcore-regs.h
|
||||||
include_bsp_HEADERS += ../shared/include/arm-a9mpcore-start.h
|
include_bsp_HEADERS += ../shared/include/arm-a9mpcore-start.h
|
||||||
@@ -127,7 +128,7 @@ libbsp_a_SOURCES += include/cache_.h
|
|||||||
libbsp_a_CPPFLAGS += -I$(srcdir)/include
|
libbsp_a_CPPFLAGS += -I$(srcdir)/include
|
||||||
|
|
||||||
# Start hooks
|
# Start hooks
|
||||||
libbsp_a_SOURCES += startup/bspstarthooks.c
|
libbsp_a_SOURCES += startup/bspstarthooks.c startup/bspstartmmu.c
|
||||||
|
|
||||||
if HAS_SMP
|
if HAS_SMP
|
||||||
libbsp_a_SOURCES += ../shared/arm-a9mpcore-smp.c
|
libbsp_a_SOURCES += ../shared/arm-a9mpcore-smp.c
|
||||||
|
|||||||
Reference in New Issue
Block a user