diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2015-03-26 09:49:01 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2015-03-26 09:49:01 -0600 |
commit | 1e17df18114ba3d2392883975a2127fb3222e104 (patch) | |
tree | ae15dc3896de71fde116148cdd0ea8a0bf9338a5 /nuttx | |
parent | b65ebf74f89ba4b7387f891d8212555d3b7a7c9c (diff) | |
download | px4-nuttx-1e17df18114ba3d2392883975a2127fb3222e104.tar.gz px4-nuttx-1e17df18114ba3d2392883975a2127fb3222e104.tar.bz2 px4-nuttx-1e17df18114ba3d2392883975a2127fb3222e104.zip |
SAMV6 USB updates
Diffstat (limited to 'nuttx')
-rw-r--r-- | nuttx/arch/arm/include/samv7/samv71_irq.h | 10 | ||||
-rw-r--r-- | nuttx/arch/arm/src/samv7/sam_usbdevhs.c | 37 |
2 files changed, 40 insertions, 7 deletions
diff --git a/nuttx/arch/arm/include/samv7/samv71_irq.h b/nuttx/arch/arm/include/samv7/samv71_irq.h index 221985679..34d9ab0c4 100644 --- a/nuttx/arch/arm/include/samv7/samv71_irq.h +++ b/nuttx/arch/arm/include/samv7/samv71_irq.h @@ -115,8 +115,12 @@ #define SAM_PID_SDRAMC (62) /* SDRAM Controller */ #define SAM_PID_WDT1 (63) /* Watchdog Timer 1 */ #define SAM_PID_CCW (64) /* ARM Cache ECC Warning */ +#define SAM_PID_CCF (65) /* ARM Cache ECC Fault */ +#define SAM_PID_EMACQ1 (66) /* EMAC Queue 1 Interrupt */ +#define SAM_PID_EMACQ2 (67) /* EMAC Queue 2 Interrupt */ +#define SAM_PID_FPIXC (68) /* ARM Cache ECC Warning */ -#define NR_PIDS (65) /* Number of peripheral identifiers */ +#define NR_PIDS (69) /* Number of peripheral identifiers */ /* External interrupts (priority levels >= 256*/ @@ -185,6 +189,10 @@ #define SAM_IRQ_SDRAMC (SAM_IRQ_EXTINT+SAM_PID_SDRAMC) /* SDRAM Controller */ #define SAM_IRQ_WDT1 (SAM_IRQ_EXTINT+SAM_PID_WDT1) /* Watchdog Timer 1 */ #define SAM_IRQ_CCW (SAM_IRQ_EXTINT+SAM_PID_CCW) /* ARM Cache ECC Warning */ +#define SAM_IRQ_CCF (SAM_IRQ_EXTINT+SAM_PID_CCF) /* ARM Cache ECC Fault */ +#define SAM_IRQ_EMACQ1 (SAM_IRQ_EXTINT+SAM_PID_EMACQ1) /* EMAC Queue 1 Interrupt */ +#define SAM_IRQ_EMACQ2 (SAM_IRQ_EXTINT+SAM_PID_EMACQ2) /* EMAC Queue 2 Interrupt */ +#define SAM_IRQ_FPIXC (SAM_IRQ_EXTINTSAM_PID_FPIXC+) /* ARM Cache ECC Warning */ #define SAM_IRQ_NEXTINT NR_PIDS /* Total number of external interrupt numbers */ #define SAM_IRQ_NIRQS (SAM_IRQ_EXTINT+NR_PIDS) /* The number of real IRQs */ diff --git a/nuttx/arch/arm/src/samv7/sam_usbdevhs.c b/nuttx/arch/arm/src/samv7/sam_usbdevhs.c index c71e11d43..7dc7c9a1b 100644 --- a/nuttx/arch/arm/src/samv7/sam_usbdevhs.c +++ b/nuttx/arch/arm/src/samv7/sam_usbdevhs.c @@ -4176,10 +4176,34 @@ static int sam_pullup(FAR struct usbdev_s *dev, bool enable) * connections. * * If there is no host connected (no bus activity), then we might - * get a SUSPend interrupt instead of a End of Reset. + * get a SUSPend interrupt instead of a End of Reset. In the case, we + * would like to keep the clock frozen until the host is connected. + * + * The strategy here was taken from the SAMV7 sample code: It will + * force a SUSPend event. Then disable clocking. We will take the + * SUSPend interrupt (because it is already pending), but after the + * clock is frozen, only a WAKEUP interrupt can be received. */ - sam_putreg(USBHS_DEVINT_EORST | USBHS_DEVINT_SUSPD, SAM_USBHS_DEVIER); + /* Enable expected interrupts */ + + sam_putreg(USBHS_DEVINT_EORST | USBHS_DEVINT_WAKEUP | USBHS_DEVINT_SUSPD, + SAM_USBHS_DEVIER); + + /* Clear pending interrupt interrupts */ + + sam_putreg(USBHS_DEVINT_EORST | USBHS_DEVINT_SUSPD, SAM_USBHS_DEVICR); + + /* Force the first suspend event */ + + sam_putreg(USBHS_DEVINT_SUSPD, SAM_USBHS_DEVIFR); + sam_putreg(USBHS_DEVINT_WAKEUP, SAM_USBHS_DEVICR); + + /* Refreeze the clock and wait for the wakeup event */ + + regval = sam_getreg(SAM_USBHS_CTRL); + regval |= USBHS_CTRL_FRZCLK; + sam_putreg(regval, SAM_USBHS_CTRL); } else { @@ -4333,15 +4357,15 @@ static void sam_hw_setup(struct sam_usbdev_s *priv) * unfreeze clocking (FRZCLK = 0) */ - regval &= ~USBHS_CTRL_FRZCLK; - sam_putreg(regval, SAM_USBHS_CTRL); - regval |= USBHS_CTRL_USBE; sam_putreg(regval, SAM_USBHS_CTRL); regval |= USBHS_CTRL_UIMOD_DEVICE; sam_putreg(regval, SAM_USBHS_CTRL); + regval &= ~USBHS_CTRL_FRZCLK; + sam_putreg(regval, SAM_USBHS_CTRL); + /* Select High Speed */ regval = sam_getreg(SAM_USBHS_DEVCTRL); @@ -4359,9 +4383,10 @@ static void sam_hw_setup(struct sam_usbdev_s *priv) regval &= ~USBHS_DEVCTRL_LS; sam_putreg(regval, SAM_USBHS_DEVCTRL); - /* Reset and disable all endpoints (including endpoint 0) */ + /* Reset and disable all endpoints, initializing endpoint 0. */ sam_epset_reset(priv, SAM_EPSET_ALL); + sam_ep0_configure(priv); /* Disconnect the device */ |