diff --git a/arch/arm/src/lpc17xx/lpc17_usbhost.c b/arch/arm/src/lpc17xx/lpc17_usbhost.c index cdb9d7ae70c8b1a9bc346974df0860872e03851f..db8ccdfc9835d6e7760d6a1d1d6714c6a0e19b88 100755 --- a/arch/arm/src/lpc17xx/lpc17_usbhost.c +++ b/arch/arm/src/lpc17xx/lpc17_usbhost.c @@ -88,9 +88,7 @@ /* CLKCTRL enable bits */ -#define LPC17_CLKCTRL_ENABLES (USBOTG_CLK_HOSTCLK|USBOTG_CLK_DEVCLK|\ - USBOTG_CLK_I2CCLK|USBOTG_CLK_OTGCLK|\ - USBOTG_CLK_AHBCLK) +#define LPC17_CLKCTRL_ENABLES (USBOTG_CLK_HOSTCLK|USBDEV_CLK_PORTSELCLK|USBOTG_CLK_AHBCLK) /* Dump GPIO registers */ @@ -881,8 +879,9 @@ static int lpc17_usbinterrupt(int irq, FAR void *context) intstatus = lpc17_getreg(LPC17_USBHOST_INTST); intenable = lpc17_getreg(LPC17_USBHOST_INTEN); - intstatus &= intenable; + ullvdbg("INST: %08x INTEN:\n", intstatus, intenable); + intstatus &= intenable; if (intstatus != 0) { /* Root hub status change interrupt */ @@ -914,6 +913,7 @@ 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; @@ -929,8 +929,9 @@ static int lpc17_usbinterrupt(int irq, FAR void *context) else if (priv->connected) { - /* Yes.. disable interrupts */ + /* Yes.. disable interrupts and disconnect the device */ + ullvdbg("Disconnected\n"); lpc17_putreg(0, LPC17_USBHOST_INTEN); priv->connected = false; @@ -1713,6 +1714,8 @@ FAR struct usbhost_driver_s *usbhost_initialize(int controller) /* Enable clocking on USB (USB PLL clocking was initialized in very low- * evel clock setup logic (see lpc17_clockconfig.c)). We do still need * to set up USBOTG CLKCTRL to enable clocking. + * + * NOTE: The PORTSEL clock needs to be enabled only when accessing OTGSTCTRL */ lpc17_putreg(LPC17_CLKCTRL_ENABLES, LPC17_USBOTG_CLKCTRL); @@ -1725,7 +1728,21 @@ FAR struct usbhost_driver_s *usbhost_initialize(int controller) } while ((regval & LPC17_CLKCTRL_ENABLES) != LPC17_CLKCTRL_ENABLES); - lpc17_putreg(3, LPC17_USBOTG_STCTRL); + /* Set the OTG status and control register. Bits 0:1 apparently mean: + * + * 10: U1=device, U2=host + * 11: U1=host, U2=host + * 10: reserved + * 11: U1=host, U2=device + * + * NOTE: The PORTSEL clock needs to be enabled only when accessing OTGSTCTRL + */ + + lpc17_putreg(1, LPC17_USBOTG_STCTRL); + + /* Now we can turn off the PORTSEL clock */ + + lpc17_putreg((LPC17_CLKCTRL_ENABLES & ~USBDEV_CLK_PORTSELCLK), LPC17_USBOTG_CLKCTRL); /* Step 3: Configure I/O pins */ diff --git a/configs/olimex-lpc1766stk/src/up_nsh.c b/configs/olimex-lpc1766stk/src/up_nsh.c index 2d7e2753ea55bafcb814902eb7671b35608d35e2..62b470400a5049d9879da71cb19102a4427d678a 100755 --- a/configs/olimex-lpc1766stk/src/up_nsh.c +++ b/configs/olimex-lpc1766stk/src/up_nsh.c @@ -161,13 +161,16 @@ static int nsh_waiter(int argc, char *argv[]) bool connected = false; int ret; + message("nsh_waiter: Running\n"); for (;;) { /* Wait for the device to change state */ ret = DRVR_WAIT(g_drvr, connected); DEBUGASSERT(ret == OK); + connected = !connected; + message("nsh_waiter: %s\n", connected ? "connected" : "disconnected"); /* Did we just become connected? */ @@ -265,6 +268,8 @@ static int nsh_usbhostinitialize(void) { /* Start a thread to handle device connection. */ + message("nsh_usbhostinitialize: Start nsh_waiter\n"); + #ifndef CONFIG_CUSTOM_STACK pid = task_create("usbhost", CONFIG_USBHOST_DEFPRIO, CONFIG_USBHOST_STACKSIZE, diff --git a/examples/nsh/nsh.h b/examples/nsh/nsh.h index 8bdc0b9dd015a7f3f1fc6d3937e39ca06ba9d69c..c1c1a9ed8713787f3f2e40244a047ac9cea3db72 100644 --- a/examples/nsh/nsh.h +++ b/examples/nsh/nsh.h @@ -63,6 +63,12 @@ # endif #endif +/* Telnetd requires networking support */ + +#ifndef CONFIG_NET +# undef CONFIG_EXAMPLES_NSH_TELNET +#endif + /* One front end must be defined */ #if !defined(CONFIG_EXAMPLES_NSH_CONSOLE) && !defined(CONFIG_EXAMPLES_NSH_TELNET)