From 96d6082aedb303a830c5ec6e81be21edc43cde3e Mon Sep 17 00:00:00 2001 From: patacongo Date: Thu, 30 Dec 2010 23:08:46 +0000 Subject: Handling missing RHSC interrupt git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3223 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/Documentation/NuttxPortingGuide.html | 8 +++++- nuttx/arch/arm/src/lpc17xx/lpc17_internal.h | 2 +- nuttx/arch/arm/src/lpc17xx/lpc17_usbhost.c | 30 +++++++++++++++++---- nuttx/configs/README.txt | 6 +++++ nuttx/configs/nucleus2g/src/up_nsh.c | 36 +++++++++++++++++++++++++ nuttx/configs/olimex-lpc1766stk/include/board.h | 23 ++++++++++++++++ nuttx/configs/olimex-lpc1766stk/src/up_nsh.c | 36 +++++++++++++++++++++++++ nuttx/include/nuttx/usb/usbhost.h | 2 +- 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 @@

NuttX RTOS Porting Guide

-

Last Updated: December 22, 2010

+

Last Updated: December 29, 2010

@@ -3219,6 +3219,12 @@ build
  • 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/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 #include -#include + +#include "lpc17_internal.h" /* Includes default GPIO settings */ +#include /* 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 #include +#include #include #include @@ -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 #include +#include #include #include @@ -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); -- cgit v1.2.3