Skip to content

Commit 9affaa1

Browse files
drivers: memc: stm32_xspi_psram: Add conditional HAL API support
Add conditional compilation to support different STM32 XSPI HAL capabilities across product lines: - Use XSPIM (XSPI Manager) configuration when available (STM32H7RS) - Use 16-line data mode on STM32H7RS, 8-line on STM32H5 - Include MaxTran and MemorySelect Init fields only when XSPIM exists This allows the driver to automatically use full hardware capabilities on STM32H7RS (16-line XSPI with dual-port manager) while maintaining compatibility with STM32H5 series that have simpler single-port XSPI/OCTOSPI implementation with 8-line max. Related to zephyrproject-rtos/hal_stm32#328 Signed-off-by: Ayush Kothari <ayushkot96@gmail.com>
1 parent 7fc8051 commit 9affaa1

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

drivers/memc/memc_stm32_xspi_psram.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,9 @@ static int memc_stm32_xspi_psram_init(const struct device *dev)
216216
struct memc_stm32_xspi_psram_data *dev_data = dev->data;
217217
XSPI_HandleTypeDef hxspi = dev_data->hxspi;
218218
uint32_t ahb_clock_freq;
219+
#if DT_CLOCKS_HAS_NAME(STM32_XSPI_NODE, xspi_mgr)
219220
XSPIM_CfgTypeDef cfg = {0};
221+
#endif
220222
XSPI_RegularCmdTypeDef cmd = {0};
221223
XSPI_MemoryMappedTypeDef mem_mapped_cfg = {0};
222224
uint32_t prescaler = STM32_XSPI_CLOCK_PRESCALER_MIN;
@@ -294,13 +296,16 @@ static int memc_stm32_xspi_psram_init(const struct device *dev)
294296
return -EIO;
295297
}
296298

299+
#if DT_CLOCKS_HAS_NAME(STM32_XSPI_NODE, xspi_mgr)
300+
/* Configure XSPI Manager for STM32H7RS (dual port configuration) */
297301
cfg.nCSOverride = HAL_XSPI_CSSEL_OVR_NCS1;
298302
cfg.IOPort = HAL_XSPIM_IOPORT_1;
299303

300304
if (HAL_XSPIM_Config(&hxspi, &cfg, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
301-
LOG_ERR("XSPIMgr Init failed");
305+
LOG_ERR("XSPI Manager config failed");
302306
return -EIO;
303307
}
308+
#endif
304309

305310
/* Configure AP memory registers */
306311
ret = ap_memory_configure(&hxspi);
@@ -322,7 +327,11 @@ static int memc_stm32_xspi_psram_init(const struct device *dev)
322327
cmd.AddressMode = HAL_XSPI_ADDRESS_8_LINES;
323328
cmd.AddressWidth = HAL_XSPI_ADDRESS_32_BITS;
324329
cmd.AddressDTRMode = HAL_XSPI_ADDRESS_DTR_ENABLE;
325-
cmd.DataMode = HAL_XSPI_DATA_16_LINES;
330+
#if defined(HAL_XSPI_DATA_16_LINES)
331+
cmd.DataMode = HAL_XSPI_DATA_16_LINES; /* Use 16 lines if supported (STM32H7RS) */
332+
#else
333+
cmd.DataMode = HAL_XSPI_DATA_8_LINES; /* STM32H5 max is 8 lines */
334+
#endif
326335
cmd.DataDTRMode = HAL_XSPI_DATA_DTR_ENABLE;
327336
cmd.DummyCycles = DUMMY_CLK_CYCLES_WRITE;
328337
cmd.DQSMode = HAL_XSPI_DQS_ENABLE;
@@ -401,9 +410,13 @@ static struct memc_stm32_xspi_psram_data memc_stm32_xspi_data = {
401410
.SampleShifting = HAL_XSPI_SAMPLE_SHIFT_NONE,
402411
.DelayHoldQuarterCycle = HAL_XSPI_DHQC_ENABLE,
403412
.ChipSelectBoundary = HAL_XSPI_BONDARYOF_16KB,
404-
.MaxTran = 0U,
413+
#if DT_CLOCKS_HAS_NAME(STM32_XSPI_NODE, xspi_mgr)
414+
.MaxTran = 0U, /* Communication regulation (STM32H7RS only) */
415+
#endif
405416
.Refresh = 0x81U,
406-
.MemorySelect = HAL_XSPI_CSSEL_NCS1,
417+
#if DT_CLOCKS_HAS_NAME(STM32_XSPI_NODE, xspi_mgr)
418+
.MemorySelect = HAL_XSPI_CSSEL_NCS1, /* Chip select (STM32H7RS only) */
419+
#endif
407420
},
408421
},
409422
};

0 commit comments

Comments
 (0)