File indexing completed on 2025-05-11 08:23:44
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include <stdlib.h>
0028 #include <bsp.h>
0029 #include <rtems/libio.h>
0030 #include <mcf5272/mcf5272.h>
0031 #include <rtems/clockdrv.h>
0032
0033
0034
0035
0036
0037 volatile uint32_t Clock_driver_ticks;
0038
0039 rtems_isr (*rtems_clock_hook)(rtems_vector_number) = NULL;
0040
0041 static rtems_isr
0042 Clock_isr (rtems_vector_number vector)
0043 {
0044
0045 g_timer_regs->ter1 = MCF5272_TER_REF | MCF5272_TER_CAP;
0046
0047
0048 Clock_driver_ticks++;
0049 rtems_clock_tick();
0050 if (rtems_clock_hook != NULL) {
0051 rtems_clock_hook(vector);
0052 }
0053 }
0054
0055 static void
0056 Clock_exit(void)
0057 {
0058 uint32_t icr;
0059
0060
0061 icr = g_intctrl_regs->icr1;
0062 icr = icr & ~(MCF5272_ICR1_TMR1_MASK | MCF5272_ICR1_TMR1_PI);
0063 icr |= (MCF5272_ICR1_TMR1_IPL(0) | MCF5272_ICR1_TMR1_PI);
0064 g_intctrl_regs->icr1 = icr;
0065
0066
0067 g_timer_regs->tmr1 = MCF5272_TMR_CLK_STOP;
0068
0069
0070 g_timer_regs->ter1 = MCF5272_TER_REF | MCF5272_TER_CAP;
0071 }
0072
0073 static void
0074 Install_clock(rtems_isr_entry clock_isr)
0075 {
0076 uint32_t icr;
0077
0078 Clock_driver_ticks = 0;
0079
0080
0081 set_vector(clock_isr, BSP_INTVEC_TMR1, 1);
0082
0083
0084 g_timer_regs->tmr1 = MCF5272_TMR_RST;
0085 g_timer_regs->tmr1 = MCF5272_TMR_CLK_STOP;
0086 g_timer_regs->tmr1 = MCF5272_TMR_RST;
0087 g_timer_regs->tcn1 = 0;
0088 g_timer_regs->ter1 = MCF5272_TER_REF | MCF5272_TER_CAP;
0089
0090
0091 g_timer_regs->tmr1 = (
0092 ((((BSP_SYSTEM_FREQUENCY / 1000000) - 1) << MCF5272_TMR_PS_SHIFT) |
0093 MCF5272_TMR_CE_DISABLE |
0094 MCF5272_TMR_ORI |
0095 MCF5272_TMR_FRR |
0096 MCF5272_TMR_CLK_MSTR |
0097 MCF5272_TMR_RST));
0098
0099
0100 g_timer_regs->trr1 = rtems_configuration_get_microseconds_per_tick() - 1;
0101
0102
0103 g_timer_regs->tmr1 |= MCF5272_TMR_CLK_MSTR;
0104
0105
0106 icr = g_intctrl_regs->icr1;
0107 icr = icr & ~(MCF5272_ICR1_TMR1_MASK | MCF5272_ICR1_TMR1_PI);
0108 icr |= (MCF5272_ICR1_TMR1_IPL(BSP_INTLVL_TMR1) | MCF5272_ICR1_TMR1_PI);
0109 g_intctrl_regs->icr1 = icr;
0110
0111
0112 atexit(Clock_exit);
0113 }
0114
0115 void _Clock_Initialize( void )
0116 {
0117 Install_clock (Clock_isr);
0118 }