/* * Copyright (c) 2024 STMicroelectronics * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_DRIVERS_FLASH_XSPI_STM32_H_ #define ZEPHYR_DRIVERS_FLASH_XSPI_STM32_H_ /* Macro to check if any xspi device has a domain clock or more */ #define STM32_XSPI_DOMAIN_CLOCK_INST_SUPPORT(inst) \ DT_CLOCKS_HAS_IDX(DT_INST_PARENT(inst), 1) || #define STM32_XSPI_INST_DEV_DOMAIN_CLOCK_SUPPORT \ (DT_INST_FOREACH_STATUS_OKAY(STM32_XSPI_DOMAIN_CLOCK_INST_SUPPORT) 0) /* This symbol takes the value 1 if device instance has a domain clock in its dts */ #if STM32_XSPI_INST_DEV_DOMAIN_CLOCK_SUPPORT #define STM32_XSPI_DOMAIN_CLOCK_SUPPORT 1 #else #define STM32_XSPI_DOMAIN_CLOCK_SUPPORT 0 #endif #define STM32_XSPI_FIFO_THRESHOLD 4U /* Valid range is [0, 255] */ #define STM32_XSPI_CLOCK_PRESCALER_MIN 0U #define STM32_XSPI_CLOCK_PRESCALER_MAX 255U #define STM32_XSPI_CLOCK_COMPUTE(bus_freq, prescaler) ((bus_freq) / ((prescaler) + 1U)) /* Max Time value during reset or erase operation */ #define STM32_XSPI_RESET_MAX_TIME 100U #define STM32_XSPI_BULK_ERASE_MAX_TIME 460000U #define STM32_XSPI_SECTOR_ERASE_MAX_TIME 1000U #define STM32_XSPI_SUBSECTOR_4K_ERASE_MAX_TIME 400U #define STM32_XSPI_WRITE_REG_MAX_TIME 40U /* used as default value for DTS writeoc */ #define SPI_NOR_WRITEOC_NONE 0xFF #if STM32_XSPI_USE_DMA /* Lookup table to set dma priority from the DTS */ static const uint32_t table_priority[] = { DMA_LOW_PRIORITY_LOW_WEIGHT, DMA_LOW_PRIORITY_MID_WEIGHT, DMA_LOW_PRIORITY_HIGH_WEIGHT, DMA_HIGH_PRIORITY, }; /* Lookup table to set dma channel direction from the DTS */ static const uint32_t table_direction[] = { DMA_MEMORY_TO_MEMORY, DMA_MEMORY_TO_PERIPH, DMA_PERIPH_TO_MEMORY, }; struct stream { DMA_TypeDef *reg; const struct device *dev; uint32_t channel; struct dma_config cfg; uint8_t priority; bool src_addr_increment; bool dst_addr_increment; }; #endif /* STM32_XSPI_USE_DMA */ typedef void (*irq_config_func_t)(const struct device *dev); struct flash_stm32_xspi_config { const struct stm32_pclken *pclken; size_t pclk_len; irq_config_func_t irq_config; size_t flash_size; uint32_t max_frequency; int data_mode; /* SPI or QSPI or OSPI */ int data_rate; /* DTR or STR */ const struct pinctrl_dev_config *pcfg; #if STM32_XSPI_RESET_GPIO const struct gpio_dt_spec reset; #endif /* STM32_XSPI_RESET_GPIO */ }; struct flash_stm32_xspi_data { /* XSPI handle is modifiable ; so part of data struct */ XSPI_HandleTypeDef hxspi; struct k_sem sem; struct k_sem sync; #if defined(CONFIG_FLASH_PAGE_LAYOUT) struct flash_pages_layout layout; #endif struct jesd216_erase_type erase_types[JESD216_NUM_ERASE_TYPES]; /* Number of bytes per page */ uint16_t page_size; /* Address width in bytes */ uint8_t address_width; /* Read operation dummy cycles */ uint8_t read_dummy; uint32_t read_opcode; uint32_t write_opcode; enum jesd216_mode_type read_mode; enum jesd216_dw15_qer_type qer_type; #if defined(CONFIG_FLASH_JESD216_API) /* Table to hold the jedec Read ID given by the octoFlash const */ uint8_t jedec_id[JESD216_READ_ID_LEN]; #endif /* CONFIG_FLASH_JESD216_API */ int cmd_status; #if STM32_XSPI_USE_DMA struct stream dma_tx; struct stream dma_rx; #endif /* STM32_XSPI_USE_DMA */ }; #endif /* ZEPHYR_DRIVERS_FLASH_XSPI_STM32_H_ */