[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