summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-04-16 09:42:07 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-04-16 09:42:07 -0600
commit4b00f70083a6e2bcfa99601afe6b0822924673d3 (patch)
treeb1ffa89d818b22569783076ca7b7cdfc5a555331
parent191590e73957b470ec5323d712f4055e1e442cdb (diff)
downloadnuttx-4b00f70083a6e2bcfa99601afe6b0822924673d3.tar.gz
nuttx-4b00f70083a6e2bcfa99601afe6b0822924673d3.tar.bz2
nuttx-4b00f70083a6e2bcfa99601afe6b0822924673d3.zip
SAMA5 ADC: If running from SDRAM, BOARD_MCK_FREQUENCY is not a constant and cannot be used in pre-processor conditionals
-rw-r--r--nuttx/ChangeLog4
-rw-r--r--nuttx/arch/arm/src/sama5/Kconfig2
-rw-r--r--nuttx/arch/arm/src/sama5/sam_adc.c59
-rw-r--r--nuttx/arch/arm/src/sama5/sam_clockconfig.h2
4 files changed, 46 insertions, 21 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index b82a9fec8..5f1146cfb 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -7171,3 +7171,7 @@
also reset the camera module. Noted by David Sidrane (2014-4-11).
* arch/arm/src/stm32/stm32_usbhost.c/.h and stm32_otgfshost.c: USB host
tracing added by Leo (2014-4-12).
+ * arch/arm/src/sama5/sam_adc.c: If running from SDRAM, then BOARD_MCK_FREQUENCY
+ is not a constand and cannot be used in condititional comilation
+ (2014-4-16).
+
diff --git a/nuttx/arch/arm/src/sama5/Kconfig b/nuttx/arch/arm/src/sama5/Kconfig
index f415b7bf3..0cf19458e 100644
--- a/nuttx/arch/arm/src/sama5/Kconfig
+++ b/nuttx/arch/arm/src/sama5/Kconfig
@@ -217,7 +217,7 @@ config SAMA5_PWM
select PWM
config SAMA5_ADC
- bool "Touch Screen ADC Controller (ADC)"
+ bool "Touch Screen / ADC Controller (ADC)"
default n
select ANALOG
select ADC
diff --git a/nuttx/arch/arm/src/sama5/sam_adc.c b/nuttx/arch/arm/src/sama5/sam_adc.c
index 9ef5a3d5d..a1c65fa33 100644
--- a/nuttx/arch/arm/src/sama5/sam_adc.c
+++ b/nuttx/arch/arm/src/sama5/sam_adc.c
@@ -370,24 +370,6 @@
#define SAMA5_ADC_SAMPLES (CONFIG_SAMA5_ADC_DMASAMPLES * SAMA5_NCHANNELS)
-/* Clocking */
-
-#if BOARD_MCK_FREQUENCY <= SAM_ADC_MAXPERCLK
-# define ADC_FREQUENCY BOARD_MCK_FREQUENCY
-# define ADC_PCR_DIV PMC_PCR_DIV1
-#elif (BOARD_MCK_FREQUENCY >> 1) <= SAM_ADC_MAXPERCLK
-# define ADC_FREQUENCY (BOARD_MCK_FREQUENCY >> 1)
-# define ADC_PCR_DIV PMC_PCR_DIV2
-#elif (BOARD_MCK_FREQUENCY >> 2) <= SAM_ADC_MAXPERCLK
-# define ADC_FREQUENCY (BOARD_MCK_FREQUENCY >> 2)
-# define ADC_PCR_DIV PMC_PCR_DIV4
-#elif (BOARD_MCK_FREQUENCY >> 3) <= SAM_ADC_MAXPERCLK
-# define ADC_FREQUENCY (BOARD_MCK_FREQUENCY >> 3)
-# define ADC_PCR_DIV PMC_PCR_DIV8
-#else
-# error Cannot realize ADC input frequency
-#endif
-
/****************************************************************************
* Private Types
****************************************************************************/
@@ -398,6 +380,7 @@ struct sam_adc_s
{
sem_t exclsem; /* Supports exclusive access to the ADC interface */
bool initialized; /* The ADC driver is already initialized */
+ uint32_t frequency; /* ADC clock frequency */
#ifdef SAMA5_ADC_HAVE_CHANNELS
#ifdef CONFIG_SAMA5_ADC_DMA
@@ -701,6 +684,7 @@ static void sam_adc_dmadone(void *arg)
*
****************************************************************************/
+#ifdef CONFIG_SAMA5_ADC_DMA
static void sam_adc_dmastart(struct sam_adc_s *priv)
{
/* Make sure that the worker is available and that DMA is not disabled */
@@ -712,6 +696,7 @@ static void sam_adc_dmastart(struct sam_adc_s *priv)
SAMA5_ADC_SAMPLES * sizeof(uint16_t));
}
}
+#endif
/****************************************************************************
* Name: sam_adc_dmacallback
@@ -980,7 +965,9 @@ static int sam_adc_interrupt(int irq, void *context)
static void sam_adc_reset(struct adc_dev_s *dev)
{
+#ifdef CONFIG_SAMA5_ADC_DMA
struct sam_adc_s *priv = (struct sam_adc_s *)dev->ad_priv;
+#endif
uint32_t regval;
avdbg("Resetting..\n");
@@ -1120,7 +1107,9 @@ static int sam_adc_setup(struct adc_dev_s *dev)
static void sam_adc_shutdown(struct adc_dev_s *dev)
{
+#ifdef CONFIG_SAMA5_ADC_DMA
struct sam_adc_s *priv = (struct sam_adc_s *)dev->ad_priv;
+#endif
avdbg("Shutdown\n");
@@ -1147,7 +1136,9 @@ static void sam_adc_shutdown(struct adc_dev_s *dev)
static void sam_adc_rxint(struct adc_dev_s *dev, bool enable)
{
+#ifdef CONFIG_SAMA5_ADC_DMA
struct sam_adc_s *priv = (struct sam_adc_s *)dev->ad_priv;
+#endif
avdbg("enable=%d\n", enable);
@@ -1916,6 +1907,7 @@ struct adc_dev_s *sam_adc_initialize(void)
{
struct sam_adc_s *priv = &g_adcpriv;
uint32_t regval;
+ uint32_t mck;
int ret;
/* Have we already been initialzed? If yes, than just hand out the
@@ -1990,9 +1982,38 @@ struct adc_dev_s *sam_adc_initialize(void)
DEBUGASSERT(priv->dma);
#endif
+ /* Determine the maximum ADC peripheral clock frequency */
+
+ mck = BOARD_MCK_FREQUENCY;
+ if (mck <= SAM_ADC_MAXPERCLK)
+ {
+ priv->frequency = mck;
+ regval = PMC_PCR_DIV1;
+ }
+ else if ((mck >> 1) <= SAM_ADC_MAXPERCLK)
+ {
+ priv->frequency = (mck >> 1);
+ regval = PMC_PCR_DIV2;
+ }
+ else if ((mck >> 2) <= SAM_ADC_MAXPERCLK)
+ {
+ priv->frequency = (mck >> 2);
+ regval = PMC_PCR_DIV4;
+ }
+ else if ((mck >> 3) <= SAM_ADC_MAXPERCLK)
+ {
+ priv->frequency = (mck >> 3);
+ regval = PMC_PCR_DIV8;
+ }
+ else
+ {
+ adbg("ERROR: Cannot realize ADC input frequency\n");
+ return NULL;
+ }
+
/* Set the maximum ADC peripheral clock frequency */
- regval = PMC_PCR_PID(SAM_PID_ADC) | PMC_PCR_CMD | ADC_PCR_DIV | PMC_PCR_EN;
+ regval |= PMC_PCR_PID(SAM_PID_ADC) | PMC_PCR_CMD | PMC_PCR_EN;
sam_adc_putreg(priv, SAM_PMC_PCR, regval);
/* Enable the ADC peripheral clock*/
diff --git a/nuttx/arch/arm/src/sama5/sam_clockconfig.h b/nuttx/arch/arm/src/sama5/sam_clockconfig.h
index 6089359d9..660d442d7 100644
--- a/nuttx/arch/arm/src/sama5/sam_clockconfig.h
+++ b/nuttx/arch/arm/src/sama5/sam_clockconfig.h
@@ -83,7 +83,7 @@ extern "C"
*
****************************************************************************/
-void sam_clockconfig(void);
+void __ramfunc__ sam_clockconfig(void);
/****************************************************************************
* Name: board_norflash_config