int timer_instdis(int t, int inst, unsigned period) { rtems_irq_connect_data xx; xx.name = BSP_MISC_IRQ_LOWEST_OFFSET + t; xx.hdl = timer_isr; xx.handle = (rtems_irq_hdl_param)t; xx.on = 0; xx.off = 0; xx.isOn = 0; if ( !inst ) { openpic_maptimer(t, 0); openpic_inittimer(t, 0, 0); } if ( ! ( inst ? BSP_install_rtems_irq_handler(&xx) : BSP_remove_rtems_irq_handler(&xx) ) ) { openpic_maptimer(t, 0); openpic_inittimer(t, 0, 0); fprintf(stderr,"unable to %s timer ISR #%i\n", inst ? "install" : "remove", t); return -1; } if ( inst ) { openpic_maptimer( t, 1 ); openpic_inittimer( t, 8 + t, OPENPIC_VEC_SOURCE - BSP_PCI_IRQ_LOWEST_OFFSET + xx.name ); openpic_settimer( t, period, 1 ); } return 0; }
int pictimerCleanup(unsigned timer_no) { if ( timer_no >= NumberOf(timerConnected) || !timerConnected[timer_no] ) return 0; openpic_inittimer( timer_no, 0, 0 ); openpic_maptimer( timer_no, 0 ); if ( bspExtRemoveSharedISR(TIMER_IVEC + timer_no, timerConnected[timer_no], (void*)timer_no) ) { fprintf(stderr,"Unable to remove shared ISR for OpenPIC Timer #%i\n",timer_no); return -1; } timerConnected[timer_no] = 0; return 0; }
int pictimerInstall(unsigned timer_no, int pri, int freq, void (*isr)(void*)) { unsigned tmp; if ( timer_no >= NumberOf(timerConnected) ) { fprintf(stderr,"Invalid timer instance %i; (0..3 allowed)\n", timer_no); return -1; } if ( timerConnected[timer_no] ) { fprintf(stderr,"OpenPIC Timer #%i already connected\n", timer_no); return -1; } if ( pri > 15 || pri < 1 ) { fprintf(stderr,"Invalid timer IRQ priority %i (1..15 allowed)\n",pri); return -1; } printf("Using OpenPIC Timer #%i at %p\n", timer_no, &OpenPIC->Global.Timer[timer_no]); timer_period_ns = 1000000000 / in_le32( &OpenPIC->Global.Timer_Frequency ); /* freq < 0 means they want to specify a period in ticks directly */ if ( freq < 0 ) tmp = -freq; else tmp = in_le32( &OpenPIC->Global.Timer_Frequency ) / freq; out_le32( &OpenPIC->Global.Timer[timer_no].Base_Count, OPENPIC_MASK | tmp ); out_le32( &OpenPIC->Global.Timer[timer_no].Base_Count, tmp ); /* map to 1st CPU */ openpic_maptimer(timer_no, 1); if ( 0 == bspExtInstallSharedISR( TIMER_IVEC + timer_no, isr, (void*)timer_no, BSPEXT_ISR_NONSHARED ) ) { openpic_inittimer( timer_no, pri, TIMER_IVEC + timer_no ); timerConnected[timer_no] = isr; return 0; } fprintf(stderr,"Unable to install shared ISR for OpenPIC Timer #%i\n",timer_no); return -1; }