I'm porting Xenomai/I-pipe to the NS921x (an arm9-based) platform, but I'm
having problems getting the interrupts to re-enable after the first
interrupt triggers.
A kernel driver module is being used to test the interrupt latency using an
input GPIO pin which triggers a dedicated external IRQ, to which the ISR
responds by toggling a different GPIO pin. I realize that there are test
applications which do very similar things, and that the RTDM skin is
preferable over the native API. Still, I would like to understand why the
interrupt is not being properly acknowledged and reset.
If the ISR manually performs the ACK and EOI using platform specific calls,
subsequent interrupts are handled properly. My understanding was that
Xenomai should re-enable the interrupt for processing without such
intervention. How do I force Xenomai to clear and re-enable the interrupt
to handle subsequent interrupts?
Thanks,
James
static int __init turnaround_irq_measure_init(void)
{
....
retval = rt_intr_create(&irq_response_desc,
"ns9xxx_measure_irq_rt_response",
TURNAROUND_INPUT_IRQ,
turnaround_irq_measure_response,
NULL, NULL);
if (retval == 0) // 0 is success
{
set_irq_type(TURNAROUND_INPUT_IRQ, IRQ_TYPE_EDGE_FALLING);
retval = rt_intr_enable(&irq_response_desc);
if (retval != 0) // 0 is success
{
console_print("Turnaround test driver rt interrupt enable:
FAILED\n");
}
}
else
{
console_print("Turnaround test driver rt interrupt create:
FAILED\n");
}
return 0;
}
static int turnaround_irq_measure_response(struct xnintr *intr)
{
/* Set GPIO pin low */
gpio_set_value(TURNAROUND_OUTPUT_GPIO, 0);
/* Wait 50 microseconds */
rt_timer_spin(50000);
/* Set GPIO pin high */
gpio_set_value(TURNAROUND_OUTPUT_GPIO, 1);
/* Start listening again */
/* NOTE: These two lines should not be necessary */
ns9xxx_ack_irq(TURNAROUND_INPUT_IRQ);
ns9xxx_eoi_irq(TURNAROUND_INPUT_IRQ);
return RT_INTR_HANDLED;
}
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help