summaryrefslogtreecommitdiff
path: root/nuttx/configs/ea3131
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2013-11-15 15:56:24 -0600
committerGregory Nutt <gnutt@nuttx.org>2013-11-15 15:56:24 -0600
commit803b5f698d0aaec0b014dd54ea7870f2c3fecd6d (patch)
tree3347e3ccd79c9778e5649b87d1337a39c6d319e9 /nuttx/configs/ea3131
parent5552e79d358fee090dd86b6f47e9c4f4c3b67224 (diff)
downloadnuttx-803b5f698d0aaec0b014dd54ea7870f2c3fecd6d.tar.gz
nuttx-803b5f698d0aaec0b014dd54ea7870f2c3fecd6d.tar.bz2
nuttx-803b5f698d0aaec0b014dd54ea7870f2c3fecd6d.zip
EA3131: Framework for USB host support
Diffstat (limited to 'nuttx/configs/ea3131')
-rw-r--r--nuttx/configs/ea3131/src/Makefile49
-rw-r--r--nuttx/configs/ea3131/src/ea3131_internal.h39
-rw-r--r--nuttx/configs/ea3131/src/up_boot.c19
-rw-r--r--nuttx/configs/ea3131/src/up_usbhost.c317
4 files changed, 397 insertions, 27 deletions
diff --git a/nuttx/configs/ea3131/src/Makefile b/nuttx/configs/ea3131/src/Makefile
index 27c4b6221..e87b42f3d 100644
--- a/nuttx/configs/ea3131/src/Makefile
+++ b/nuttx/configs/ea3131/src/Makefile
@@ -35,45 +35,56 @@
-include $(TOPDIR)/Make.defs
-CFLAGS += -I$(TOPDIR)/sched
+CFLAGS += -I$(TOPDIR)/sched
-ASRCS =
-AOBJS = $(ASRCS:.S=$(OBJEXT))
+ASRCS =
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+
+CSRCS = up_boot.c up_clkinit.c
-CSRCS = up_boot.c up_clkinit.c
ifeq ($(CONFIG_ARCH_BUTTONS),y)
-CSRCS += up_buttons.c
+CSRCS += up_buttons.c
endif
+
ifeq ($(CONFIG_LPC31_EXTDRAM),y)
-CSRCS += up_mem.c
+CSRCS += up_mem.c
endif
+
ifeq ($(CONFIG_ARCH_LEDS),y)
-CSRCS += up_leds.c
+CSRCS += up_leds.c
endif
+
ifeq ($(CONFIG_LPC31_SPI),y)
-CSRCS += up_spi.c
+CSRCS += up_spi.c
endif
+
ifeq ($(CONFIG_NSH_ARCHINIT),y)
-CSRCS += up_nsh.c
+CSRCS += up_nsh.c
endif
+
ifeq ($(CONFIG_PAGING),y)
-CSRCS += up_fillpage.c
+CSRCS += up_fillpage.c
+endif
+
+ifeq ($(CONFIG_LPC31_USBOTG),y)
+ifeq ($(CONFIG_USBHOST),y)
+CSRCS += up_usbhost.c
endif
ifeq ($(CONFIG_USBMSC),y)
-CSRCS += up_usbmsc.c
+CSRCS += up_usbmsc.c
endif
-COBJS = $(CSRCS:.c=$(OBJEXT))
+endif
+
+COBJS = $(CSRCS:.c=$(OBJEXT))
-SRCS = $(ASRCS) $(CSRCS)
-OBJS = $(AOBJS) $(COBJS)
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
-ARCH_SRCDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src
+ARCH_SRCDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src
ifeq ($(WINTOOL),y)
- CFLAGS += -I "${shell cygpath -w $(ARCH_SRCDIR)/chip}" \
- -I "${shell cygpath -w $(ARCH_SRCDIR)/common}" \
- -I "${shell cygpath -w $(ARCH_SRCDIR)/arm}"
+ CFLAGS += -I "${shell cygpath -w $(ARCH_SRCDIR)/chip}" -I "${shell cygpath -w $(ARCH_SRCDIR)/common}" -I "${shell cygpath -w $(ARCH_SRCDIR)/arm}"
else
- CFLAGS += -I$(ARCH_SRCDIR)/chip -I$(ARCH_SRCDIR)/common -I$(ARCH_SRCDIR)/arm
+ CFLAGS += -I$(ARCH_SRCDIR)/chip -I$(ARCH_SRCDIR)/common -I$(ARCH_SRCDIR)/arm
endif
all: libboard$(LIBEXT)
diff --git a/nuttx/configs/ea3131/src/ea3131_internal.h b/nuttx/configs/ea3131/src/ea3131_internal.h
index 1846bf461..c7a4093b4 100644
--- a/nuttx/configs/ea3131/src/ea3131_internal.h
+++ b/nuttx/configs/ea3131/src/ea3131_internal.h
@@ -87,7 +87,7 @@
************************************************************************************/
#ifdef CONFIG_LPC31_EXTDRAM
-extern void lpc31_meminitialize(void);
+void lpc31_meminitialize(void);
#endif
/************************************************************************************
@@ -98,17 +98,46 @@ extern void lpc31_meminitialize(void);
*
************************************************************************************/
-extern void weak_function lpc31_spiinitialize(void);
+void weak_function lpc31_spiinitialize(void);
/************************************************************************************
- * Name: lpc31_usbinitialize
+ * Name: lpc31_usbdev_initialize
*
* Description:
* Called to setup USB-related GPIO pins for the EA3131 board.
*
************************************************************************************/
-extern void weak_function lpc31_usbinitialize(void);
+#if defined(CONFIG_LPC31_USBOTG) && defined(CONFIG_USBDEV)
+void weak_function lpc31_usbdev_initialize(void);
+#endif
+
+/************************************************************************************
+ * Name: lpc31_usbhost_bootinitialize
+ *
+ * Description:
+ * Called from lpc31_boardinitialize very early in inialization to setup USB
+ * host-related GPIO pins for the EA3131 board.
+ *
+ ************************************************************************************/
+
+#if defined(CONFIG_LPC31_USBOTG) && defined(CONFIG_USBHOST)
+void weak_function lpc31_usbhost_bootinitialize(void);
+#endif
+
+/***********************************************************************************
+ * Name: lpc31_usbhost_initialize
+ *
+ * Description:
+ * Called at application startup time to initialize the USB host functionality.
+ * This function will start a thread that will monitor for device
+ * connection/disconnection events.
+ *
+ ***********************************************************************************/
+
+#if defined(CONFIG_LPC31_USBOTG) && defined(CONFIG_USBHOST)
+int lpc31_usbhost_initialize(void);
+#endif
/************************************************************************************
* Name: lpc31_pginitialize
@@ -119,7 +148,7 @@ extern void weak_function lpc31_usbinitialize(void);
************************************************************************************/
#ifdef CONFIG_PAGING
-extern void weak_function lpc31_pginitialize(void);
+void weak_function lpc31_pginitialize(void);
#endif
#endif /* __ASSEMBLY__ */
diff --git a/nuttx/configs/ea3131/src/up_boot.c b/nuttx/configs/ea3131/src/up_boot.c
index d958b9b6a..52e0b086c 100644
--- a/nuttx/configs/ea3131/src/up_boot.c
+++ b/nuttx/configs/ea3131/src/up_boot.c
@@ -91,14 +91,27 @@ void lpc31_boardinitialize(void)
#endif
/* Initialize USB is 1) USBDEV is selected, 2) the USB controller is not
- * disabled, and 3) the weak function lpc31_usbinitialize() has been brought
+ * disabled, and 3) the weak function lpc31_usbdev_initialize() has been brought
* into the build.
*/
#if defined(CONFIG_USBDEV) && defined(CONFIG_LPC31_USBOTG)
- if (lpc31_usbinitialize)
+ if (lpc31_usbdev_initialize)
{
- lpc31_usbinitialize();
+ lpc31_usbdev_initialize();
+ }
+#endif
+
+ /* Initialize USB if the 1) the HS host or device controller is in the
+ * configuration and 2) the weak function sam_usbinitialize() has been brought
+ * into the build. Presumeably either CONFIG_USBDEV or CONFIG_USBHOST is also
+ * selected.
+ */
+
+#if defined(CONFIG_SAMA5_UHPHS) || defined(CONFIG_SAMA5_UDPHS)
+ if (lpc31_usbhost_bootinitialize)
+ {
+ lpc31_usbhost_bootinitialize();
}
#endif
diff --git a/nuttx/configs/ea3131/src/up_usbhost.c b/nuttx/configs/ea3131/src/up_usbhost.c
new file mode 100644
index 000000000..8b6f459af
--- /dev/null
+++ b/nuttx/configs/ea3131/src/up_usbhost.c
@@ -0,0 +1,317 @@
+/************************************************************************************
+ * configs/ea3131/src/up_usbhost.c
+ *
+ * Copyright (C) 2013 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ************************************************************************************/
+
+/************************************************************************************
+ * Included Files
+ ************************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <sched.h>
+#include <errno.h>
+#include <assert.h>
+#include <debug.h>
+
+#include <nuttx/usb/usbdev.h>
+#include <nuttx/usb/usbhost.h>
+#include <nuttx/usb/usbdev_trace.h>
+
+#include "up_arch.h"
+
+#include "lpc31_internal.h"
+#include "ea3131_internal.h"
+
+#if defined(CONFIG_LPC31_USBOTG) || defined(CONFIG_USBHOST)
+
+/************************************************************************************
+ * Pre-processor Definitions
+ ************************************************************************************/
+
+#ifndef CONFIG_USBHOST_DEFPRIO
+# define CONFIG_USBHOST_DEFPRIO 50
+#endif
+
+#ifndef CONFIG_USBHOST_STACKSIZE
+# define CONFIG_USBHOST_STACKSIZE 1024
+#endif
+
+#ifdef HAVE_USBDEV
+# undef CONFIG_LPC31_USBOTG_RHPORT1
+#endif
+
+/************************************************************************************
+ * Private Data
+ ************************************************************************************/
+/* Retained device driver handle */
+
+static struct usbhost_connection_s *g_ehciconn;
+
+/* Overcurrent interrupt handler */
+
+#if 0 /* Not yet implemented */
+static xcpt_t g_ochandler;
+#endif
+
+/************************************************************************************
+ * Private Functions
+ ************************************************************************************/
+
+/************************************************************************************
+ * Name: ehci_waiter
+ *
+ * Description:
+ * Wait for USB devices to be connected to the EHCI root hub.
+ *
+ ************************************************************************************/
+
+static int ehci_waiter(int argc, char *argv[])
+{
+ bool connected = false;
+ int rhpndx;
+ int ret;
+
+ uvdbg("Waiter Running\n");
+ for (;;)
+ {
+ /* Wait for the device to change state */
+
+ rhpndx = CONN_WAIT(g_ehciconn, &connected);
+ DEBUGASSERT(rhpndx >= 0 && rhpndx < 1);
+
+ connected = !connected;
+
+ uvdbg("RHport1 %s\n",
+ connected ? "connected" : "disconnected");
+
+ /* Did we just become connected? */
+
+ if (connected)
+ {
+ /* Yes.. enumerate the newly connected device */
+
+ ret = CONN_ENUMERATE(g_ehciconn, rhpndx);
+ if (ret < 0)
+ {
+ uvdbg("RHport1 CONN_ENUMERATE failed: %d\n", ret);
+ connected = false;
+ }
+ }
+ }
+
+ /* Keep the compiler from complaining */
+
+ return 0;
+}
+
+/************************************************************************************
+ * Public Functions
+ ************************************************************************************/
+
+/************************************************************************************
+ * Name: lpc31_usbhost_bootinitialize
+ *
+ * Description:
+ * Called from lpc31_boardinitialize very early in inialization to setup USB
+ * host-related GPIO pins for the EA3131 board.
+ *
+ * USB host VBUS power is controlled by a Micrel USB power switch. That switch is
+ * driver by a discrete that comes from the I2C-contrrol PCA9532 GPIO expander.
+ *
+ ************************************************************************************/
+
+void weak_function lpc31_usbhost_bootinitialize(void)
+{
+ /* Get an instance of the I2C interface. This will be needed to control the
+ * PCA9532 GPIO expander.
+ */
+#warning Missing logic
+
+ /* Use the I2C interface to initialize the PCA9532 GPIO expander driver */
+#warning Missing logic
+
+ /* Configure pin to drive VBUS power using the PCA8532 GPIO expander */
+#warning Missing logic
+
+ /* Configure pin to detect overrcurrent errors */
+#warning Missing logic
+}
+
+/***********************************************************************************
+ * Name: lpc31_usbhost_initialize
+ *
+ * Description:
+ * Called at application startup time to initialize the USB host functionality.
+ * This function will start a thread that will monitor for device
+ * connection/disconnection events.
+ *
+ ***********************************************************************************/
+
+int lpc31_usbhost_initialize(void)
+{
+ pid_t pid;
+ int ret;
+
+ /* First, register all of the class drivers needed to support the drivers
+ * that we care about
+ *
+ * Register theUSB host Mass Storage Class:
+ */
+
+#ifdef CONFIG_USBHOST_MSC
+ ret = usbhost_storageinit();
+ if (ret != OK)
+ {
+ udbg("ERROR: Failed to register the mass storage class: %d\n", ret);
+ }
+#endif
+
+ /* Register the USB host HID keyboard class driver */
+
+#ifdef CONFIG_USBHOST_HIDKBD
+ ret = usbhost_kbdinit();
+ if (ret != OK)
+ {
+ udbg("ERROR: Failed to register the KBD class\n");
+ }
+#endif
+
+ /* Then get an instance of the USB EHCI interface. */
+
+ g_ehciconn = lpc31_ehci_initialize(0);
+ if (!g_ehciconn)
+ {
+ udbg("ERROR: lpc31_ehci_initialize failed\n");
+ return -ENODEV;
+ }
+
+ /* Start a thread to handle device connection. */
+
+ pid = TASK_CREATE("EHCI Monitor", CONFIG_USBHOST_DEFPRIO, CONFIG_USBHOST_STACKSIZE,
+ (main_t)ehci_waiter, (FAR char * const *)NULL);
+ if (pid < 0)
+ {
+ udbg("ERROR: Failed to create ehci_waiter task: %d\n", ret);
+ return -ENODEV;
+ }
+
+ return OK;
+}
+
+/***********************************************************************************
+ * Name: lpc31_usbhost_vbusdrive
+ *
+ * Description:
+ * Enable/disable driving of VBUS 5V output. This function must be provided by
+ * each platform that implements the OHCI or EHCI host interface
+ *
+ * Input Parameters:
+ * rhport - Selects root hub port to be powered host interface. See SAM_RHPORT_*
+ * definitions above.
+ * enable - true: enable VBUS power; false: disable VBUS power
+ *
+ * Returned Value:
+ * None
+ *
+ ***********************************************************************************/
+
+void lpc31_usbhost_vbusdrive(int rhport, bool enable)
+{
+ uvdbg("RHPort%d: enable=%d\n", rhport+1, enable);
+
+ /* The LPC3131 has only a single root hub port */
+
+ if (rhport == 0)
+ {
+ /* Then enable or disable VBUS power */
+
+ if (enable)
+ {
+ /* Enable the Power Switch by driving the enable pin low */
+#warning Missing logic
+ }
+ else
+ {
+ /* Disable the Power Switch by driving the enable pin high */
+#warning Missing logic
+ }
+ }
+}
+
+/************************************************************************************
+ * Name: lpc31_setup_overcurrent
+ *
+ * Description:
+ * Setup to receive an interrupt-level callback if an overcurrent condition is
+ * detected.
+ *
+ * Input parameter:
+ * handler - New overcurrent interrupt handler
+ *
+ * Returned value:
+ * Old overcurrent interrupt handler
+ *
+ ************************************************************************************/
+
+#if 0 /* Not ready yet */
+xcpt_t lpc31_setup_overcurrent(xcpt_t handler)
+{
+ xcpt_t oldhandler;
+ irqstate_t flags;
+
+ /* Disable interrupts until we are done. This guarantees that the
+ * following operations are atomic.
+ */
+
+ flags = irqsave();
+
+ /* Get the old button interrupt handler and save the new one */
+
+ oldhandler = g_ochandler;
+ g_ochandler = handler;
+
+ /* Configure the interrupt */
+#warning Missing logic
+
+ /* Return the old button handler (so that it can be restored) */
+
+ irqrestore(flags);
+ return oldhandler;
+}
+#endif /* 0 */
+
+#endif /* CONFIG_LPC31_USBOTG || CONFIG_USBHOST */