[En-Nut-Discussion] Problem with GpioIrqEnable
zonedar
sholder at summitsemi.com
Thu Mar 1 20:30:43 CET 2012
Hi Klaus,
Thanks for the reply. The call to NutRegisterIrqHandler is inside Nut's
GpioRegisterIrqHandler function below:
int GpioRegisterIrqHandler(GPIO_SIGNAL * sig, int bit, void (*handler) (void
*), void *arg)
{
int rc = 0;
if (sig->ios_vector == 0) {
/* This is the first call. Allocate the vector table. */
sig->ios_vector = malloc(sizeof(GPIO_VECTOR) * 32);
if (sig->ios_vector) {
memset(sig->ios_vector, 0, sizeof(GPIO_VECTOR) * 32);
/* Register our internal PIO interrupt service. */
rc = NutRegisterIrqHandler(sig->ios_sig, sig->ios_handler,
sig->ios_vector);
if (rc == 0) {
rc = NutIrqEnable(sig->ios_sig);
}
}
else {
rc = -1;
}
}
sig->ios_vector[bit].iov_handler = handler;
sig->ios_vector[bit].iov_arg = arg;
return rc;
}
I copied that function in to my source file to be sure that the registration
is being done and it is.
The code for is GpioIrqEnable as follows:
int GpioIrqEnable(GPIO_SIGNAL * sig, int bit)
{
return (sig->ios_ctl) (NUT_IRQCTL_ENABLE, NULL, bit);
}
Where sig->ios_ctl is as follows:
static int PioCtlA(int cmd, void *param, int bit)
{
int rc = 0;
unsigned int *ival = (unsigned int *) param;
uint32_t enabled = inr(PIOA_IMR) & _BV(bit);
printf("\n\n\n\nhere PioCtlA\n");
/* Disable interrupt. */
if (enabled) {
outr(PIOA_IDR, _BV(bit));
}
printf("\n\n\n\nhere2 PioCtlA\n");
switch (cmd) {
case NUT_IRQCTL_STATUS:
if (enabled) {
*ival |= 1;
} else {
*ival &= ~1;
}
printf("\n\n\n\nhere3 PioCtlA\n");
break;
case NUT_IRQCTL_ENABLE:
enabled = 1;
printf("\n\n\n\nhere 4 PioCtlA\n");
break;
case NUT_IRQCTL_DISABLE:
enabled = 0;
printf("\n\n\n\nhere5 PioCtlA\n");
break;
default:
rc = -1;
break;
}
/* Enable interrupt. */
if (enabled) {
printf("\n\n\n\nhere6 PioCtlA\n");
outr(PIOA_IER, _BV(bit)); //NOT returning from here
printf("\n\n\n\nhere7 PioCtlA\n");
}
printf("\n\n\n\nhere8 PioCtlA\n");
return rc;
}
As I mentioned it's not coming out of outr(PIOA_IER, _BV(bit)).
Thanks Again!
-Steve
Klaus Kloos wrote:
>
>
>
> Hello Steve
>
> The code of the function GpioIrqEnable is missing. So here is a short
> guess...
> Do you have set an IRQ-Handler for the used PIO before enabling the IRQ?
> something like
> NutRegisterIrqHandler(&sig_PIOB, MyIrqHandler, NULL);
> or (without NutOS)
> outr(AIC_SVR(PIOB_ID), (unsigned int) MyIrqHandler);
>
> Greetings Klaus
>
>
>
--
View this message in context: http://old.nabble.com/Problem-with-GpioIrqEnable-tp33422809p33423801.html
Sent from the MicroControllers - Ethernut mailing list archive at Nabble.com.
More information about the En-Nut-Discussion
mailing list