summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/stm32/stm32_usbdev.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-07-22 20:12:50 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-07-22 20:12:50 +0000
commite3ba485a852fc10a85533d0c5a28c6e01d66a0d4 (patch)
treea33615148a3516b8d3b14be981e78fc49fa215c5 /nuttx/arch/arm/src/stm32/stm32_usbdev.c
parent2d333142924f4e7396de449189e2fa383f29248f (diff)
downloadnuttx-e3ba485a852fc10a85533d0c5a28c6e01d66a0d4.tar.gz
nuttx-e3ba485a852fc10a85533d0c5a28c6e01d66a0d4.tar.bz2
nuttx-e3ba485a852fc10a85533d0c5a28c6e01d66a0d4.zip
apps/examples/usbstorage can now be built as NSH built-in commands; configs/stm3210e-eval/nsh2 now uses these usb storage commands
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3812 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/stm32/stm32_usbdev.c')
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_usbdev.c139
1 files changed, 88 insertions, 51 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_usbdev.c b/nuttx/arch/arm/src/stm32/stm32_usbdev.c
index 1a696628c..3fe54ea17 100644
--- a/nuttx/arch/arm/src/stm32/stm32_usbdev.c
+++ b/nuttx/arch/arm/src/stm32/stm32_usbdev.c
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/stm32/stm32_usbdev.c
*
- * Copyright (C) 2009-2010 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2009-2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* References:
@@ -479,6 +479,8 @@ static int stm32_selfpowered(struct usbdev_s *dev, bool selfpowered);
static void stm32_reset(struct stm32_usbdev_s *priv);
static void stm32_hwreset(struct stm32_usbdev_s *priv);
+static void stm32_hwsetup(struct stm32_usbdev_s *priv);
+static void stm32_hwshutdown(struct stm32_usbdev_s *priv);
/****************************************************************************
* Private Data
@@ -3310,33 +3312,13 @@ static void stm32_hwreset(struct stm32_usbdev_s *priv)
}
/****************************************************************************
- * Public Functions
- ****************************************************************************/
-/****************************************************************************
- * Name: up_usbinitialize
- * Description:
- * Initialize the USB driver
- * Input Parameters:
- * None
- *
- * Returned Value:
- * None
- *
+ * Name: stm32_hwsetup
****************************************************************************/
-void up_usbinitialize(void)
+static void stm32_hwsetup(struct stm32_usbdev_s *priv)
{
- /* For now there is only one USB controller, but we will always refer to
- * it using a pointer to make any future ports to multiple USB controllers
- * easier.
- */
-
- struct stm32_usbdev_s *priv = &g_usbdev;
int epno;
- usbtrace(TRACE_DEVINIT, 0);
- stm32_checksetup();
-
/* Power the USB controller, put the USB controller into reset, disable
* all USB interrupts
*/
@@ -3408,6 +3390,63 @@ void up_usbinitialize(void)
stm32_putreg(USB_CNTR_FRES, STM32_USB_CNTR);
up_mdelay(5);
+}
+
+/****************************************************************************
+ * Name: stm32_hwshutdown
+ ****************************************************************************/
+
+static void stm32_hwshutdown(struct stm32_usbdev_s *priv)
+{
+ priv->usbdev.speed = USB_SPEED_UNKNOWN;
+
+ /* Disable all interrupts and force the USB controller into reset */
+
+ stm32_putreg(USB_CNTR_FRES, STM32_USB_CNTR);
+
+ /* Clear any pending interrupts */
+
+ stm32_putreg(0, STM32_USB_ISTR);
+
+ /* Disconnect the device / disable the pull-up */
+
+ stm32_usbpullup(&priv->usbdev, false);
+
+ /* Power down the USB controller */
+
+ stm32_putreg(USB_CNTR_FRES|USB_CNTR_PDWN, STM32_USB_CNTR);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+/****************************************************************************
+ * Name: up_usbinitialize
+ * Description:
+ * Initialize the USB driver
+ * Input Parameters:
+ * None
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+void up_usbinitialize(void)
+{
+ /* For now there is only one USB controller, but we will always refer to
+ * it using a pointer to make any future ports to multiple USB controllers
+ * easier.
+ */
+
+ struct stm32_usbdev_s *priv = &g_usbdev;
+
+ usbtrace(TRACE_DEVINIT, 0);
+ stm32_checksetup();
+
+ /* Power up the USB controller, but leave it in the reset state */
+
+ stm32_hwsetup(priv);
/* Attach USB controller interrupt handlers. The hardware will not be
* initialized and interrupts will not be enabled until the class device
@@ -3456,39 +3495,25 @@ void up_usbuninitialize(void)
struct stm32_usbdev_s *priv = &g_usbdev;
irqstate_t flags;
- usbtrace(TRACE_DEVUNINIT, 0);
-
- if (priv->driver)
- {
- usbtrace(TRACE_DEVERROR(STM32_TRACEERR_DRIVERREGISTERED), 0);
- usbdev_unregister(priv->driver);
- }
-
flags = irqsave();
- priv->usbdev.speed = USB_SPEED_UNKNOWN;
+ usbtrace(TRACE_DEVUNINIT, 0);
- /* Disable and detach IRQs */
+ /* Disable and detach the USB IRQs */
up_disable_irq(STM32_IRQ_USBHPCANTX);
up_disable_irq(STM32_IRQ_USBLPCANRX0);
irq_detach(STM32_IRQ_USBHPCANTX);
irq_detach(STM32_IRQ_USBLPCANRX0);
- /* Disable all interrupts and force the USB controller into reset */
-
- stm32_putreg(USB_CNTR_FRES, STM32_USB_CNTR);
-
- /* Clear any pending interrupts */
-
- stm32_putreg(0, STM32_USB_ISTR);
-
- /* Disconnect the device / disable the pull-up */
+ if (priv->driver)
+ {
+ usbtrace(TRACE_DEVERROR(STM32_TRACEERR_DRIVERREGISTERED), 0);
+ usbdev_unregister(priv->driver);
+ }
- stm32_usbpullup(&priv->usbdev, false);
-
- /* Power down the USB controller */
+ /* Put the hardware in an inactive state */
- stm32_putreg(USB_CNTR_FRES|USB_CNTR_PDWN, STM32_USB_CNTR);
+ stm32_hwshutdown(priv);
irqrestore(flags);
}
@@ -3530,7 +3555,7 @@ int usbdev_register(struct usbdevclass_driver_s *driver)
/* First hook up the driver */
- priv->driver = driver;
+ priv->driver = driver;
/* Then bind the class driver */
@@ -3570,9 +3595,10 @@ int usbdev_register(struct usbdevclass_driver_s *driver)
* Name: usbdev_unregister
*
* Description:
- * Un-register usbdev class driver.If the USB device is connected to a USB host,
- * it will first disconnect(). The driver is also requested to unbind() and clean
- * up any device state, before this procedure finally returns.
+ * Un-register usbdev class driver. If the USB device is connected to a
+ * USB host, it will first disconnect(). The driver is also requested to
+ * unbind() and clean up any device state, before this procedure finally
+ * returns.
*
****************************************************************************/
@@ -3584,6 +3610,8 @@ int usbdev_unregister(struct usbdevclass_driver_s *driver)
*/
struct stm32_usbdev_s *priv = &g_usbdev;
+ irqstate_t flags;
+
usbtrace(TRACE_DEVUNREGISTER, 0);
#ifdef CONFIG_DEBUG
@@ -3596,16 +3624,25 @@ int usbdev_unregister(struct usbdevclass_driver_s *driver)
/* Unbind the class driver */
+ flags = irqsave();
CLASS_UNBIND(driver, &priv->usbdev);
- /* Disable USB controller interrupts */
+ /* Disable USB controller interrupts (but keep them attached) */
up_disable_irq(STM32_IRQ_USBHPCANTX);
up_disable_irq(STM32_IRQ_USBLPCANRX0);
+ /* Put the hardware in an inactive state. Then bring the hardware back up
+ * in the reset state.
+ */
+
+ stm32_hwshutdown(priv);
+ stm32_hwsetup(priv);
+
/* Unhook the driver */
priv->driver = NULL;
+ irqrestore(flags);
return OK;
}