[PATCH 1/2] dev/clock: add bcm2835-system-timer driver
Kinsey Moore
kinsey.moore at oarcorp.com
Tue Apr 9 13:57:52 UTC 2024
Hi Ning,
This patch set creates a duplication of the rpi3 system clock driver.
Instead, I'd suggest a different organization of the patch set:
Patch 1: Move the existing implementation to shared space and adjust BSPs
that use it as necessary.
Patch 2: Add support for the now-shared clock driver to the rpi4 BSP.
Kinsey
On Sun, Apr 7, 2024 at 9:35 AM Ning Yang <yangn0 at qq.com> wrote:
> This patch ports the bcm2835 system timer driver in the arm/raspberrypi
> directory to the shared directory.
>
> Made some changes in the include section to adapt to rpi4 BSP.
> ---
> bsps/shared/dev/clock/bcm2835-system-timer.c | 114 +++++++++++++++++++
> 1 file changed, 114 insertions(+)
> create mode 100644 bsps/shared/dev/clock/bcm2835-system-timer.c
>
> diff --git a/bsps/shared/dev/clock/bcm2835-system-timer.c
> b/bsps/shared/dev/clock/bcm2835-system-timer.c
> new file mode 100644
> index 0000000000..f59c9e5424
> --- /dev/null
> +++ b/bsps/shared/dev/clock/bcm2835-system-timer.c
> @@ -0,0 +1,114 @@
> +/**
> + * @file
> + *
> + * @ingroup RTEMSDriverClockImpl
> + *
> + * @brief This source file contains the implementation of the BCM2835
> Clock
> + * Driver.
> + */
> +
> +/*
> + * Copyright (c) 2013 Alan Cudmore
> + * Copyright (c) 2016 Pavel Pisa
> + *
> + * The license and distribution terms for this file may be
> + * found in the file LICENSE in this distribution or at
> + *
> + * http://www.rtems.org/license/LICENSE
> + *
> +*/
> +
> +#include <rtems.h>
> +#include <bsp.h>
> +#include <bsp/irq.h>
> +#include <bsp/irq-generic.h>
> +
> +#if RTEMS_BSP == raspberrypi4b
> +#include <bsp/bcm2711.h>
> +#else
> +#include <bsp/raspberrypi.h>
> +#endif /* RTEMS_BSP */
> +
> +#include <rtems/timecounter.h>
> +
> +#define BCM2835_REG(addr) *(volatile uint32_t*)(addr)
> +
> +/* This is defined in ../../../shared/dev/clock/clockimpl.h */
> +void Clock_isr(rtems_irq_hdl_param arg);
> +
> +static struct timecounter raspberrypi_tc;
> +
> +static uint32_t raspberrypi_clock_get_timecount(struct timecounter *tc)
> +{
> + return BCM2835_REG(BCM2835_GPU_TIMER_CLO);
> +}
> +
> +static void raspberrypi_clock_at_tick(void)
> +{
> + uint32_t act_val;
> + uint32_t next_cmp = BCM2835_REG(BCM2835_GPU_TIMER_C3);
> + next_cmp += rtems_configuration_get_microseconds_per_tick();
> + BCM2835_REG(BCM2835_GPU_TIMER_C3) = next_cmp;
> + act_val = BCM2835_REG(BCM2835_GPU_TIMER_CLO);
> +
> + /*
> + * Clear interrupt only if there is time left to the next tick.
> + * If time of the next tick has already passed then interrupt
> + * request stays active and fires immediately after current tick
> + * processing is finished.
> + */
> + if ((int32_t)(next_cmp - act_val) > 0)
> + BCM2835_REG(BCM2835_GPU_TIMER_CS) = BCM2835_GPU_TIMER_CS_M3;
> +}
> +
> +static void raspberrypi_clock_handler_install_isr(
> + rtems_isr_entry clock_isr
> +)
> +{
> + rtems_status_code sc = RTEMS_SUCCESSFUL;
> +
> + if (clock_isr != NULL) {
> + sc = rtems_interrupt_handler_install(
> + BCM2835_IRQ_ID_GPU_TIMER_M3,
> + "Clock",
> + RTEMS_INTERRUPT_UNIQUE,
> + (rtems_interrupt_handler) clock_isr,
> + NULL
> + );
> + } else {
> + /* Remove interrupt handler */
> + sc = rtems_interrupt_handler_remove(
> + BCM2835_IRQ_ID_GPU_TIMER_M3,
> + (rtems_interrupt_handler) Clock_isr,
> + NULL
> + );
> + }
> + if ( sc != RTEMS_SUCCESSFUL ) {
> + rtems_fatal_error_occurred(0xdeadbeef);
> + }
> +}
> +
> +static void raspberrypi_clock_initialize_hardware(void)
> +{
> + uint32_t next_cmp = BCM2835_REG(BCM2835_GPU_TIMER_CLO);
> + next_cmp += rtems_configuration_get_microseconds_per_tick();
> + BCM2835_REG(BCM2835_GPU_TIMER_C3) = next_cmp;
> + BCM2835_REG(BCM2835_GPU_TIMER_CS) = BCM2835_GPU_TIMER_CS_M3;
> +
> + raspberrypi_tc.tc_get_timecount = raspberrypi_clock_get_timecount;
> + raspberrypi_tc.tc_counter_mask = 0xffffffff;
> + raspberrypi_tc.tc_frequency = 1000000; /* 1 MHz */
> + raspberrypi_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
> + rtems_timecounter_install(&raspberrypi_tc);
> +}
> +
> +#define Clock_driver_support_at_tick() raspberrypi_clock_at_tick()
> +
> +#define Clock_driver_support_initialize_hardware()
> raspberrypi_clock_initialize_hardware()
> +
> +#define Clock_driver_support_install_isr(clock_isr) \
> + raspberrypi_clock_handler_install_isr(clock_isr)
> +
> +#define CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR 1
> +
> +#include "../../../shared/dev/clock/clockimpl.h"
> --
> 2.34.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20240409/e84dfce3/attachment.htm>
More information about the devel
mailing list