Adds low level operations to start and stop DMA.
This commit is contained in:
parent
8014f51cc1
commit
e45e932a8a
@ -328,7 +328,11 @@ static int adc_llops_offset_set(struct stm32_adc_dev_s *dev,
|
||||
uint8_t ch, uint8_t i, uint16_t offset);
|
||||
# ifdef ADC_HAVE_DMA
|
||||
static int adc_regbufregister(struct stm32_adc_dev_s *dev,
|
||||
uint16_t *buffer, uint8_t len);
|
||||
uint16_t *buffer, uint16_t len);
|
||||
static void adc_llops_dma_start(struct stm32_adc_dev_s *adc,
|
||||
dma_callback_t callback,
|
||||
uint16_t *buffer, uint16_t len);
|
||||
static void adc_llops_dma_stop(struct stm32_adc_dev_s *adc);
|
||||
# endif
|
||||
# ifdef ADC_HAVE_EXTCFG
|
||||
static int adc_llops_extsel_set(struct stm32_adc_dev_s *dev,
|
||||
@ -397,9 +401,6 @@ static const struct stm32_adc_ops_s g_adc_llops =
|
||||
.val_get = adc_llops_regget,
|
||||
.reg_startconv = adc_llops_startconv,
|
||||
.offset_set = adc_llops_offset_set,
|
||||
# ifdef ADC_HAVE_DMA
|
||||
.regbuf_reg = adc_regbufregister,
|
||||
# endif
|
||||
# ifdef ADC_HAVE_INJECTED
|
||||
.inj_get = adc_llops_injget,
|
||||
.inj_startconv = adc_llops_inj_startconv,
|
||||
@ -409,6 +410,11 @@ static const struct stm32_adc_ops_s g_adc_llops =
|
||||
# endif
|
||||
# ifdef ADC_HAVE_JEXTCFG
|
||||
.jextsel_set = adc_llops_jextsel_set,
|
||||
# endif
|
||||
# ifdef ADC_HAVE_DMA
|
||||
.regbuf_reg = adc_regbufregister,
|
||||
.dma_start = adc_llops_dma_start,
|
||||
.dma_stop = adc_llops_dma_stop,
|
||||
# endif
|
||||
.dump_regs = adc_llops_dumpregs
|
||||
};
|
||||
@ -2520,7 +2526,7 @@ static void adc_llops_jextsel_set(struct stm32_adc_dev_s *dev,
|
||||
|
||||
#ifdef ADC_HAVE_DMA
|
||||
static int adc_regbufregister(struct stm32_adc_dev_s *dev,
|
||||
uint16_t *buffer, uint8_t len)
|
||||
uint16_t *buffer, uint16_t len)
|
||||
{
|
||||
struct stm32_dev_s *priv = (struct stm32_dev_s *)dev;
|
||||
|
||||
@ -2536,6 +2542,53 @@ static int adc_regbufregister(struct stm32_adc_dev_s *dev,
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: adc_llops_dma_start
|
||||
****************************************************************************/
|
||||
|
||||
static void adc_llops_dma_start(struct stm32_adc_dev_s *adc,
|
||||
dma_callback_t callback,
|
||||
uint16_t *buffer, uint16_t len)
|
||||
{
|
||||
struct stm32_dev_s *dev = (struct stm32_dev_s *)adc;
|
||||
|
||||
/* Stop and free DMA if it was started before */
|
||||
|
||||
if (dev->dma != NULL)
|
||||
{
|
||||
stm32l4_dmastop(dev->dma);
|
||||
stm32l4_dmafree(dev->dma);
|
||||
}
|
||||
|
||||
dev->dma = stm32l4_dmachannel(dev->dmachan);
|
||||
|
||||
stm32l4_dmasetup(dev->dma,
|
||||
dev->base + STM32L4_ADC_DR_OFFSET,
|
||||
(uint32_t)buffer,
|
||||
len,
|
||||
ADC_DMA_CONTROL_WORD);
|
||||
|
||||
stm32l4_dmastart(dev->dma, callback, dev, false);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: adc_llops_dma_stop
|
||||
****************************************************************************/
|
||||
|
||||
static void adc_llops_dma_stop(struct stm32_adc_dev_s *adc)
|
||||
{
|
||||
struct stm32_dev_s *dev = (struct stm32_dev_s *)adc;
|
||||
|
||||
/* Stop and free DMA */
|
||||
|
||||
if (dev->dma != NULL)
|
||||
{
|
||||
stm32l4_dmastop(dev->dma);
|
||||
stm32l4_dmafree(dev->dma);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* ADC_HAVE_DMA */
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <nuttx/analog/adc.h>
|
||||
#include "chip.h"
|
||||
#include "hardware/stm32l4_adc.h"
|
||||
#include "stm32l4_dma.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
@ -458,8 +459,6 @@
|
||||
(adc)->llops->val_get(adc)
|
||||
#define ADC_INJDATA_GET(adc, chan) \
|
||||
(adc)->llops->inj_get(adc, chan)
|
||||
#define ADC_REGBUF_REGISTER(adc, buffer, len) \
|
||||
(adc)->llops->regbuf_reg(adc, buffer, len)
|
||||
#define ADC_REG_STARTCONV(adc, state) \
|
||||
(adc)->llops->reg_startconv(adc, state)
|
||||
#define ADC_INJ_STARTCONV(adc, state) \
|
||||
@ -471,6 +470,15 @@
|
||||
#define ADC_DUMP_REGS(adc) \
|
||||
(adc)->llops->dump_regs(adc)
|
||||
|
||||
#ifdef ADC_HAVE_DMA
|
||||
# define ADC_REGBUF_REGISTER(adc, buffer, len) \
|
||||
(adc)->llops->regbuf_reg(adc, buffer, len)
|
||||
# define ADC_DMA_START(adc, cb, buf, len) \
|
||||
(adc)->llops->dma_start(adc, cb, buf, len)
|
||||
# define ADC_DMA_STOP(adc) \
|
||||
(adc)->llops->dma_stop(adc)
|
||||
#endif
|
||||
|
||||
/* IOCTL Commands ***********************************************************
|
||||
*
|
||||
* Cmd: ANIOC_STM32L4_TRIGGER_REG Arg:
|
||||
@ -524,11 +532,6 @@ struct stm32_adc_ops_s
|
||||
|
||||
uint32_t (*val_get)(struct stm32_adc_dev_s *dev);
|
||||
|
||||
/* Register buffer for ADC DMA transfer */
|
||||
|
||||
int (*regbuf_reg)(struct stm32_adc_dev_s *dev, uint16_t *buffer,
|
||||
uint8_t len);
|
||||
|
||||
/* Start/stop regular conversion */
|
||||
|
||||
void (*reg_startconv)(struct stm32_adc_dev_s *dev, bool state);
|
||||
@ -558,6 +561,22 @@ struct stm32_adc_ops_s
|
||||
void (*inj_startconv)(struct stm32_adc_dev_s *dev, bool state);
|
||||
#endif
|
||||
|
||||
#ifdef ADC_HAVE_DMA
|
||||
/* Register buffer for ADC DMA transfer */
|
||||
|
||||
int (*regbuf_reg)(struct stm32_adc_dev_s *dev, uint16_t *buffer,
|
||||
uint16_t len);
|
||||
|
||||
/* Start DMA */
|
||||
|
||||
void (*dma_start)(struct stm32_adc_dev_s *dev, dma_callback_t callback,
|
||||
uint16_t *buffer, uint16_t len);
|
||||
|
||||
/* Stop DMA */
|
||||
|
||||
void (*dma_stop)(struct stm32_adc_dev_s *dev);
|
||||
#endif
|
||||
|
||||
/* Dump ADC regs */
|
||||
|
||||
void (*dump_regs)(struct stm32_adc_dev_s *dev);
|
||||
|
Loading…
Reference in New Issue
Block a user