zephyr/drivers/i2s/i2s_ll_stm32.h
Song Qiang 9561785ea7 drivers: i2s: add some missing DMA parameters
src_addr_increment, dst_addr_increment, fifo_threshold and priority
are missing as parameters for configuring DMA. This commit adds them
to the driver.

Signed-off-by: Song Qiang <songqiang1304521@gmail.com>
2019-11-06 14:14:39 +01:00

141 lines
3.8 KiB
C

/*
* Copyright (c) 2018 STMicroelectronics
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef _STM32_I2S_H_
#define _STM32_I2S_H_
#ifdef CONFIG_I2S_STM32_USE_PLLI2S_ENABLE
#if defined(RCC_CFGR_I2SSRC)
/* single selector for the I2S clock source (SEL_1 == SEL_2) */
#define CLK_SEL_1 LL_RCC_I2S1_CLKSOURCE_PLLI2S
#define CLK_SEL_2 LL_RCC_I2S1_CLKSOURCE_PLLI2S
#else
#if defined(RCC_DCKCFGR_I2SSRC)
/* single selector for the I2S clock source (SEL_1 == SEL_2) */
#define CLK_SEL_1 LL_RCC_I2S1_CLKSOURCE_PLL
#define CLK_SEL_2 LL_RCC_I2S1_CLKSOURCE_PLL
#else
#if defined(RCC_DCKCFGR_I2S1SRC) && defined(RCC_DCKCFGR_I2S2SRC)
/* double selector for the I2S clock source (SEL_1 != SEL_2) */
#define CLK_SEL_1 LL_RCC_I2S1_CLKSOURCE_PLLI2S
#define CLK_SEL_2 LL_RCC_I2S2_CLKSOURCE_PLLI2S
#endif /* RCC_DCKCFGR_I2S1SRC && RCC_DCKCFGR_I2S2SRC */
#endif /* RCC_DCKCFGR_I2SSRC */
#endif /* RCC_CFGR_I2SSRC */
#else
#if defined(RCC_CFGR_I2SSRC)
/* single selector for the I2S clock source (SEL_1 == SEL_2) */
#define CLK_SEL_1 LL_RCC_I2S1_CLKSOURCE_PIN
#define CLK_SEL_2 LL_RCC_I2S1_CLKSOURCE_PIN
#else
#if defined(RCC_DCKCFGR_I2SSRC)
/* single selector for the I2S clock source (SEL_1 == SEL_2) */
#define CLK_SEL_1 LL_RCC_I2S1_CLKSOURCE_PLLSRC
#define CLK_SEL_2 LL_RCC_I2S1_CLKSOURCE_PLLSRC
#else
#if defined(RCC_DCKCFGR_I2S1SRC) && defined(RCC_DCKCFGR_I2S2SRC)
/* double selector for the I2S clock source (SEL_1 != SEL_2) */
#define CLK_SEL_1 LL_RCC_I2S1_CLKSOURCE_PLLSRC
#define CLK_SEL_2 LL_RCC_I2S2_CLKSOURCE_PLLSRC
#endif /* RCC_DCKCFGR_I2S1SRC && RCC_DCKCFGR_I2S2SRC */
#endif /* RCC_DCKCFGR_I2SSRC */
#endif /* RCC_CFGR_I2SSRC */
#endif /* CONFIG_I2S_STM32_USE_PLLI2S_ENABLE */
#ifdef CONFIG_SOC_SERIES_STM32F4X
#define I2S1_DMA_NAME CONFIG_DMA_2_NAME
#define I2S1_DMA_CHAN_RX 2
#define I2S1_DMA_SLOT_RX 3
#define I2S1_DMA_CHAN_TX 3
#define I2S1_DMA_SLOT_TX 3
#define I2S2_DMA_NAME CONFIG_DMA_1_NAME
#define I2S2_DMA_CHAN_RX 3
#define I2S2_DMA_SLOT_RX 0
#define I2S2_DMA_CHAN_TX 4
#define I2S2_DMA_SLOT_TX 0
#define I2S3_DMA_NAME CONFIG_DMA_1_NAME
#define I2S3_DMA_CHAN_RX 0
#define I2S3_DMA_SLOT_RX 0
#define I2S3_DMA_CHAN_TX 5
#define I2S3_DMA_SLOT_TX 0
#define I2S4_DMA_NAME CONFIG_DMA_2_NAME
#define I2S4_DMA_CHAN_RX 0
#define I2S4_DMA_SLOT_RX 4
#define I2S4_DMA_CHAN_TX 1
#define I2S4_DMA_SLOT_TX 4
#define I2S5_DMA_NAME CONFIG_DMA_2_NAME
#define I2S5_DMA_CHAN_RX 5
#define I2S5_DMA_SLOT_RX 7
#define I2S5_DMA_CHAN_TX 6
#define I2S5_DMA_SLOT_TX 7
#define I2S_DMA_SRC_ADDR_INC_RX 0
#define I2S_DMA_DST_ADDR_INC_RX 1
#define I2S_DMA_SRC_ADDR_INC_TX 1
#define I2S_DMA_DST_ADDR_INC_TX 0
#define I2S_DMA_FIFO_THRESHOLD 3 /* Full FIFO */
#define I2S_DMA_CHAN_PRIORITY 0
#endif
#define DEV_CFG(dev) \
(const struct i2s_stm32_cfg * const)((dev)->config->config_info)
#define DEV_DATA(dev) \
((struct i2s_stm32_data *const)(dev)->driver_data)
struct queue_item {
void *mem_block;
size_t size;
};
/* Minimal ring buffer implementation */
struct ring_buf {
struct queue_item *buf;
u16_t len;
u16_t head;
u16_t tail;
};
/* Device constant configuration parameters */
struct i2s_stm32_cfg {
SPI_TypeDef *i2s;
struct stm32_pclken pclken;
u32_t i2s_clk_sel;
void (*irq_config)(struct device *dev);
};
struct stream {
s32_t state;
struct k_sem sem;
u32_t dma_channel;
struct dma_config dma_cfg;
u8_t priority;
bool src_addr_increment;
bool dst_addr_increment;
u8_t fifo_threshold;
struct i2s_config cfg;
struct ring_buf mem_block_queue;
void *mem_block;
bool last_block;
bool master;
int (*stream_start)(struct stream *, struct device *dev);
void (*stream_disable)(struct stream *, struct device *dev);
void (*queue_drop)(struct stream *);
};
/* Device run time data */
struct i2s_stm32_data {
struct device *dev_dma_tx;
struct device *dev_dma_rx;
struct stream rx;
struct stream tx;
};
#endif /* _STM32_I2S_H_ */