From c41819ee0fa00a0741388d2b02edb370a1360a30 Mon Sep 17 00:00:00 2001 From: patacongo Date: Fri, 16 Dec 2011 16:17:34 +0000 Subject: Add generic, upper-half PWM driver git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4191 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/arch/arm/src/lpc17xx/lpc17_adc.c | 182 ++++++++++++++-------------- nuttx/arch/arm/src/lpc17xx/lpc17_internal.h | 15 +++ nuttx/arch/arm/src/stm32/stm32_adc.c | 12 +- nuttx/arch/arm/src/stm32/stm32f10xxx_rcc.c | 2 +- 4 files changed, 113 insertions(+), 98 deletions(-) (limited to 'nuttx/arch/arm/src') diff --git a/nuttx/arch/arm/src/lpc17xx/lpc17_adc.c b/nuttx/arch/arm/src/lpc17xx/lpc17_adc.c index e2c328677..e9e48a57e 100644 --- a/nuttx/arch/arm/src/lpc17xx/lpc17_adc.c +++ b/nuttx/arch/arm/src/lpc17xx/lpc17_adc.c @@ -83,11 +83,11 @@ struct up_dev_s { - uint8_t mask; - uint32_t sps; - int irq; - int32_t buf[8]; - uint8_t count[8]; + uint8_t mask; + uint32_t sps; + int irq; + int32_t buf[8]; + uint8_t count[8]; }; /**************************************************************************** @@ -109,24 +109,24 @@ static int adc_interrupt(int irq, void *context); static const struct adc_ops_s g_adcops = { - .ao_reset =adc_reset, - .ao_setup = adc_setup, - .ao_shutdown = adc_shutdown, - .ao_rxint = adc_rxint, - .ao_ioctl = adc_ioctl, + .ao_reset =adc_reset, + .ao_setup = adc_setup, + .ao_shutdown = adc_shutdown, + .ao_rxint = adc_rxint, + .ao_ioctl = adc_ioctl, }; static struct up_dev_s g_adcpriv = { - .sps = CONFIG_ADC0_SPS, - .mask = CONFIG_ADC0_MASK, - .irq = LPC17_IRQ_ADC, + .sps = CONFIG_ADC0_SPS, + .mask = CONFIG_ADC0_MASK, + .irq = LPC17_IRQ_ADC, }; static struct adc_dev_s g_adcdev = { - .ad_ops = &g_adcops, - .ad_priv= &g_adcpriv, + .ad_ops = &g_adcops, + .ad_priv= &g_adcpriv, }; /**************************************************************************** @@ -139,46 +139,46 @@ static struct adc_dev_s g_adcdev = static void adc_reset(FAR struct adc_dev_s *dev) { - irqstate_t flags; - uint32_t regval; - FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->ad_priv; - - flags = irqsave(); - - regval = getreg32(LPC17_SYSCON_PCONP); - regval |= SYSCON_PCONP_PCADC; - putreg32(regval, LPC17_SYSCON_PCONP); - - putreg32(ADC_CR_PDN,LPC17_ADC_CR); - - regval = getreg32(LPC17_SYSCON_PCLKSEL0); - regval &= ~SYSCON_PCLKSEL0_ADC_MASK; - regval |= (SYSCON_PCLKSEL_CCLK8 << SYSCON_PCLKSEL0_ADC_SHIFT); - putreg32(regval, LPC17_SYSCON_PCLKSEL0); - - uint32_t clkdiv=LPC17_CCLK/8/65/priv->sps; - clkdiv<<=8; - clkdiv&=0xff00; - putreg32(ADC_CR_PDN|ADC_CR_BURST|clkdiv|priv->mask,LPC17_ADC_CR); - - if(priv->mask&0x01) - lpc17_configgpio(GPIO_AD0p0); - else if(priv->mask&0x02) - lpc17_configgpio(GPIO_AD0p1); - else if(priv->mask&0x04) - lpc17_configgpio(GPIO_AD0p2); - else if(priv->mask&0x08) - lpc17_configgpio(GPIO_AD0p3); - else if(priv->mask&0x10) - lpc17_configgpio(GPIO_AD0p4); - else if(priv->mask&0x20) - lpc17_configgpio(GPIO_AD0p5); - else if(priv->mask&0x40) - lpc17_configgpio(GPIO_AD0p6); - else if(priv->mask&0x80) - lpc17_configgpio(GPIO_AD0p7); + irqstate_t flags; + uint32_t regval; + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->ad_priv; + + flags = irqsave(); + + regval = getreg32(LPC17_SYSCON_PCONP); + regval |= SYSCON_PCONP_PCADC; + putreg32(regval, LPC17_SYSCON_PCONP); + + putreg32(ADC_CR_PDN,LPC17_ADC_CR); + + regval = getreg32(LPC17_SYSCON_PCLKSEL0); + regval &= ~SYSCON_PCLKSEL0_ADC_MASK; + regval |= (SYSCON_PCLKSEL_CCLK8 << SYSCON_PCLKSEL0_ADC_SHIFT); + putreg32(regval, LPC17_SYSCON_PCLKSEL0); + + uint32_t clkdiv=LPC17_CCLK/8/65/priv->sps; + clkdiv<<=8; + clkdiv&=0xff00; + putreg32(ADC_CR_PDN|ADC_CR_BURST|clkdiv|priv->mask,LPC17_ADC_CR); + + if(priv->mask&0x01) + lpc17_configgpio(GPIO_AD0p0); + else if(priv->mask&0x02) + lpc17_configgpio(GPIO_AD0p1); + else if(priv->mask&0x04) + lpc17_configgpio(GPIO_AD0p2); + else if(priv->mask&0x08) + lpc17_configgpio(GPIO_AD0p3); + else if(priv->mask&0x10) + lpc17_configgpio(GPIO_AD0p4); + else if(priv->mask&0x20) + lpc17_configgpio(GPIO_AD0p5); + else if(priv->mask&0x40) + lpc17_configgpio(GPIO_AD0p6); + else if(priv->mask&0x80) + lpc17_configgpio(GPIO_AD0p7); - irqrestore(flags); + irqrestore(flags); } /* Configure the ADC. This method is called the first time that the ADC @@ -189,19 +189,19 @@ static void adc_reset(FAR struct adc_dev_s *dev) static int adc_setup(FAR struct adc_dev_s *dev) { - int i; - FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->ad_priv; - int ret = irq_attach(priv->irq, adc_interrupt); - if (ret == OK) + int i; + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->ad_priv; + int ret = irq_attach(priv->irq, adc_interrupt); + if (ret == OK) { - for(i=0;i<8;i++) + for (i = 0; i < 8; i++) { - priv->buf[i]=0; - priv->count[i]=0; + priv->buf[i]=0; + priv->count[i]=0; } - up_enable_irq(priv->irq); + up_enable_irq(priv->irq); } - return ret; + return ret; } /* Disable the ADC. This method is called when the ADC device is closed. @@ -210,50 +210,50 @@ static int adc_setup(FAR struct adc_dev_s *dev) static void adc_shutdown(FAR struct adc_dev_s *dev) { - FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->ad_priv; - up_disable_irq(priv->irq); - irq_detach(priv->irq); + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->ad_priv; + up_disable_irq(priv->irq); + irq_detach(priv->irq); } /* Call to enable or disable RX interrupts */ static void adc_rxint(FAR struct adc_dev_s *dev, bool enable) { - FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->ad_priv; - if (enable) - putreg32(ADC_INTEN_GLOBAL,LPC17_ADC_INTEN); - else - putreg32(0x00,LPC17_ADC_INTEN); + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)dev->ad_priv; + if (enable) + putreg32(ADC_INTEN_GLOBAL, LPC17_ADC_INTEN); + else + putreg32(0x00, LPC17_ADC_INTEN); } /* All ioctl calls will be routed through this method */ static int adc_ioctl(FAR struct adc_dev_s *dev, int cmd, unsigned long arg) { - dbg("Fix me:Not Implemented\n"); - return 0; + dbg("Fix me:Not Implemented\n"); + return 0; } static int adc_interrupt(int irq, void *context) { - uint32_t regval; - FAR struct up_dev_s *priv = (FAR struct up_dev_s *)g_adcdev.ad_priv; - unsigned char ch; - int32_t value; + uint32_t regval; + FAR struct up_dev_s *priv = (FAR struct up_dev_s *)g_adcdev.ad_priv; + unsigned char ch; + int32_t value; - regval=getreg32(LPC17_ADC_GDR); - ch=(regval>>24)&0x07; - priv->buf[ch]+=regval&0xfff0; - priv->count[ch]++; - if(priv->count[ch]>=CONFIG_ADC0_AVERAGE) + regval = getreg32(LPC17_ADC_GDR); + ch = (regval >> 24) & 0x07; + priv->buf[ch] += regval & 0xfff0; + priv->count[ch]++; + if (priv->count[ch] >= CONFIG_ADC0_AVERAGE) { - value=priv->buf[ch]/priv->count[ch]; - value<<=15; - adc_receive(&g_adcdev,ch,value); - priv->buf[ch]=0; - priv->count[ch]=0; + value = priv->buf[ch] / priv->count[ch]; + value <<= 15; + adc_receive(&g_adcdev,ch,value); + priv->buf[ch] = 0; + priv->count[ch] = 0; } - return OK; + return OK; } /**************************************************************************** @@ -261,7 +261,7 @@ static int adc_interrupt(int irq, void *context) ****************************************************************************/ /**************************************************************************** - * Name: up_adcinitialize + * Name: stm32_adcinitialize * * Description: * Initialize the adc @@ -271,9 +271,9 @@ static int adc_interrupt(int irq, void *context) * ****************************************************************************/ -FAR struct adc_dev_s *up_adcinitialize( ) +FAR struct adc_dev_s *stm32_adcinitialize(void) { - return &g_adcdev; + return &g_adcdev; } #endif diff --git a/nuttx/arch/arm/src/lpc17xx/lpc17_internal.h b/nuttx/arch/arm/src/lpc17xx/lpc17_internal.h index 107200e4d..c33ed21b2 100755 --- a/nuttx/arch/arm/src/lpc17xx/lpc17_internal.h +++ b/nuttx/arch/arm/src/lpc17xx/lpc17_internal.h @@ -756,6 +756,21 @@ EXTERN void lpc17_dmadump(DMA_HANDLE handle, const struct lpc17_dmaregs_s *regs, #endif #endif +/**************************************************************************** + * Name: stm32_adcinitialize + * + * Description: + * Initialize the adc + * + * Returned Value: + * Valid can device structure reference on succcess; a NULL on failure + * + ****************************************************************************/ + +#ifdef CONFIG_LPC17_ADC +FAR struct adc_dev_s *stm32_adcinitialize(void); +#endif + /**************************************************************************** * Name: lpc17_dacinitialize * diff --git a/nuttx/arch/arm/src/stm32/stm32_adc.c b/nuttx/arch/arm/src/stm32/stm32_adc.c index a3ccf15d9..b8eac533a 100644 --- a/nuttx/arch/arm/src/stm32/stm32_adc.c +++ b/nuttx/arch/arm/src/stm32/stm32_adc.c @@ -710,16 +710,16 @@ static int adc_interrupt(FAR struct adc_dev_s *dev) adc_receive(dev, priv->current, value); - /* Set the channel number of the next channel that will complete conversion */ + /* Set the channel number of the next channel that will complete conversion */ - if (++priv->current >= priv->nchannels) - { - /* Restart the conversion sequence from the beginning */ -#warning "Is there anything that you have to do to restart the conversion sequence?" + if (++priv->current >= priv->nchannels) + { + /* Restart the conversion sequence from the beginning */ +#warning "Missing logic" /* Reset the index to the first channel to be converted */ - priv->current = 0; + priv->current = 0; } } diff --git a/nuttx/arch/arm/src/stm32/stm32f10xxx_rcc.c b/nuttx/arch/arm/src/stm32/stm32f10xxx_rcc.c index 947150b9f..15aed029a 100644 --- a/nuttx/arch/arm/src/stm32/stm32f10xxx_rcc.c +++ b/nuttx/arch/arm/src/stm32/stm32f10xxx_rcc.c @@ -298,7 +298,7 @@ static inline void rcc_enableapb1(void) regval |= RCC_APB1ENR_PWREN; #endif -#if defined (CONFIG_STM32_DAC1) || defined(CONFIG_STM32_DAC2) +#if defined(CONFIG_STM32_DAC1) || defined(CONFIG_STM32_DAC2) /* DAC interface clock enable */ regval |= RCC_APB1ENR_DACEN; -- cgit v1.2.3