diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-05-27 15:15:57 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-05-27 15:15:57 +0000 |
commit | 22f5d323fa5ffcea62a3fd3658ae1412c0f7445a (patch) | |
tree | 38b0f258ebf22e8f6d25a209c3b06f7e3aeda991 | |
parent | 1caf0a84f85f55d2d34066797cd46ecea8c7627e (diff) | |
download | px4-nuttx-22f5d323fa5ffcea62a3fd3658ae1412c0f7445a.tar.gz px4-nuttx-22f5d323fa5ffcea62a3fd3658ae1412c0f7445a.tar.bz2 px4-nuttx-22f5d323fa5ffcea62a3fd3658ae1412c0f7445a.zip |
STM32 OTG FS device: Don't process TXFE^Cf we have already processed an XFRC interrupt.
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4775 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r-- | nuttx/ChangeLog | 3 | ||||
-rwxr-xr-x | nuttx/arch/arm/src/stm32/stm32_otgfsdev.c | 32 |
2 files changed, 32 insertions, 3 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index 129f60488..88f579f8b 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -2817,3 +2817,6 @@ packets. It was not using the maximum request size, but instead the previous request size. As a result, packets get smaller, and smaller, and ... This is an important USB serial fix. + * arch/arc/src/stm32_otgfsdev.c: Bug fix: Don't process TXFE if we have + already processed an XFRC interrupt. We have already done what needs + to done in that case.
\ No newline at end of file diff --git a/nuttx/arch/arm/src/stm32/stm32_otgfsdev.c b/nuttx/arch/arm/src/stm32/stm32_otgfsdev.c index d07d06c79..c2d1aab5a 100755 --- a/nuttx/arch/arm/src/stm32/stm32_otgfsdev.c +++ b/nuttx/arch/arm/src/stm32/stm32_otgfsdev.c @@ -2622,7 +2622,7 @@ static inline void stm32_epin(FAR struct stm32_usbdev_s *priv, uint8_t epno) else if (priv->devstate == DEVSTATE_CONFIGURED) { - /* Continue processing data from the EP0 OUT request queue */ + /* Continue processing data from the endpoint write request queue */ stm32_epin_request(priv, privep); } @@ -2716,11 +2716,16 @@ static inline void stm32_epin_interrupt(FAR struct stm32_usbdev_s *priv) { usbtrace(TRACE_INTDECODE(STM32_TRACEINTID_EPIN_XFRC), (uint16_t)diepint); + /* It is possible that logic may be waiting for a the TxFIFO to become + * empty. We disable the TxFIFO empty interrupt here; it will be + * re-enabled if there is still insufficient space in the TxFIFO. + */ + empty &= ~OTGFS_DIEPEMPMSK(epno); stm32_putreg(empty, STM32_OTGFS_DIEPEMPMSK); stm32_putreg(OTGFS_DIEPINT_XFRC, STM32_OTGFS_DIEPINT(epno)); - /* IN complete */ + /* IN transfer complete */ stm32_epin(priv, epno); } @@ -2772,7 +2777,28 @@ static inline void stm32_epin_interrupt(FAR struct stm32_usbdev_s *priv) if ((diepint & OTGFS_DIEPINT_TXFE) != 0) { usbtrace(TRACE_INTDECODE(STM32_TRACEINTID_EPIN_TXFE), (uint16_t)diepint); - stm32_epin_txfifoempty(priv, epno); + + /* If we were waiting for TxFIFO to become empty, the we might have both + * XFRC and TXFE interrups pending. Since we do the same thing for both + * cases, ignore the TXFE if we have already processed the XFRC. + */ + + if ((diepint & OTGFS_DIEPINT_XFRC) == 0) + { + /* Mask further FIFO empty interrupts. This will be re-enabled + * whenever we need to wait for a FIFO event. + */ + + empty &= ~OTGFS_DIEPEMPMSK(epno); + stm32_putreg(empty, STM32_OTGFS_DIEPEMPMSK); + + /* Handle TxFIFO empty */ + + stm32_epin_txfifoempty(priv, epno); + } + + /* Clear the pending TxFIFO empty interrupt */ + stm32_putreg(OTGFS_DIEPINT_TXFE, STM32_OTGFS_DIEPINT(epno)); } } |