[PATCH 10/15] HiFive1: add clock driver support
Gedare Bloom
gedare at rtems.org
Mon Aug 21 17:39:52 UTC 2017
On Mon, Aug 21, 2017 at 12:25 PM, Denis Obrezkov
<denisobrezkov at gmail.com> wrote:
> 2017-08-17 17:13 GMT+02:00 Gedare Bloom <gedare at rtems.org>:
>>
>> On Wed, Aug 16, 2017 at 11:13 AM, Denis Obrezkov
>> <denisobrezkov at gmail.com> wrote:
>> > ---
>> > c/src/lib/libbsp/riscv32/hifive1/clock/clock.c | 67
>> > ++++++++++++++++++++++++++
>> > 1 file changed, 67 insertions(+)
>> > create mode 100644 c/src/lib/libbsp/riscv32/hifive1/clock/clock.c
>> >
>> > diff --git a/c/src/lib/libbsp/riscv32/hifive1/clock/clock.c
>> > b/c/src/lib/libbsp/riscv32/hifive1/clock/clock.c
>> > new file mode 100644
>> > index 0000000..74132ed
>> > --- /dev/null
>> > +++ b/c/src/lib/libbsp/riscv32/hifive1/clock/clock.c
>> > @@ -0,0 +1,67 @@
>> > +/*
>> > + * Copyright (c) 2017 Denis Obrezkov <denisobrezkov at gmail.com>
>> > + *
>> > + * 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 <bsp/irq.h>
>> > +#include <bsp/fatal.h>
>> > +#include <bsp/fe310.h>
>> > +
>> > +
>> > +static void FE310_clock_driver_support_install_isr(
>> > + rtems_isr_entry Clock_isr
>> > +)
>> > +{
>> > + rtems_status_code sc = RTEMS_SUCCESSFUL;
>> > +
>> > + sc = rtems_interrupt_handler_install(
>> > + 1,
>> > + "Clock",
>> > + RTEMS_INTERRUPT_UNIQUE,
>> > + (rtems_interrupt_handler) Clock_isr,
>> > + NULL
>> > + );
>> > + if ( sc != RTEMS_SUCCESSFUL ) {
>> > + rtems_fatal_error_occurred(0xdeadbeef);
>> > + }
>> > +}
>> > +
>> > +static void FE310_clock_driver_support_at_tick ( void )
>> > +{
>> Does the timer automatically re-load?
>
> No, we reload it in interrupt_dispatch routine.
> I think now that it is not right. Should we place it here?
Yes
>>
>> > +}
>> > +
>> > +static void FE310_clock_init ( void )
>> > +{
>> > + volatile uint64_t * mtime = (volatile uint64_t *)0x0200bff8;
>> > + volatile uint64_t * mtimecmp = (volatile uint64_t *)0x02004000;
>> > + (*mtimecmp) = (*mtime) + FE310_CLOCK_PERIOD + 0x3000;
>> > + asm volatile ("csrci mstatus, 0x8");
>> > + asm volatile ("li t0, 0x80\n\t"
>> > + "csrs mie, t0");
>> > + asm volatile ("csrsi mstatus, 0x8");
>> It would be good to have inline functions for reading/writing all of
>> these special purpose registers.
>>
>> > +}
>> > +
>> > +static void FE310_clock_driver_support_shutdown_hardware( void )
>> > +{
>> > +}
>> > +
>> > +#define Clock_driver_support_initialize_hardware() \
>> > + FE310_clock_init()
>> > +
>> > +#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
>> > +
>> > +#define Clock_driver_support_install_isr(isr,old) \
>> > + FE310_clock_driver_support_install_isr ( isr )
>> > +
>> > +#define Clock_driver_support_at_tick() \
>> > + FE310_clock_driver_support_at_tick()
>> > +
>> > +#define Clock_driver_support_shutdown_hardware() \
>> > + FE310_clock_driver_support_shutdown_hardware()
>> > +
>> > +#include "../../../shared/clockdrv_shell.h"
>> > +
>> > --
>> > 2.1.4
>> >
>> > _______________________________________________
>> > devel mailing list
>> > devel at rtems.org
>> > http://lists.rtems.org/mailman/listinfo/devel
>
>
>
>
> --
> Regards, Denis Obrezkov
More information about the devel
mailing list