stm32_hrtim: add DMA configuration

This commit is contained in:
raiden00pl
2017-08-28 17:44:14 +02:00
parent bbf4d5048a
commit 85c48de040
2 changed files with 143 additions and 12 deletions
+122 -12
View File
@@ -129,10 +129,6 @@
# error HRTIM Interrupts not supported yet # error HRTIM Interrupts not supported yet
#endif #endif
#ifdef CONFIG_STM32_HRTIM_DMA
# error HRTIM DMA not supported yet
#endif
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
****************************************************************************/ ****************************************************************************/
@@ -316,6 +312,9 @@ struct stm32_hrtim_timcmn_s
uint16_t irq; /* interrupts configuration */ uint16_t irq; /* interrupts configuration */
#endif #endif
#ifdef CONFIG_STM32_HRTIM_DMA #ifdef CONFIG_STM32_HRTIM_DMA
uint16_t dma;
#endif
#ifdef CONFIG_STM32_HRTIM_DMABURST
uint32_t dmaburst; uint32_t dmaburst;
#endif #endif
}; };
@@ -570,6 +569,11 @@ static int hrtim_adc_config(FAR struct stm32_hrtim_s *priv);
#ifdef CONFIG_STM32_HRTIM_DAC #ifdef CONFIG_STM32_HRTIM_DAC
static int hrtim_dac_config(FAR struct stm32_hrtim_s *priv); static int hrtim_dac_config(FAR struct stm32_hrtim_s *priv);
#endif #endif
#ifdef CONFIG_STM32_HRTIM_DMA
static int hrtim_dma_cfg(FAR struct stm32_hrtim_s *priv);
static int hrtim_tim_dma_cfg(FAR struct stm32_hrtim_s *priv, uint8_t timer,
uint16_t dma);
#endif
#ifdef HRTIM_HAVE_FAULTS #ifdef HRTIM_HAVE_FAULTS
static int hrtim_faults_config(FAR struct stm32_hrtim_s *priv); static int hrtim_faults_config(FAR struct stm32_hrtim_s *priv);
static int hrtim_flt_cfg(FAR struct stm32_hrtim_s *priv, uint8_t index); static int hrtim_flt_cfg(FAR struct stm32_hrtim_s *priv, uint8_t index);
@@ -642,7 +646,10 @@ static struct stm32_hrtim_tim_s g_master =
.dac = HRTIM_MASTER_DAC, .dac = HRTIM_MASTER_DAC,
# endif # endif
# ifdef CONFIG_STM32_HRTIM_MASTER_IRQ # ifdef CONFIG_STM32_HRTIM_MASTER_IRQ
.irq = HRTIM_IRQ_MASTER .irq = HRTIM_MASTER_IRQ
# endif
# ifdef CONFIG_STM32_HRTIM_MASTER_DMA
.dma = HRTIM_MASTER_DMA
# endif # endif
#endif #endif
}, },
@@ -713,7 +720,10 @@ static struct stm32_hrtim_tim_s g_tima =
.dac = HRTIM_TIMA_DAC, .dac = HRTIM_TIMA_DAC,
#endif #endif
#ifdef CONFIG_STM32_HRTIM_TIMA_IRQ #ifdef CONFIG_STM32_HRTIM_TIMA_IRQ
.irq = HRTIM_IRQ_TIMA, .irq = HRTIM_TIMA_IRQ,
#endif
#ifdef CONFIG_STM32_HRTIM_TIMA_DMA
.dma = HRTIM_TIMA_DMA
#endif #endif
}, },
.priv = &g_tima_priv .priv = &g_tima_priv
@@ -784,7 +794,10 @@ static struct stm32_hrtim_tim_s g_timb =
.dac = HRTIM_TIMB_DAC, .dac = HRTIM_TIMB_DAC,
#endif #endif
#ifdef CONFIG_STM32_HRTIM_TIMB_IRQ #ifdef CONFIG_STM32_HRTIM_TIMB_IRQ
.irq = HRTIM_IRQ_TIMB, .irq = HRTIM_TIMB_IRQ,
#endif
#ifdef CONFIG_STM32_HRTIM_TIMB_DMA
.dma = HRTIM_TIMB_DMA
#endif #endif
}, },
.priv = &g_timb_priv .priv = &g_timb_priv
@@ -855,7 +868,10 @@ static struct stm32_hrtim_tim_s g_timc =
.dac = HRTIM_TIMC_DAC, .dac = HRTIM_TIMC_DAC,
#endif #endif
#ifdef CONFIG_STM32_HRTIM_TIMC_IRQ #ifdef CONFIG_STM32_HRTIM_TIMC_IRQ
.irq = HRTIM_IRQ_TIMC, .irq = HRTIM_TIMC_IRQ,
#endif
#ifdef CONFIG_STM32_HRTIM_TIMC_DMA
.dma = HRTIM_TIMC_DMA
#endif #endif
}, },
.priv = &g_timc_priv .priv = &g_timc_priv
@@ -926,7 +942,10 @@ static struct stm32_hrtim_tim_s g_timd =
.dac = HRTIM_TIMD_DAC, .dac = HRTIM_TIMD_DAC,
#endif #endif
#ifdef CONFIG_STM32_HRTIM_TIMD_IRQ #ifdef CONFIG_STM32_HRTIM_TIMD_IRQ
.irq = HRTIM_IRQ_TIMD, .irq = HRTIM_TIMD_IRQ,
#endif
#ifdef CONFIG_STM32_HRTIM_TIMD_DMA
.dma = HRTIM_TIMD_DMA
#endif #endif
}, },
.priv = &g_timd_priv .priv = &g_timd_priv
@@ -997,7 +1016,10 @@ static struct stm32_hrtim_tim_s g_time =
.dac = HRTIM_TIME_DAC, .dac = HRTIM_TIME_DAC,
#endif #endif
#ifdef CONFIG_STM32_HRTIM_TIME_IRQ #ifdef CONFIG_STM32_HRTIM_TIME_IRQ
.irq = HRTIM_IRQ_TIME, .irq = HRTIM_TIME_IRQ,
#endif
#ifdef CONFIG_STM32_HRTIM_TIME_DMA
.dma = HRTIM_TIME_DMA
#endif #endif
}, },
.priv = &g_time_priv .priv = &g_time_priv
@@ -2366,6 +2388,85 @@ static int hrtim_dac_config(FAR struct stm32_hrtim_s *priv)
} }
#endif #endif
#ifdef CONFIG_STM32_HRTIM_DMA
/****************************************************************************
* Name: hrtim_dma_cfg
****************************************************************************/
static int hrtim_tim_dma_cfg(FAR struct stm32_hrtim_s *priv, uint8_t timer,
uint16_t dma)
{
int ret = OK;
uint32_t regval = 0;
if (timer == HRTIM_TIMER_MASTER)
{
/* Master support first 7 DMA requests */
if (dma > 0x7F)
{
tmrerr("ERROR: invalid DMA requests 0x%04X for timer %d\n", dma,
timer);
ret = -EINVAL;
goto errout;
}
}
else
{
if (dma & HRTIM_DMA_SYNC)
{
tmrerr("ERROR: timer %d does not support 0x%04X DMA request\n",
timer, HRTIM_DMA_SYNC);
ret = -EINVAL;
goto errout;
}
}
/* DMA configuration occupies upper half of the DIER register */
regval = dma << 16;
hrtim_tim_putreg(priv, timer, STM32_HRTIM_TIM_DIER_OFFSET, regval);
errout:
return ret;
}
/****************************************************************************
* Name: hrtim_dma_cfg
****************************************************************************/
static int hrtim_dma_cfg(FAR struct stm32_hrtim_s *priv)
{
#ifdef CONFIG_STM32_HRTIM_MASTER_DMA
hrtim_tim_dma_cfg(priv, HRTIM_TIMER_MASTER, priv->master->tim.dma);
#endif
#ifdef CONFIG_STM32_HRTIM_TIMA_DMA
hrtim_tim_dma_cfg(priv, HRTIM_TIMER_TIMA, priv->tima->tim.dma);
#endif
#ifdef CONFIG_STM32_HRTIM_TIMB_DMA
hrtim_tim_dma_cfg(priv, HRTIM_TIMER_TIMB, priv->timb->tim.dma);
#endif
#ifdef CONFIG_STM32_HRTIM_TIMC_DMA
hrtim_tim_dma_cfg(priv, HRTIM_TIMER_TIMC, priv->timc->tim.dma);
#endif
#ifdef CONFIG_STM32_HRTIM_TIMD_DMA
hrtim_tim_dma_cfg(priv, HRTIM_TIMER_TIMD, priv->timd->tim.dma);
#endif
#ifdef CONFIG_STM32_HRTIM_TIME_DMA
hrtim_tim_dma_cfg(priv, HRTIM_TIMER_TIME, priv->time->tim.dma);
#endif
return OK;
}
#endif /* CONFIG_STM32_HRTIM_DAM */
#ifdef HRTIM_HAVE_FAULTS #ifdef HRTIM_HAVE_FAULTS
/**************************************************************************** /****************************************************************************
@@ -2869,7 +2970,7 @@ static int hrtim_events_config(FAR struct stm32_hrtim_s *priv)
return OK; return OK;
} }
#endif #endif /* HRTIM_HAVE_FAULTS */
/**************************************************************************** /****************************************************************************
* Name: hrtim_irq_config * Name: hrtim_irq_config
@@ -2896,7 +2997,7 @@ void hrtim_irq_ack(FAR struct hrtim_dev_s *dev, uint8_t timer, int source);
{ {
#warning "hrtim_irq_ack: missing logic" #warning "hrtim_irq_ack: missing logic"
} }
#endif #endif /* HRTIM_HAVE_INTERRUPTS */
/**************************************************************************** /****************************************************************************
* Name: hrtim_tim_mode_set * Name: hrtim_tim_mode_set
@@ -3446,6 +3547,15 @@ static int stm32_hrtimconfig(FAR struct stm32_hrtim_s *priv)
} }
#endif #endif
#ifdef CONFIG_STM32_HRTIM_DMA
ret = hrtim_dma_cfg(priv);
if (ret != OK)
{
tmrerr("ERROR: HRTIM DMA configuration failed!\n");
goto errout;
}
#endif
/* Enable Master Timer */ /* Enable Master Timer */
#ifdef CONFIG_STM32_HRTIM_MASTER #ifdef CONFIG_STM32_HRTIM_MASTER
+21
View File
@@ -712,6 +712,27 @@ enum stm32_irq_cmn_e
HRTIM_IRQ_BMPER = (1 << 17) /* Burst Mode Period Interrupt */ HRTIM_IRQ_BMPER = (1 << 17) /* Burst Mode Period Interrupt */
}; };
/* HRTIM DMA requests */
enum stm32_hrtim_dma_e
{
HRTIM_DMA_CMP1 = (1 << 0), /* Common: Compare 1 DMA request */
HRTIM_DMA_CMP2 = (1 << 1), /* Common: Compare 2 DMA request */
HRTIM_DMA_CMP3 = (1 << 2), /* Common: Compare 3 DMA request */
HRTIM_DMA_CMP4 = (1 << 3), /* Common:Compare 4 DMA request */
HRTIM_DMA_REP = (1 << 4), /* Common: Repetition DMA request */
HRTIM_DMA_SYNC = (1 << 5), /* Master: Sync Input DMA request */
HRTIM_DMA_UPD = (1 << 6), /* Common: Update DMA reques */
HRTIM_DMA_CPT1 = (1 << 7), /* Slaves: Capture 1 DMA reques */
HRTIM_DMA_CPT2 = (1 << 8), /* Slaves: Capture 2 DMA reques */
HRTIM_DMA_SET1 = (1 << 9), /* Slaves: Output 1 Set DMA reques */
HRTIM_DMA_RST1 = (1 << 10), /* Slaves: Output 1 Reset DMA reques */
HRTIM_DMA_SET2 = (1 << 11), /* Slaves: Output 2 Set DMA reques */
HRTIM_DMA_RST2 = (1 << 12), /* Slaves: Output 2 Reset DMA reques */
HRTIM_DMA_RST = (1 << 13), /* Slaves: Reset DMA reques */
HRTIM_DMA_DLYPRT = (1 << 14) /* Slaves: Delayed Protection DMA reques */
};
/* HRTIM vtable */ /* HRTIM vtable */
struct hrtim_dev_s; struct hrtim_dev_s;