/* Clock * * This routine generates clock ticks using standard POSIX services. * The tick frequency is specified by the bsp. * * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994. * On-Line Applications Research Corporation (OAR). * All rights assigned to U.S. Government, 1994. * * This material may be reproduced by or for the U.S. Government pursuant * to the copyright license under the clause at DFARS 252.227-7013. This * notice must appear in all copies of this file and its derivatives. * * $Id$ */ #include #include #include void Clock_exit(void); volatile rtems_unsigned32 Clock_driver_ticks; rtems_unsigned32 Clock_driver_vector; /* * These are set by clock driver during its init */ rtems_device_major_number rtems_clock_major = ~0; rtems_device_minor_number rtems_clock_minor; void Install_clock(rtems_isr_entry clock_isr) { Clock_driver_ticks = 0; (void)set_vector(clock_isr, Clock_driver_vector, 1); _CPU_Start_clock( BSP_Configuration.microseconds_per_tick ); atexit(Clock_exit); } void ReInstall_clock(rtems_isr_entry new_clock_isr) { rtems_unsigned32 isrlevel = 0; rtems_interrupt_disable(isrlevel); (void)set_vector(new_clock_isr, Clock_driver_vector, 1); rtems_interrupt_enable(isrlevel); } void Clock_isr(int vector) { Clock_driver_ticks++; rtems_clock_tick(); } /* * Called via atexit() * Remove the clock signal */ void Clock_exit(void) { _CPU_Stop_clock(); (void)set_vector(0, Clock_driver_vector, 1); } rtems_device_driver Clock_initialize( rtems_device_major_number major, rtems_device_minor_number minor, void *pargp ) { Clock_driver_vector = _CPU_Get_clock_vector(); Install_clock((rtems_isr_entry) Clock_isr); /* * make major/minor avail to others such as shared memory driver */ rtems_clock_major = major; rtems_clock_minor = minor; return RTEMS_SUCCESSFUL; } rtems_device_driver Clock_control( rtems_device_major_number major, rtems_device_minor_number minor, void *pargp ) { rtems_libio_ioctl_args_t *args = pargp; if (args == 0) goto done; /* * This is hokey, but until we get a defined interface * to do this, it will just be this simple... */ if (args->command == rtems_build_name('I', 'S', 'R', ' ')) { Clock_isr(Clock_driver_vector); } else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) { ReInstall_clock(args->buffer); } done: return RTEMS_SUCCESSFUL; }