I/O Expanders: Interrupt detection logic should not ignore the no-change case. Still need to handle level interrupts even with no change.

This commit is contained in:
Gregory Nutt 2016-08-03 13:10:20 -06:00
parent 803b540e8a
commit 1f9799b68d
3 changed files with 10 additions and 31 deletions

View File

@ -641,17 +641,13 @@ static ioe_pinset_t sim_int_update(FAR struct sim_dev_s *priv)
input = priv->inval;
diff = priv->last ^ input;
if (diff == 0)
if (diff != 0)
{
/* Nothing has changed */
return 0;
gpioinfo("toggles=%lx inval=%lx last=%lx diff=%lx\n",
(unsigned long)toggles, (unsigned long)priv->inval,
(unsigned long)priv->last, (unsigned long)diff);
}
gpioinfo("toggles=%lx inval=%lx last=%lx diff=%lx\n",
(unsigned long)toggles, (unsigned long)priv->inval,
(unsigned long)priv->last, (unsigned long)diff);
priv->last = input;
intstat = 0;
@ -684,7 +680,7 @@ static ioe_pinset_t sim_int_update(FAR struct sim_dev_s *priv)
}
else /* if (SIM_LEVEL_SENSITIVE(priv, pin)) */
{
/* Level triggered. Set intstat if in match level type. */
/* Level triggered. Set intstat if imatch in level type. */
if ((pinval && SIM_LEVEL_HIGH(priv, pin)) ||
(!pinval && SIM_LEVEL_LOW(priv, pin)))

View File

@ -797,15 +797,7 @@ static void pcf8574_int_update(void *handle, uint8_t input)
/* Check the changed bits from last read */
diff = priv->input ^ input;
if (diff == 0)
{
/* Nothing has changed */
leave_critical_section(flags);
return;
}
diff = priv->input ^ input;
priv->input = input;
/* PCF8574 doesn't support irq trigger, we have to do this in software. */
@ -829,7 +821,7 @@ static void pcf8574_int_update(void *handle, uint8_t input)
}
else /* if (PCF8574_LEVEL_SENSITIVE(priv, pin)) */
{
/* Level triggered. Set intstat if in match level type. */
/* Level triggered. Set intstat if match in level type. */
if (((input & 1) != 0 && PCF8574_LEVEL_HIGH(priv, pin)) ||
((input & 1) == 0 && PCF8574_LEVEL_LOW(priv, pin)))

View File

@ -1038,17 +1038,8 @@ static void tca64_int_update(FAR struct tca64_dev_s *priv, ioe_pinset_t input,
/* Check the changed bits from last read */
input = (priv->input & ~mask) | (input & mask);
diff = priv->input ^ input;
if (diff == 0)
{
/* Nothing has changed */
leave_critical_section(flags);
return;
}
input = (priv->input & ~mask) | (input & mask);
diff = priv->input ^ input;
priv->input = input;
/* TCA64XX doesn't support irq trigger, we have to do this in software. */
@ -1072,7 +1063,7 @@ static void tca64_int_update(FAR struct tca64_dev_s *priv, ioe_pinset_t input,
}
else /* if (TCA64_LEVEL_SENSITIVE(priv, pin)) */
{
/* Level triggered. Set intstat if in match level type. */
/* Level triggered. Set intstat bit if match in level type. */
if (((input & 1) != 0 && TCA64_LEVEL_HIGH(priv, pin)) ||
((input & 1) == 0 && TCA64_LEVEL_LOW(priv, pin)))