File indexing completed on 2025-05-11 08:23:59
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
0028 #include <rtems/timecounter.h>
0029
0030 #include <libcpu/powerpc-utility.h>
0031
0032 #include <bsp.h>
0033 #include <bsp/irq.h>
0034
0035
0036 static rtems_isr Clock_isr(void *arg);
0037
0038 static struct timecounter t32mppc_clock_tc;
0039
0040 #define CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR
0041
0042 void t32mppc_decrementer_dispatch(void)
0043 {
0044 PPC_SET_SPECIAL_PURPOSE_REGISTER(BOOKE_TSR, BOOKE_TSR_DIS);
0045 Clock_isr(NULL);
0046 }
0047
0048 static uint32_t t32mppc_clock_get_timecount(struct timecounter *tc)
0049 {
0050 return ppc_time_base();
0051 }
0052
0053 static void t32mppc_clock_initialize(void)
0054 {
0055 uint64_t frequency = bsp_time_base_frequency / 10;
0056 uint32_t us_per_tick = rtems_configuration_get_microseconds_per_tick();
0057 uint32_t interval = (uint32_t) ((frequency * us_per_tick) / 1000000);
0058
0059 PPC_SET_SPECIAL_PURPOSE_REGISTER(BOOKE_DECAR, interval - 1);
0060 PPC_SET_SPECIAL_PURPOSE_REGISTER_BITS(
0061 BOOKE_TCR,
0062 BOOKE_TCR_DIE | BOOKE_TCR_ARE
0063 );
0064 ppc_set_decrementer_register(interval - 1);
0065
0066 t32mppc_clock_tc.tc_get_timecount = t32mppc_clock_get_timecount;
0067 t32mppc_clock_tc.tc_counter_mask = 0xffffffff;
0068 t32mppc_clock_tc.tc_frequency = bsp_time_base_frequency;
0069 t32mppc_clock_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
0070 rtems_timecounter_install(&t32mppc_clock_tc);
0071 }
0072
0073 #define Clock_driver_support_initialize_hardware() \
0074 t32mppc_clock_initialize()
0075
0076
0077 #include "../../../shared/dev/clock/clockimpl.h"