forked from Imagelibrary/rtems
128 lines
2.7 KiB
C
128 lines
2.7 KiB
C
/*
|
|
* This file provides a template for the clock device driver initialization.
|
|
*
|
|
* If possible, please use the dev/clock/clockimpl.h method for instantiating
|
|
* a clock driver.
|
|
*/
|
|
|
|
/*
|
|
* COPYRIGHT (c) 1989-2014.
|
|
* On-Line Applications Research Corporation (OAR).
|
|
*
|
|
* 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 <stdlib.h>
|
|
|
|
#include <rtems.h>
|
|
#include <bsp.h>
|
|
|
|
void Clock_exit( void );
|
|
rtems_isr Clock_isr( rtems_vector_number vector );
|
|
|
|
/*
|
|
* The interrupt vector number associated with the clock tick device
|
|
* driver.
|
|
*/
|
|
#define CLOCK_VECTOR 4
|
|
|
|
/*
|
|
* Clock_driver_ticks is a monotonically increasing counter of the
|
|
* number of clock ticks since the driver was initialized.
|
|
*/
|
|
volatile uint32_t Clock_driver_ticks;
|
|
|
|
/*
|
|
* Clock_isrs is the number of clock ISRs until the next invocation of
|
|
* the RTEMS clock tick routine. The clock tick device driver
|
|
* gets an interrupt once a millisecond and counts down until the
|
|
* length of time between the user configured microseconds per tick
|
|
* has passed.
|
|
*/
|
|
uint32_t Clock_isrs; /* ISRs until next tick */
|
|
|
|
/*
|
|
* The previous ISR on this clock tick interrupt vector.
|
|
*/
|
|
rtems_isr_entry Old_ticker;
|
|
|
|
void Clock_exit( void );
|
|
|
|
/*
|
|
* Isr Handler
|
|
*/
|
|
static rtems_isr Clock_isr(
|
|
rtems_vector_number vector
|
|
)
|
|
{
|
|
/*
|
|
* bump the number of clock driver ticks since initialization
|
|
*
|
|
* determine if it is time to announce the passing of tick as configured
|
|
* to RTEMS through the rtems_clock_tick directive
|
|
*
|
|
* perform any timer dependent tasks
|
|
*/
|
|
}
|
|
|
|
/*
|
|
* Install_clock
|
|
*
|
|
* Install a clock tick handler and reprograms the chip. This
|
|
* is used to initially establish the clock tick.
|
|
*/
|
|
void Install_clock(
|
|
rtems_isr_entry clock_isr
|
|
)
|
|
{
|
|
/*
|
|
* Initialize the clock tick device driver variables
|
|
*/
|
|
|
|
Clock_driver_ticks = 0;
|
|
Clock_isrs = rtems_configuration_get_microseconds_per_tick() / 1000;
|
|
|
|
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
|
|
/*
|
|
* Hardware specific initialize goes here
|
|
*/
|
|
|
|
/* XXX */
|
|
|
|
/*
|
|
* Schedule the clock cleanup routine to execute if the application exits.
|
|
*/
|
|
|
|
atexit( Clock_exit );
|
|
}
|
|
|
|
/*
|
|
* Clean up before the application exits
|
|
*/
|
|
|
|
void Clock_exit( void )
|
|
{
|
|
/* XXX: turn off the timer interrupts */
|
|
|
|
/* XXX: If necessary, restore the old vector */
|
|
}
|
|
|
|
/*
|
|
* Clock_initialize
|
|
*
|
|
* Device driver entry point for clock tick driver initialization.
|
|
*/
|
|
rtems_device_driver Clock_initialize(
|
|
rtems_device_major_number major,
|
|
rtems_device_minor_number minor,
|
|
void *pargp
|
|
)
|
|
{
|
|
Install_clock( Clock_isr );
|
|
|
|
return RTEMS_SUCCESSFUL;
|
|
}
|
|
|