i2c: stm32: add missing DMA configuration fields

Add missing fields for DMA tx and rx configuration macros

Signed-off-by: Simon Gilbert <srdgilbert@gmail.com>
This commit is contained in:
Simon Gilbert 2025-03-23 23:39:31 +00:00 committed by Benjamin Cabé
commit 4348be608d
3 changed files with 40 additions and 11 deletions

View file

@ -587,15 +587,35 @@ static void i2c_stm32_irq_config_func_##index(const struct device *dev) \
#ifdef CONFIG_I2C_STM32_V2_DMA
#define I2C_DMA_INIT(index, dir) \
.dir##_dma = {.dev_dma = COND_CODE_1(DT_INST_DMAS_HAS_NAME(index, dir), \
(DEVICE_DT_GET(STM32_DMA_CTLR(index, dir))), (NULL)), \
.dma_channel = COND_CODE_1(DT_INST_DMAS_HAS_NAME(index, dir), \
(DT_INST_DMAS_CELL_BY_NAME(index, dir, channel)), (-1))},
#define I2C_DMA_INIT(index, dir) \
.dir##_dma = { \
.dev_dma = COND_CODE_1(DT_INST_DMAS_HAS_NAME(index, dir),\
(DEVICE_DT_GET(STM32_DMA_CTLR(index, dir))), (NULL)),\
.dma_channel = COND_CODE_1(DT_INST_DMAS_HAS_NAME(index, dir),\
(DT_INST_DMAS_CELL_BY_NAME(index, dir, channel)), (-1)),\
},
#define I2C_DMA_DATA_INIT(index, dir, src, dest) \
.dma_##dir##_cfg = { \
.dma_slot = STM32_DMA_SLOT(index, dir, slot), \
.channel_direction = STM32_DMA_CONFIG_DIRECTION( \
STM32_DMA_CHANNEL_CONFIG(index, dir)),\
.cyclic = STM32_DMA_CONFIG_CYCLIC( \
STM32_DMA_CHANNEL_CONFIG(index, dir)), \
.channel_priority = STM32_DMA_CONFIG_PRIORITY( \
STM32_DMA_CHANNEL_CONFIG(index, dir)), \
.source_data_size = STM32_DMA_CONFIG_##src##_DATA_SIZE( \
STM32_DMA_CHANNEL_CONFIG(index, dir)),\
.dest_data_size = STM32_DMA_CONFIG_##dest##_DATA_SIZE( \
STM32_DMA_CHANNEL_CONFIG(index, dir)), \
.source_burst_length = 1, \
.dest_burst_length = 1, \
}, \
#else
#define I2C_DMA_INIT(index, dir)
#define I2C_DMA_DATA_INIT(index, dir, src, dest)
#endif /* CONFIG_I2C_STM32_V2_DMA */
@ -624,11 +644,14 @@ static const struct i2c_stm32_config i2c_stm32_cfg_##index = { \
IF_ENABLED(DT_HAS_COMPAT_STATUS_OKAY(st_stm32_i2c_v2), \
(.timings = (const struct i2c_config_timing *) i2c_timings_##index,\
.n_timings = ARRAY_SIZE(i2c_timings_##index),)) \
I2C_DMA_INIT(index, tx) \
I2C_DMA_INIT(index, rx) \
I2C_DMA_INIT(index, tx) \
I2C_DMA_INIT(index, rx) \
}; \
\
static struct i2c_stm32_data i2c_stm32_dev_data_##index; \
static struct i2c_stm32_data i2c_stm32_dev_data_##index = { \
I2C_DMA_DATA_INIT(index, tx, MEMORY, PERIPHERAL) \
I2C_DMA_DATA_INIT(index, rx, PERIPHERAL, MEMORY) \
}; \
\
PM_DEVICE_DT_INST_DEFINE(index, i2c_stm32_pm_action); \
\

View file

@ -105,7 +105,8 @@ struct i2c_stm32_data {
const struct device *smbalert_cb_dev;
#endif
#ifdef CONFIG_I2C_STM32_V2_DMA
struct dma_config dma_cfg;
struct dma_config dma_tx_cfg;
struct dma_config dma_rx_cfg;
struct dma_block_config dma_blk_cfg;
#endif /* CONFIG_I2C_STM32_V2_DMA */
};

View file

@ -193,10 +193,12 @@ static inline void msg_init(const struct device *dev, struct i2c_msg *msg,
/* Configure RX DMA */
data->dma_blk_cfg.source_address = LL_I2C_DMA_GetRegAddr(
cfg->i2c, LL_I2C_DMA_REG_DATA_RECEIVE);
data->dma_blk_cfg.source_addr_adj = DMA_ADDR_ADJ_NO_CHANGE;
data->dma_blk_cfg.dest_address = (uint32_t)msg->buf;
data->dma_blk_cfg.dest_addr_adj = DMA_ADDR_ADJ_INCREMENT;
data->dma_blk_cfg.block_size = msg->len;
if (configure_dma(&cfg->rx_dma, &data->dma_cfg,
if (configure_dma(&cfg->rx_dma, &data->dma_rx_cfg,
&data->dma_blk_cfg) != 0) {
LOG_ERR("Problem setting up RX DMA");
return;
@ -209,10 +211,13 @@ static inline void msg_init(const struct device *dev, struct i2c_msg *msg,
/* Configure TX DMA */
data->dma_blk_cfg.source_address =
(uint32_t)data->current.buf;
data->dma_blk_cfg.source_addr_adj = DMA_ADDR_ADJ_INCREMENT;
data->dma_blk_cfg.dest_address = LL_I2C_DMA_GetRegAddr(
cfg->i2c, LL_I2C_DMA_REG_DATA_TRANSMIT);
data->dma_blk_cfg.dest_addr_adj = DMA_ADDR_ADJ_NO_CHANGE;
data->dma_blk_cfg.block_size = msg->len;
if (configure_dma(&cfg->tx_dma, &data->dma_cfg,
if (configure_dma(&cfg->tx_dma, &data->dma_tx_cfg,
&data->dma_blk_cfg) != 0) {
LOG_ERR("Problem setting up TX DMA");
return;