summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2010-12-30 23:08:46 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2010-12-30 23:08:46 +0000
commit96d6082aedb303a830c5ec6e81be21edc43cde3e (patch)
treed6e6c0bf37e710c8faf58a474a9dd3145df591c6
parent6c576a9a79a65b64ea94d743beb3d008ee004092 (diff)
downloadpx4-nuttx-96d6082aedb303a830c5ec6e81be21edc43cde3e.tar.gz
px4-nuttx-96d6082aedb303a830c5ec6e81be21edc43cde3e.tar.bz2
px4-nuttx-96d6082aedb303a830c5ec6e81be21edc43cde3e.zip
Handling missing RHSC interrupt
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3223 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/Documentation/NuttxPortingGuide.html8
-rwxr-xr-xnuttx/arch/arm/src/lpc17xx/lpc17_internal.h2
-rwxr-xr-xnuttx/arch/arm/src/lpc17xx/lpc17_usbhost.c30
-rw-r--r--nuttx/configs/README.txt6
-rwxr-xr-xnuttx/configs/nucleus2g/src/up_nsh.c36
-rwxr-xr-xnuttx/configs/olimex-lpc1766stk/include/board.h23
-rwxr-xr-xnuttx/configs/olimex-lpc1766stk/src/up_nsh.c36
-rw-r--r--nuttx/include/nuttx/usb/usbhost.h2
8 files changed, 135 insertions, 8 deletions
diff --git a/nuttx/Documentation/NuttxPortingGuide.html b/nuttx/Documentation/NuttxPortingGuide.html
index cdc4db1d3..adc0041f9 100644
--- a/nuttx/Documentation/NuttxPortingGuide.html
+++ b/nuttx/Documentation/NuttxPortingGuide.html
@@ -12,7 +12,7 @@
<h1><big><font color="#3c34ec">
<i>NuttX RTOS Porting Guide</i>
</font></big></h1>
- <p>Last Updated: December 22, 2010</p>
+ <p>Last Updated: December 29, 2010</p>
</td>
</tr>
</table>
@@ -3220,6 +3220,12 @@ build
<code>CONFIG_USBHOST</code>: Enables USB host support
</li>
<li>
+ <code>CONFIG_USBHOST_HAVERHSC</code>:
+ Define if the hardware is able to detect a root hub status change when a device is inserted.
+ If <code>CONFIG_USBHOST_HAVERHSC</code> is not set, then it is assumed that the hardware cannot detect the presence of a USB device
+ and that the application must periodically attempt to enumerate the device.
+ </li>
+ <li>
<code>CONFIG_USBHOST_NPREALLOC</code>: Number of pre-allocated class instances
</li>
</ul>
diff --git a/nuttx/arch/arm/src/lpc17xx/lpc17_internal.h b/nuttx/arch/arm/src/lpc17xx/lpc17_internal.h
index 2c684767c..f2b15bbd3 100755
--- a/nuttx/arch/arm/src/lpc17xx/lpc17_internal.h
+++ b/nuttx/arch/arm/src/lpc17xx/lpc17_internal.h
@@ -274,7 +274,7 @@
#define GPIO_PWM1p3_1 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN21)
#define GPIO_SSP0_SSEL_2 (GPIO_ALT3 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN21)
#define GPIO_MCPWM_MCOB0 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN22)
-#define GPIO_USB_PWRD (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN22)
+#define GPIO_USB_PWRD (GPIO_ALT2 | GPIO_PULLDN | GPIO_PORT1 | GPIO_PIN22)
#define GPIO_MAT1p0 (GPIO_ALT3 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN22)
#define GPIO_MCPWM_MCI1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN23)
#define GPIO_PWM1p4_1 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT1 | GPIO_PIN23)
diff --git a/nuttx/arch/arm/src/lpc17xx/lpc17_usbhost.c b/nuttx/arch/arm/src/lpc17xx/lpc17_usbhost.c
index 5d1ae1727..1d3877ed0 100755
--- a/nuttx/arch/arm/src/lpc17xx/lpc17_usbhost.c
+++ b/nuttx/arch/arm/src/lpc17xx/lpc17_usbhost.c
@@ -55,13 +55,14 @@
#include <nuttx/usb/usbhost.h>
#include <arch/irq.h>
-#include <arch/board/board.h>
+
+#include "lpc17_internal.h" /* Includes default GPIO settings */
+#include <arch/board/board.h> /* May redefine GPIO settings */
#include "chip.h"
#include "up_arch.h"
#include "up_internal.h"
-#include "lpc17_internal.h"
#include "lpc17_usb.h"
#include "lpc17_syscon.h"
#include "lpc17_ohciram.h"
@@ -700,7 +701,7 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
intstatus = lpc17_getreg(LPC17_USBHOST_INTST);
intenable = lpc17_getreg(LPC17_USBHOST_INTEN);
- ullvdbg("INST: %08x INTEN:\n", intstatus, intenable);
+ ullvdbg("INST: %08x INTEN: %08x\n", intstatus, intenable);
intstatus &= intenable;
if (intstatus != 0)
@@ -715,7 +716,7 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
if ((rhportst1 & OHCI_RHPORTST_CSC) != 0)
{
uint32_t rhstatus = lpc17_getreg(LPC17_USBHOST_RHSTATUS);
- ullvdbg("Connect Status Change, RHSTATUS: %08x\n", rhportst1);
+ ullvdbg("Connect Status Change, RHSTATUS: %08x\n", rhstatus);
/* If DRWE is set, Connect Status Change indicates a remote wake-up event */
@@ -735,10 +736,12 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
if (!priv->connected)
{
ullvdbg("Connected\n");
- DEBUGASSERT(priv->rhssem.semcount <= 0);
priv->tdstatus = 0;
priv->connected = true;
+#ifdef CONFIG_USBHOST_HAVERHSC
+ DEBUGASSERT(priv->rhssem.semcount <= 0);
lpc17_givesem(&priv->rhssem);
+#endif
}
else
{
@@ -764,6 +767,8 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
CLASS_DISCONNECTED(priv->class);
}
+
+ DEBUGASSERT(priv->rhssem.semcount <= 0);
lpc17_givesem(&priv->rhssem);
}
else
@@ -841,6 +846,7 @@ static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected)
{
struct lpc17_usbhost_s *priv = (struct lpc17_usbhost_s *)drvr;
+#ifdef CONFIG_USBHOST_HAVERHSC
/* Are we already connected? */
while (priv->connected == connected)
@@ -849,7 +855,19 @@ static int lpc17_wait(FAR struct usbhost_driver_s *drvr, bool connected)
lpc17_takesem(&priv->rhssem);
}
+#else
+ if (!connected)
+ {
+ /* Are we already connected? */
+ while (priv->connected)
+ {
+ /* Yes... wait for the disconnection */
+
+ lpc17_takesem(&priv->rhssem);
+ }
+ }
+#endif
return OK;
}
@@ -889,6 +907,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
* method first to be assured that a device is connected.
*/
+#ifdef CONFIG_USBHOST_HAVERHSC
while (!priv->connected)
{
/* No, return an error */
@@ -896,6 +915,7 @@ static int lpc17_enumerate(FAR struct usbhost_driver_s *drvr)
udbg("Not connected\n");
return -ENODEV;
}
+#endif
/* USB 2.0 spec says at least 50ms delay before port reset */
diff --git a/nuttx/configs/README.txt b/nuttx/configs/README.txt
index e2b725c90..6b5bcc49f 100644
--- a/nuttx/configs/README.txt
+++ b/nuttx/configs/README.txt
@@ -706,6 +706,12 @@ defconfig -- This is a configuration file similar to the Linux
USB host controller driver
CONFIG_USBHOST
Enables USB host support
+ CONFIG_USBHOST_HAVERHSC
+ Define if the hardware is able to detect a root hub status change
+ when a device is inserted. If CONFIG_USBHOST_HAVERHSC is not set,
+ then it is assumed that the hardware cannot detect the presence
+ of a USB device and that the application must periodically attempt
+ to enumerate the device.
CONFIG_USBHOST_NPREALLOC
Number of pre-allocated class instances
diff --git a/nuttx/configs/nucleus2g/src/up_nsh.c b/nuttx/configs/nucleus2g/src/up_nsh.c
index 301057be0..8082b6e97 100755
--- a/nuttx/configs/nucleus2g/src/up_nsh.c
+++ b/nuttx/configs/nucleus2g/src/up_nsh.c
@@ -41,6 +41,7 @@
#include <nuttx/config.h>
#include <stdio.h>
+#include <unistd.h>
#include <debug.h>
#include <errno.h>
@@ -171,6 +172,7 @@ static int nsh_waiter(int argc, char *argv[])
message("nsh_waiter: Running\n");
for (;;)
{
+#ifdef CONFIG_USBHOST_HAVERHSC
/* Wait for the device to change state */
ret = DRVR_WAIT(g_drvr, connected);
@@ -187,6 +189,39 @@ static int nsh_waiter(int argc, char *argv[])
(void)DRVR_ENUMERATE(g_drvr);
}
+#else
+ /* Is the device connected? */
+
+ if (connected)
+ {
+ /* Yes.. wait for the disconnect event */
+
+ ret = DRVR_WAIT(g_drvr, false);
+ DEBUGASSERT(ret == OK);
+
+ connected = false;
+ message("nsh_waiter: Not connected\n");
+ }
+ else
+ {
+ /* Wait a bit */
+
+ sleep(2);
+
+ /* Try to enumerate the device */
+
+ uvdbg("nsh_usbhostinitialize: Enumerate device\n");
+ ret = DRVR_ENUMERATE(g_drvr);
+ if (ret != OK)
+ {
+ uvdbg("nsh_usbhostinitialize: Enumeration failed: %d\n", ret);
+ }
+ else
+ {
+ message("nsh_usbhostinitialize: Connected\n");
+ }
+ }
+#endif
}
/* Keep the compiler from complaining */
@@ -210,6 +245,7 @@ static int nsh_usbhostinitialize(void)
/* First, get an instance of the USB host interface */
+ message("nsh_usbhostinitialize: Initialize USB host\n");
g_drvr = usbhost_initialize(0);
if (g_drvr)
{
diff --git a/nuttx/configs/olimex-lpc1766stk/include/board.h b/nuttx/configs/olimex-lpc1766stk/include/board.h
index 6d6212644..275714da0 100755
--- a/nuttx/configs/olimex-lpc1766stk/include/board.h
+++ b/nuttx/configs/olimex-lpc1766stk/include/board.h
@@ -225,6 +225,29 @@
* P2[9]/USB_CONNECT/RXD2 64 USBD_CONNECT
*/
+#ifdef GPIO_USB_PPWR /* We can only redefine this if they have been defined */
+
+/* The Olimex LPC1766-STK has 10K pull-ups on PPWR and OVRCR and a 100k
+ * pull-down on PWRD so we should make sure that the outputs float.
+ */
+
+# undef GPIO_USB_PPWR
+# define GPIO_USB_PPWR (GPIO_ALT2 | GPIO_FLOAT | GPIO_PORT1 | GPIO_PIN19)
+# undef GPIO_USB_OVRCR
+# define GPIO_USB_OVRCR (GPIO_ALT2 | GPIO_FLOAT | GPIO_PORT1 | GPIO_PIN27)
+# undef GPIO_USB_PWRD
+# define GPIO_USB_PWRD (GPIO_ALT2 | GPIO_FLOAT | GPIO_PORT1 | GPIO_PIN22)
+
+/* In host mode (only) there are also 15K pull-downs on D+ and D- */
+
+# ifdef CONFIG_USBHOST
+# undef GPIO_USB_DP
+# define GPIO_USB_DP (GPIO_ALT1 | GPIO_FLOAT | GPIO_PORT0 | GPIO_PIN29)
+# undef GPIO_USB_DM
+# define GPIO_USB_DM (GPIO_ALT1 | GPIO_FLOAT | GPIO_PORT0 | GPIO_PIN30)
+# endif
+#endif
+
/* Ethernet GPIO PIN SIGNAL NAME
* -------------------------------- ---- --------------
* P1[0]/ENET_TXD0 95 E_TXD0
diff --git a/nuttx/configs/olimex-lpc1766stk/src/up_nsh.c b/nuttx/configs/olimex-lpc1766stk/src/up_nsh.c
index 62b470400..3a3bd4d97 100755
--- a/nuttx/configs/olimex-lpc1766stk/src/up_nsh.c
+++ b/nuttx/configs/olimex-lpc1766stk/src/up_nsh.c
@@ -41,6 +41,7 @@
#include <nuttx/config.h>
#include <stdio.h>
+#include <unistd.h>
#include <debug.h>
#include <errno.h>
@@ -164,6 +165,7 @@ static int nsh_waiter(int argc, char *argv[])
message("nsh_waiter: Running\n");
for (;;)
{
+#ifdef CONFIG_USBHOST_HAVERHSC
/* Wait for the device to change state */
ret = DRVR_WAIT(g_drvr, connected);
@@ -180,6 +182,39 @@ static int nsh_waiter(int argc, char *argv[])
(void)DRVR_ENUMERATE(g_drvr);
}
+#else
+ /* Is the device connected? */
+
+ if (connected)
+ {
+ /* Yes.. wait for the disconnect event */
+
+ ret = DRVR_WAIT(g_drvr, false);
+ DEBUGASSERT(ret == OK);
+
+ connected = false;
+ message("nsh_waiter: Not connected\n");
+ }
+ else
+ {
+ /* Wait a bit */
+
+ sleep(2);
+
+ /* Try to enumerate the device */
+
+ uvdbg("nsh_usbhostinitialize: Enumerate device\n");
+ ret = DRVR_ENUMERATE(g_drvr);
+ if (ret != OK)
+ {
+ uvdbg("nsh_usbhostinitialize: Enumeration failed: %d\n", ret);
+ }
+ else
+ {
+ message("nsh_usbhostinitialize: Connected\n");
+ }
+ }
+#endif
}
/* Keep the compiler from complaining */
@@ -263,6 +298,7 @@ static int nsh_usbhostinitialize(void)
/* First, get an instance of the USB host interface */
+ message("nsh_usbhostinitialize: Initialize USB host\n");
g_drvr = usbhost_initialize(0);
if (g_drvr)
{
diff --git a/nuttx/include/nuttx/usb/usbhost.h b/nuttx/include/nuttx/usb/usbhost.h
index 18753e1b8..b1c211cc4 100644
--- a/nuttx/include/nuttx/usb/usbhost.h
+++ b/nuttx/include/nuttx/usb/usbhost.h
@@ -444,7 +444,7 @@ struct usbhost_class_s
struct usbhost_epdesc_s;
struct usbhost_driver_s
{
- /* Wait for a device to connect or disconnect. */
+ /* Wait for a device to connect or disconnect (see CONFIG_USBHOST_HAVERHSC). */
int (*wait)(FAR struct usbhost_driver_s *drvr, bool connected);