コード例 #1
0
ファイル: nested_irq_test.c プロジェクト: rtemss/rtems
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;
}
コード例 #2
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;
}
コード例 #3
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;
}