rtems_isr_entry set_vector( /* returns old vector */ rtems_isr_entry handler, /* isr routine */ rtems_vector_number vector, /* vector number */ int type /* RTEMS or RAW intr */ ) { rtems_isr_entry previous_isr; uint32_t real_trap; uint32_t source; if ( type == SET_VECTOR_INT ) rtems_interrupt_catch( handler, vector, &previous_isr ); else _CPU_ISR_install_raw_handler( vector, handler, (void *)&previous_isr ); real_trap = SPARC_REAL_TRAP_NUMBER( vector ); if ( ERC32_Is_MEC_Trap( real_trap ) ) { source = ERC32_TRAP_SOURCE( real_trap ); ERC32_Clear_interrupt( source ); ERC32_Unmask_interrupt( source ); } return previous_isr; }
void _CPU_ISR_install_vector( uint32_t vector, proc_ptr new_handler, proc_ptr *old_handler ) { uint32_t real_vector; proc_ptr ignored; /* * Get the "real" trap number for this vector ignoring the synchronous * versus asynchronous indicator included with our vector numbers. */ real_vector = SPARC_REAL_TRAP_NUMBER( vector ); /* * Return the previous ISR handler. */ *old_handler = _ISR_Vector_table[ real_vector ]; /* * Install the wrapper so this ISR can be invoked properly. */ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, &ignored ); /* * We put the actual user ISR address in '_ISR_vector_table'. This will * be used by the _ISR_Handler so the user gets control. */ _ISR_Vector_table[ real_vector ] = new_handler; }
rtems_isr_entry set_vector( /* returns old vector */ rtems_isr_entry handler, /* isr routine */ rtems_vector_number vector, /* vector number */ int type /* RTEMS or RAW intr */ ) { rtems_isr_entry previous_isr; if ( type ) rtems_interrupt_catch( handler, vector, &previous_isr ); else _CPU_ISR_install_raw_handler( vector, handler, (void *)&previous_isr ); return previous_isr; }
void _CPU_ISR_install_vector( uint32_t vector, proc_ptr new_handler, proc_ptr *old_handler ) { *old_handler = _ISR_Vector_table[ vector ]; /* * If the interrupt vector table is a table of pointer to isr entry * points, then we need to install the appropriate RTEMS interrupt * handler for this vector number. */ _CPU_ISR_install_raw_handler( vector, new_handler, old_handler ); /* * We put the actual user ISR address in '_ISR_vector_table'. This will * be used by the _ISR_Handler so the user gets control. */ _ISR_Vector_table[ vector ] = new_handler; }
/* benchmark_timer_initialize -- * Initialize Timer 1 to operate as a RTEMS benchmark timer: * - determine timer clock frequency * - install timer interrupt handler * - configure the Timer 1 hardware * - start the timer * * PARAMETERS: * none * * RETURNS: * none */ void benchmark_timer_initialize(void) { uint8_t temp8; uint16_t temp16; rtems_interrupt_level level; rtems_isr *ignored; int cpudiv = 1; int tidiv = 1; Timer_interrupts = 0; rtems_interrupt_disable(level); /* Get CPU frequency divider from clock unit */ switch (read16(SH7750_FRQCR) & SH7750_FRQCR_IFC) { case SH7750_FRQCR_IFCDIV1: cpudiv = 1; break; case SH7750_FRQCR_IFCDIV2: cpudiv = 2; break; case SH7750_FRQCR_IFCDIV3: cpudiv = 3; break; case SH7750_FRQCR_IFCDIV4: cpudiv = 4; break; case SH7750_FRQCR_IFCDIV6: cpudiv = 6; break; case SH7750_FRQCR_IFCDIV8: cpudiv = 8; break; default: rtems_fatal_error_occurred( RTEMS_NOT_CONFIGURED); } /* Get peripheral module frequency divider from clock unit */ switch (read16(SH7750_FRQCR) & SH7750_FRQCR_PFC) { case SH7750_FRQCR_PFCDIV2: tidiv = 2 * TIMER_PRESCALER; break; case SH7750_FRQCR_PFCDIV3: tidiv = 3 * TIMER_PRESCALER; break; case SH7750_FRQCR_PFCDIV4: tidiv = 4 * TIMER_PRESCALER; break; case SH7750_FRQCR_PFCDIV6: tidiv = 6 * TIMER_PRESCALER; break; case SH7750_FRQCR_PFCDIV8: tidiv = 8 * TIMER_PRESCALER; break; default: rtems_fatal_error_occurred( RTEMS_NOT_CONFIGURED); } microseconds_divider = bsp_clicks_per_second * cpudiv / (tidiv * 1000000); microseconds_per_int = 0xFFFFFFFF / microseconds_divider; /* * Hardware specific initialization */ /* Stop the Timer 0 */ temp8 = read8(SH7750_TSTR); temp8 &= ~SH7750_TSTR_STR1; write8(temp8, SH7750_TSTR); /* Establish interrupt handler */ _CPU_ISR_install_raw_handler( TIMER_VECTOR, timerisr, &ignored ); /* Reset timer constant and counter */ write32(0xFFFFFFFF, SH7750_TCOR1); write32(0xFFFFFFFF, SH7750_TCNT1); /* Select timer mode */ write16( SH7750_TCR_UNIE | /* Enable Underflow Interrupt */ SH7750_TCR_CKEG_RAISE | /* Count on rising edge */ TCR1_TPSC, /* Timer prescaler ratio */ SH7750_TCR1); /* Set timer interrupt priority */ temp16 = read16(SH7750_IPRA); temp16 = (temp16 & ~SH7750_IPRA_TMU1) | (TIMER_PRIO << SH7750_IPRA_TMU1_S); write16(temp16, SH7750_IPRA); rtems_interrupt_enable(level); /* Start the Timer 1 */ temp8 = read8(SH7750_TSTR); temp8 |= SH7750_TSTR_STR1; write8(temp8, SH7750_TSTR); }