File indexing completed on 2025-05-11 08:23:50
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
0029
0030
0031
0032
0033
0034
0035 #include <rtems.h>
0036 #include <bsp/irq.h>
0037 #include <bsp.h>
0038
0039 #include <stdio.h>
0040 #include <stdlib.h>
0041
0042 #include "yamon_api.h"
0043
0044
0045
0046
0047 #define CLOCK_VECTOR TX4938_IRQ_TMR0
0048
0049 #define TX4938_TIMER_INTERVAL_MODE 1
0050
0051 #define TX4938_TIMER_MODE TX4938_TIMER_INTERVAL_MODE
0052
0053 #if (TX4938_TIMER_MODE == TX4938_TIMER_INTERVAL_MODE)
0054 #define TX4938_TIMER_INTERRUPT_FLAG TIIS
0055 #define Clock_driver_support_initialize_hardware() \
0056 Initialize_timer0_in_interval_mode()
0057 #else
0058 #error "Build Error: unsupported timer mode"
0059 #endif
0060
0061 void new_brk_esr(void);
0062
0063 t_yamon_retfunc esr_retfunc = 0;
0064 t_yamon_ref original_brk_esr = 0;
0065 t_yamon_ref original_tmr0_isr = 0;
0066
0067 void new_brk_esr(void)
0068 {
0069 if (original_tmr0_isr)
0070 {
0071 YAMON_FUNC_DEREGISTER_IC_ISR( original_tmr0_isr );
0072 original_tmr0_isr = 0;
0073 }
0074 if (esr_retfunc)
0075 esr_retfunc();
0076 }
0077
0078
0079 #define Clock_driver_support_install_isr( _new ) \
0080 do { \
0081 rtems_interrupt_handler_install( \
0082 CLOCK_VECTOR, \
0083 "clock", \
0084 0, \
0085 _new, \
0086 NULL \
0087 ); \
0088 YAMON_FUNC_REGISTER_IC_ISR(17,(t_yamon_isr)_new,0,&original_tmr0_isr); \
0089 } while(0)
0090
0091
0092 #define Clock_driver_support_at_tick(arg) \
0093 do { \
0094 uint32_t interrupt_flag; \
0095 do { \
0096 int loop_count; \
0097 TX4938_REG_WRITE( TX4938_REG_BASE, TX4938_TIMER0_BASE + TX4938_TIMER_TISR, 0x0 ); \
0098 loop_count = 0; \
0099 do { \
0100 \
0101 interrupt_flag = TX4938_REG_READ( TX4938_REG_BASE, TX4938_TIMER0_BASE + TX4938_TIMER_TISR ) & TX4938_TIMER_INTERRUPT_FLAG; \
0102 } while (interrupt_flag && (++loop_count < 10)); \
0103 } while(interrupt_flag); \
0104 } while(0)
0105
0106
0107
0108 #define Initialize_timer0_in_interval_mode() \
0109 do { \
0110 uint32_t temp; \
0111 TX4938_REG_WRITE( TX4938_REG_BASE, TX4938_TIMER0_BASE + TX4938_TIMER_TCR, 0x0 ); \
0112 TX4938_REG_WRITE( TX4938_REG_BASE, TX4938_TIMER0_BASE + TX4938_TIMER_CCDR, 0x0 ); \
0113 TX4938_REG_WRITE( TX4938_REG_BASE, TX4938_TIMER0_BASE + TX4938_TIMER_ITMR, TIMER_CLEAR_ENABLE_MASK ); \
0114 TX4938_REG_WRITE( TX4938_REG_BASE, TX4938_TIMER0_BASE + TX4938_TIMER_CPRA, 0x3d090 ); \
0115 TX4938_REG_WRITE( TX4938_REG_BASE, TX4938_TIMER0_BASE + TX4938_TIMER_TCR, 0xC0 ); \
0116 temp = TX4938_REG_READ( TX4938_REG_BASE, TX4938_TIMER0_BASE + TX4938_TIMER_ITMR ); \
0117 temp |= TIMER_INT_ENABLE_MASK; \
0118 TX4938_REG_WRITE( TX4938_REG_BASE, TX4938_TIMER0_BASE + TX4938_TIMER_ITMR, temp ); \
0119 } while(0)
0120
0121
0122 #define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
0123
0124 #include "../../../shared/dev/clock/clockimpl.h"