clock.c
来自「RTEMS (Real-Time Executive for Multiproc」· C语言 代码 · 共 103 行
C
103 行
/* * This routine initializes the MC68360 Periodic Interval Timer * * The PIT has rather poor resolution, but it is easy to set up * and requires no housekeeping once it is going. * * W. Eric Norum * Saskatchewan Accelerator Laboratory * University of Saskatchewan * Saskatoon, Saskatchewan, CANADA * eric@skatter.usask.ca * * $Id: clock.c,v 1.1 2001/01/12 15:00:54 joel Exp $ */#include <rtems.h>#include <bsp.h>#include "m68360.h"#define CLOCK_VECTOR 120#define CLOCK_IRQ_LEVEL 4char M360DefaultWatchdogFeeder = 1;/* * RTEMS and hardware have different notions of clock rate. */static unsigned long rtems_nsec_per_tick;static unsigned long pit_nsec_per_tick;static unsigned long nsec;/* * Periodic interval timer interrupt handler * See if it's really time for a `tick' * Perform a dummy read of DPRAM (work around bug in Rev. B of the 68360). * Feed the watchdog * Application code can override this by * setting M360DefaultWatchdogFeeder to zero. */#define Clock_driver_support_at_tick() \ do { \ nsec += pit_nsec_per_tick; \ if (nsec >= rtems_nsec_per_tick) \ return; \ nsec -= rtems_nsec_per_tick; \ m360.dpram0[0]; \ if (M360DefaultWatchdogFeeder) { \ m360.swsr = 0x55; \ m360.swsr = 0xAA; \ } \ } while (0) \/* * Attach clock interrupt handler */#define Clock_driver_support_install_isr( _new, _old ) \ do { \ _old = (rtems_isr_entry)set_vector(_new, CLOCK_VECTOR, 1); \ } while(0)/* * Turn off the clock */#define Clock_driver_support_shutdown_hardware() \ do { \ m360.pitr &= ~0xFF; \ } while(0)/* * Set up the clock hardware * The rate at which the periodic interval timer * can generate interrupts is almost certainly not * the same as desired by the BSP configuration. * Handle the difference by choosing the largest PIT * interval which is less than or equal to the RTEMS * interval and skipping some hardware interrupts. * To reduce the jitter in the calls to RTEMS the * hardware interrupt interval is never greater than * the maximum non-prescaled value from the PIT. * * For a 25 MHz external clock the basic clock rate is * 40 nsec * 128 * 4 = 20.48 usec/tick */#define Clock_driver_support_initialize_hardware() \ do { \ unsigned int divisor; \ extern int m360_clock_rate; \ unsigned long nsec_per_chip_tick = 1000000000 / m360_clock_rate; \ unsigned long nsec_per_pit_tick = 512 * nsec_per_chip_tick; \ rtems_nsec_per_tick = BSP_Configuration.microseconds_per_tick * 1000; \ divisor = rtems_nsec_per_tick / nsec_per_pit_tick; \ if (divisor > 255) \ divisor = 255; \ else if (divisor == 0) \ divisor = 1; \ pit_nsec_per_tick = nsec_per_pit_tick * divisor; \ m360.pitr &= ~0x1FF; \ m360.picr = (CLOCK_IRQ_LEVEL << 8) | CLOCK_VECTOR; \ m360.pitr |= divisor; \ } while (0)#include "../../../shared/clockdrv_shell.c"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?