summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/stm32
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-12-17 16:45:40 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-12-17 16:45:40 +0000
commit5101245355c24f5c3921d929977bcbae59ec9675 (patch)
tree4306a20348e53aaeedc2970f1a2da40960d19f50 /nuttx/arch/arm/src/stm32
parent92fa94abca72e56d10118754de5c419f392d6d5f (diff)
downloadpx4-nuttx-5101245355c24f5c3921d929977bcbae59ec9675.tar.gz
px4-nuttx-5101245355c24f5c3921d929977bcbae59ec9675.tar.bz2
px4-nuttx-5101245355c24f5c3921d929977bcbae59ec9675.zip
Fix some bad SDIO debug instrumentation
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4195 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/stm32')
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_adc.c37
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_sdio.c21
2 files changed, 34 insertions, 24 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_adc.c b/nuttx/arch/arm/src/stm32/stm32_adc.c
index 283b8c59b..34461349d 100644
--- a/nuttx/arch/arm/src/stm32/stm32_adc.c
+++ b/nuttx/arch/arm/src/stm32/stm32_adc.c
@@ -350,14 +350,22 @@ static void tim_putreg(struct stm32_dev_s *priv, int offset, uint32_t value)
static int adc_timinit(FAR struct stm32_dev_s *priv)
{
uint32_t regval;
-
- /* Configure the time base: Timer period, prescaler, clock division,
- * counter mode (up).
- *
- * EXTTRIG: External Trigger Conversion mode for regular channels
+
+ /* If the timer base address is zero, then this ADC was not configured to
+ * use a timer.
*/
+
+ if (!priv->tbase)
+ {
+#warning "Does anything need to be configured if there is no timer for this ADC?"
+ return OK;
+ }
+
+ /* Configure the ADC to use the selected timer and timer channel as the trigger */
+
+ /* EXTTRIG: External Trigger Conversion mode for regular channels */
- regval = tim_getreg(priv, STM32_ADC_CR2_OFFSET)
+ regval = adc_getreg(priv, STM32_ADC_CR2_OFFSET)
regval |= ADC_CR2_EXTTRIG;
/* EXTSEL selection: These bits select the external event used to trigger
@@ -371,11 +379,10 @@ static int adc_timinit(FAR struct stm32_dev_s *priv)
regval &= ~ADC_CR2_EXTSEL_MASK;
regval |= priv->extsel;
- tim_putreg(priv, STM32_ADC_CR2_OFFSET, regval);
-
- /* ADC Prescaler (ADCPRE) selection: Set and cleared by software to select
- * the frequency of the clock to the ADCs.
- */
+ adc_putreg(priv, STM32_ADC_CR2_OFFSET, regval);
+
+ /* Configure the timer channel to drive the ADC */
+#warning "LOTS of missing timer setup logic"
regval = priv->presc;
@@ -399,13 +406,7 @@ static int adc_timinit(FAR struct stm32_dev_s *priv)
tim_putreg(priv, STM32_BTIM_PSC_OFFSET, regval);
-#if 0 // What is this?
- regval = getreg32(STM32_RCC_CFGR);
- regval |= presc << RCC_CFGR_ADCPRE_SHIFT;
- putreg32(regval, STM32_RCC_CFGR);
-#endif
-
- /* Enable the counter */
+ /* Enable the timer counter */
regval = stm32_tim_getreg(priv, STM32_BTIM_CR1_OFFSET);
regval |= ATIM_CR1_CEN;
diff --git a/nuttx/arch/arm/src/stm32/stm32_sdio.c b/nuttx/arch/arm/src/stm32/stm32_sdio.c
index 0830afb4f..e08bcb307 100644
--- a/nuttx/arch/arm/src/stm32/stm32_sdio.c
+++ b/nuttx/arch/arm/src/stm32/stm32_sdio.c
@@ -1006,8 +1006,9 @@ static void stm32_eventtimeout(int argc, uint32_t arg)
{
struct stm32_dev_s *priv = (struct stm32_dev_s *)arg;
- DEBUGASSERT(argc == 1 && priv != NULL);
- DEBUGASSERT((priv->waitevents & SDIOWAIT_TIMEOUT) != 0);
+ /* There is always race conditions with timer expirations. */
+
+ DEBUGASSERT((priv->waitevents & SDIOWAIT_TIMEOUT) != 0 || priv->wkupevent != 0);
/* Is a data transfer complete event expected? */
@@ -2162,6 +2163,7 @@ static sdio_eventset_t stm32_eventwait(FAR struct sdio_dev_s *dev,
{
struct stm32_dev_s *priv = (struct stm32_dev_s*)dev;
sdio_eventset_t wkupevent = 0;
+ irqstate_t flags;
int ret;
/* There is a race condition here... the event may have completed before
@@ -2169,8 +2171,8 @@ static sdio_eventset_t stm32_eventwait(FAR struct sdio_dev_s *dev,
* be non-zero (and, hopefully, the semaphore count will also be non-zero.
*/
- DEBUGASSERT((priv->waitevents != 0 && priv->wkupevent == 0) ||
- (priv->waitevents == 0 && priv->wkupevent != 0));
+ flags = irqsave();
+ DEBUGASSERT(priv->waitevents != 0 || priv->wkupevent != 0);
/* Check if the timeout event is specified in the event set */
@@ -2178,11 +2180,16 @@ static sdio_eventset_t stm32_eventwait(FAR struct sdio_dev_s *dev,
{
int delay;
- /* Yes.. Handle a cornercase */
+ /* Yes.. Handle a cornercase: The user request a timeout event but
+ * with timeout == 0?
+ */
if (!timeout)
{
- return SDIOWAIT_TIMEOUT;
+ /* Then just tell the caller that we already timed out */
+
+ wkupevent = SDIOWAIT_TIMEOUT;
+ goto errout;
}
/* Start the watchdog timer */
@@ -2231,6 +2238,8 @@ static sdio_eventset_t stm32_eventwait(FAR struct sdio_dev_s *dev,
priv->xfrflags = 0;
#endif
+errout:
+ irqrestore(flags);
return wkupevent;
}