bsps/xil-ttc: Improve clock driver

Make the clock driver parameters configurable.  Use the maximum counter
frequency to get the best time resolution.  Decouple the CPU counter from the
timecounter.  Make the tick catch up handling more robust.  Add a validation
test for the tick catch up.
This commit is contained in:
Sebastian Huber
2024-04-30 01:39:05 -04:00
committed by Amar Takhar
parent 5a8e99546f
commit 087fc4351a
10 changed files with 346 additions and 147 deletions
-3
View File
@@ -59,7 +59,6 @@
#include <bsp/default-initial-extension.h>
#include <bsp/start.h>
#include <peripheral_maps/xilinx_zynqmp.h>
#include <dev/serial/zynq-uart-zynqmp.h>
@@ -76,8 +75,6 @@ extern "C" {
#define BSP_ARM_A9MPCORE_GT_BASE 0
#define BSP_SELECTED_TTC_ADDR ZYNQMP_TTC0
/**
* @brief Zynq UltraScale+ MPSoC specific set up of the MMU.
*
@@ -51,7 +51,6 @@
extern "C" {
#endif /* __cplusplus */
#define BSP_SELECTED_TTC_IRQ ZYNQMP_IRQ_TTC_0_0
#define BSP_INTERRUPT_VECTOR_COUNT 188
/** @} */
File diff suppressed because it is too large Load Diff
@@ -24,6 +24,12 @@ links:
uid: optclkuart
- role: build-dependency
uid: optconirq
- role: build-dependency
uid: ../../optxilclockttcbaseaddr
- role: build-dependency
uid: ../../optxilclockttcirq
- role: build-dependency
uid: ../../optxilclockttcrefclk
- role: build-dependency
uid: optint0len
- role: build-dependency
@@ -0,0 +1,18 @@
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
actions:
- get-integer: null
- format-and-define: null
build-type: option
copyrights:
- Copyright (C) 2024 embedded brains GmbH & Co. KG
default:
- enabled-by: true
value: 0xff110000
description: |
This option defines the Xilinx Triple-Timer Counter (TTC) base address used by
the Clock Driver.
enabled-by: true
format: '{:#010x}'
links: []
name: XIL_CLOCK_TTC_BASE_ADDR
type: build
+18
View File
@@ -0,0 +1,18 @@
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
actions:
- get-integer: null
- define: null
build-type: option
copyrights:
- Copyright (C) 2024 embedded brains GmbH & Co. KG
default:
- enabled-by: true
value: 68
description: |
This option defines the Xilinx Triple-Timer Counter (TTC) interrupt vector
number used by the Clock Driver.
enabled-by: true
format: '{}'
links: []
name: XIL_CLOCK_TTC_IRQ
type: build
+18
View File
@@ -0,0 +1,18 @@
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
actions:
- get-integer: null
- define: null
build-type: option
copyrights:
- Copyright (C) 2024 embedded brains GmbH & Co. KG
default:
- enabled-by: true
value: 100000000
description: |
This option defines the Xilinx Triple-Timer Counter (TTC) reference clock in
Hz used by the Clock Driver.
enabled-by: true
format: '{}'
links: []
name: XIL_CLOCK_TTC_REFERENCE_CLOCK
type: build
@@ -0,0 +1,14 @@
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
build-type: objects
cflags: []
copyrights:
- Copyright (C) 2024 embedded brains GmbH & Co. KG
cppflags: []
cxxflags: []
enabled-by: bsps/arm/xilinx-zynqmp-rpu
includes: []
install: []
links: []
source:
- testsuites/validation/tc-dev-clock-xil-ttc.c
type: build
@@ -5,12 +5,16 @@ copyrights:
- Copyright (C) 2023 embedded brains GmbH & Co. KG
cppflags: []
cxxflags: []
enabled-by: bsps/sparc/leon3
enabled-by:
- bsps/arm/xilinx-zynqmp-rpu
- bsps/sparc/leon3
features: c cprogram
includes: []
ldflags:
- -Wl,--wrap=_IO_Relax
links:
- role: build-dependency
uid: objclockxilttc
- role: build-dependency
uid: objgrlib
- role: build-dependency
@@ -0,0 +1,136 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup DevClockXilTtcValTickCatchUp
*/
/*
* Copyright (C) 2024 embedded brains GmbH & Co. KG
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* This file is part of the RTEMS quality process and was automatically
* generated. If you find something that needs to be fixed or
* worded better please post a report or patch to an RTEMS mailing list
* or raise a bug report:
*
* https://www.rtems.org/bugs.html
*
* For information on updating and regenerating please refer to the How-To
* section in the Software Requirements Engineering chapter of the
* RTEMS Software Engineering manual. The manual is provided as a part of
* a release. For development sources please refer to the online
* documentation at:
*
* https://docs.rtems.org
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems.h>
#include <sys/time.h>
#include <rtems/test.h>
/**
* @defgroup DevClockXilTtcValTickCatchUp \
* spec:/dev/clock/xil-ttc/val/tick-catch-up
*
* @ingroup TestsuitesBspsValidationBsp0
*
* @brief Tests some Xilinx TTC clock driver functions.
*
* This test case performs the following actions:
*
* - Synchronize with the clock tick. Disable interrupts. Busy wait three
* clock tick intervals. Enable interrupts.
*
* - Check that exactly three clock ticks happened once interrupts are
* enabled again.
*
* @{
*/
/**
* @brief Synchronize with the clock tick. Disable interrupts. Busy wait
* three clock tick intervals. Enable interrupts.
*/
static void DevClockXilTtcValTickCatchUp_Action_0( void )
{
uint32_t ns_per_tick;
uint64_t three_ticks_interval;
rtems_interrupt_level level;
rtems_interval t_0;
rtems_interval t_1;
rtems_interval t_2;
uint64_t m_0;
uint64_t m_1;
ns_per_tick = rtems_configuration_get_nanoseconds_per_tick();
three_ticks_interval = ( 7 * (uint64_t) nstosbt( ns_per_tick ) ) / 2;
t_0 = rtems_clock_get_ticks_since_boot();
/* Synchronize with clock tick */
do {
t_1 = rtems_clock_get_ticks_since_boot();
m_0 = (uint64_t) rtems_clock_get_monotonic_sbintime();
} while ( t_0 == t_1 );
rtems_interrupt_local_disable( level );
do {
m_1 = (uint64_t) rtems_clock_get_monotonic_sbintime();
} while ( m_1 - m_0 <= three_ticks_interval );
rtems_interrupt_local_enable( level );
/*
* Make sure the clock interrupt was serviced after the interrupt enable.
*/
do {
t_2 = rtems_clock_get_ticks_since_boot();
} while ( t_1 == t_2 );
/*
* Check that exactly three clock ticks happened once interrupts are enabled
* again.
*/
T_step_eq_u32( 0, t_2 - t_1, 3 );
}
/**
* @fn void T_case_body_DevClockXilTtcValTickCatchUp( void )
*/
T_TEST_CASE( DevClockXilTtcValTickCatchUp )
{
T_plan( 1 );
DevClockXilTtcValTickCatchUp_Action_0();
}
/** @} */