aboutsummaryrefslogtreecommitdiff
path: root/nuttx
diff options
context:
space:
mode:
authorpatacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679>2012-09-14 21:48:07 +0000
committerpatacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679>2012-09-14 21:48:07 +0000
commitcfa24e37d6f153dbb5c7e2e0de6484719ea4a9b0 (patch)
treea959068a8c5c237a2ddc41be693aed929924e57b /nuttx
parent7c82cf692476202eb80d4caa4122c4cd390d2b2d (diff)
downloadpx4-firmware-cfa24e37d6f153dbb5c7e2e0de6484719ea4a9b0.tar.gz
px4-firmware-cfa24e37d6f153dbb5c7e2e0de6484719ea4a9b0.tar.bz2
px4-firmware-cfa24e37d6f153dbb5c7e2e0de6484719ea4a9b0.zip
Some ENC28J60-related fixes
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@5154 7fd9a85b-ad96-42d3-883c-3090e2eb8679
Diffstat (limited to 'nuttx')
-rw-r--r--nuttx/configs/fire-stm32v2/nsh/defconfig2
-rw-r--r--nuttx/configs/fire-stm32v2/src/up_autoleds.c16
-rw-r--r--nuttx/configs/fire-stm32v2/src/up_enc28j60.c4
-rw-r--r--nuttx/drivers/net/enc28j60.c24
-rw-r--r--nuttx/include/nuttx/net/enc28j60.h16
5 files changed, 49 insertions, 13 deletions
diff --git a/nuttx/configs/fire-stm32v2/nsh/defconfig b/nuttx/configs/fire-stm32v2/nsh/defconfig
index d7cd910a2..292fe6ccb 100644
--- a/nuttx/configs/fire-stm32v2/nsh/defconfig
+++ b/nuttx/configs/fire-stm32v2/nsh/defconfig
@@ -260,7 +260,7 @@ CONFIG_SDCLONE_DISABLE=y
CONFIG_SCHED_WORKQUEUE=y
CONFIG_SCHED_WORKPRIORITY=192
CONFIG_SCHED_WORKPERIOD=50000
-CONFIG_SCHED_WORKSTACKSIZE=1024
+CONFIG_SCHED_WORKSTACKSIZE=2048
CONFIG_SIG_SIGWORK=4
# CONFIG_SCHED_LPWORK is not set
CONFIG_SCHED_WAITPID=y
diff --git a/nuttx/configs/fire-stm32v2/src/up_autoleds.c b/nuttx/configs/fire-stm32v2/src/up_autoleds.c
index 4e70b01dd..5ecef46c0 100644
--- a/nuttx/configs/fire-stm32v2/src/up_autoleds.c
+++ b/nuttx/configs/fire-stm32v2/src/up_autoleds.c
@@ -115,23 +115,23 @@
#define LED_STARTED_ON_SETBITS (0)
#define LED_STARTED_ON_CLRBITS ((FIRE_LED1|FIRE_LED2|FIRE_LED3) << ON_CLRBITS_SHIFT)
-#define LED_STARTED_OFF_SETBITS LED_STARTED_ON_SETBITS
-#define LED_STARTED_OFF_CLRBITS LED_STARTED_ON_CLRBITS
+#define LED_STARTED_OFF_SETBITS (0)
+#define LED_STARTED_OFF_CLRBITS ((FIRE_LED1|FIRE_LED2|FIRE_LED3) << OFF_CLRBITS_SHIFT)
#define LED_HEAPALLOCATE_ON_SETBITS ((FIRE_LED1) << ON_SETBITS_SHIFT)
#define LED_HEAPALLOCATE_ON_CLRBITS ((FIRE_LED2|FIRE_LED3) << ON_CLRBITS_SHIFT)
-#define LED_HEAPALLOCATE_OFF_SETBITS LED_STARTED_ON_SETBITS
-#define LED_HEAPALLOCATE_OFF_CLRBITS LED_STARTED_ON_CLRBITS
+#define LED_HEAPALLOCATE_OFF_SETBITS (0)
+#define LED_HEAPALLOCATE_OFF_CLRBITS ((FIRE_LED1|FIRE_LED2|FIRE_LED3) << OFF_CLRBITS_SHIFT)
#define LED_IRQSENABLED_ON_SETBITS ((FIRE_LED2) << ON_SETBITS_SHIFT)
#define LED_IRQSENABLED_ON_CLRBITS ((FIRE_LED1|FIRE_LED3) << ON_CLRBITS_SHIFT)
-#define LED_IRQSENABLED_OFF_SETBITS LED_HEAPALLOCATE_ON_SETBITS
-#define LED_IRQSENABLED_OFF_CLRBITS LED_HEAPALLOCATE_ON_CLRBITS
+#define LED_IRQSENABLED_OFF_SETBITS ((FIRE_LED1) << OFF_SETBITS_SHIFT)
+#define LED_IRQSENABLED_OFF_CLRBITS ((FIRE_LED1|FIRE_LED2|FIRE_LED3) << OFF_CLRBITS_SHIFT)
#define LED_STACKCREATED_ON_SETBITS (0)
#define LED_STACKCREATED_ON_CLRBITS ((FIRE_LED1|FIRE_LED2|FIRE_LED3) << ON_CLRBITS_SHIFT)
-#define LED_STACKCREATED_OFF_SETBITS LED_IRQSENABLED_ON_SETBITS
-#define LED_STACKCREATED_OFF_CLRBITS LED_IRQSENABLED_ON_CLRBITS
+#define LED_STACKCREATED_OFF_SETBITS ((FIRE_LED2) << OFF_SETBITS_SHIFT)
+#define LED_STACKCREATED_OFF_CLRBITS ((FIRE_LED1|FIRE_LED3) << OFF_CLRBITS_SHIFT)
#define LED_FLASH_ON_SETBITS ((FIRE_LED3) << ON_SETBITS_SHIFT)
#define LED_FLASH_ON_CLRBITS ((0) << ON_CLRBITS_SHIFT)
diff --git a/nuttx/configs/fire-stm32v2/src/up_enc28j60.c b/nuttx/configs/fire-stm32v2/src/up_enc28j60.c
index 5247f5886..d930d0112 100644
--- a/nuttx/configs/fire-stm32v2/src/up_enc28j60.c
+++ b/nuttx/configs/fire-stm32v2/src/up_enc28j60.c
@@ -157,12 +157,12 @@ static void up_enable(FAR const struct enc_lower_s *lower)
FAR struct stm32_lower_s *priv = (FAR struct stm32_lower_s *)lower;
DEBUGASSERT(priv->handler);
- (void)stm32_gpiosetevent(GPIO_ENC28J60_INTR, true, true, true, priv->handler);
+ (void)stm32_gpiosetevent(GPIO_ENC28J60_INTR, false, true, true, priv->handler);
}
static void up_disable(FAR const struct enc_lower_s *lower)
{
- (void)stm32_gpiosetevent(GPIO_ENC28J60_INTR, true, true, true, NULL);
+ (void)stm32_gpiosetevent(GPIO_ENC28J60_INTR, false, true, true, NULL);
}
/****************************************************************************
diff --git a/nuttx/drivers/net/enc28j60.c b/nuttx/drivers/net/enc28j60.c
index 6ac399a19..47a84ec9f 100644
--- a/nuttx/drivers/net/enc28j60.c
+++ b/nuttx/drivers/net/enc28j60.c
@@ -1383,7 +1383,14 @@ static void enc_worker(FAR void *arg)
DEBUGASSERT(priv);
- /* Disable further interrupts by clearing the global interrup enable bit */
+ /* Disable further interrupts by clearing the global interrupt enable bit.
+ * "After an interrupt occurs, the host controller should clear the global
+ * enable bit for the interrupt pin before servicing the interrupt. Clearing
+ * the enable bit will cause the interrupt pin to return to the non-asserted
+ * state (high). Doing so will prevent the host controller from missing a
+ * falling edge should another interrupt occur while the immediate interrupt
+ * is being serviced."
+ */
enc_bfcgreg(priv, ENC_EIE, EIE_INTIE);
@@ -1551,12 +1558,17 @@ static void enc_worker(FAR void *arg)
enc_rxerif(priv); /* Handle the RX error */
enc_bfcgreg(priv, ENC_EIR, EIR_RXERIF); /* Clear the RXERIF interrupt */
}
-
}
/* Enable Ethernet interrupts */
enc_bfsgreg(priv, ENC_EIE, EIE_INTIE);
+
+ /* Enable GPIO interrupts if they were disbled in enc_interrupt */
+
+#ifndef CONFIG_SPI_OWNBUS
+ priv->lower->enable(priv->lower);
+#endif
}
/****************************************************************************
@@ -1596,6 +1608,14 @@ static int enc_interrupt(int irq, FAR void *context)
* a good thing to do in any event.
*/
+ DEBUGASSERT(work_available(&priv->work));
+
+ /* Notice that further GPIO interrupts are disabled until the work is
+ * actually performed. This is to prevent overrun of the worker thread.
+ * Interrupts are re-enabled in enc_worker() when the work is completed.
+ */
+
+ priv->lower->disable(priv->lower);
return work_queue(HPWORK, &priv->work, enc_worker, (FAR void *)priv, 0);
#endif
}
diff --git a/nuttx/include/nuttx/net/enc28j60.h b/nuttx/include/nuttx/net/enc28j60.h
index 2e39d88ac..7d0d7c3e5 100644
--- a/nuttx/include/nuttx/net/enc28j60.h
+++ b/nuttx/include/nuttx/net/enc28j60.h
@@ -85,6 +85,22 @@ struct enc_stats_s
/* The ENC28J60 normal provides interrupts to the MCU via a GPIO pin. The
* following structure provides an MCU-independent mechanixm for controlling
* the ENC28J60 GPIO interrupt.
+ *
+ * The ENC32J60 interrupt is an active low, *level* interrupt. "When an
+ * interrupt occurs, the interrupt flag is set. If the interrupt is enabled
+ * in the EIE register and the INTIE global interrupt enable bit is set, the
+ * INT pin will be driven low"
+ *
+ * "When an enabled interrupt occurs, the interrupt pin will remain low until
+ * all flags which are causing the interrupt are cleared or masked off
+ * (enable bit is cleared) by the host controller." However, the interrupt
+ * will behave like a falling edge interrupt because "After an interrupt
+ * occurs, the host controller [clears] the global enable bit for the
+ * interrupt pin before servicing the interrupt. Clearing the enable bit
+ * will cause the interrupt pin to return to the non-asserted state (high).
+ * Doing so will prevent the host controller from missing a falling edge
+ * should another interrupt occur while the immediate interrupt is being
+ * serviced."
*/
struct enc_lower_s