1 /* 2 * SPDX-FileCopyrightText: 2019-2023 Espressif Systems (Shanghai) CO LTD 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #pragma once 8 9 #include <stdint.h> 10 #include "mspi_timing_tuning_configs.h" 11 12 #ifdef __cplusplus 13 extern "C" { 14 #endif 15 16 17 /** 18 * SPI timing tuning registers. 19 * Upper layer rely on these 3 registers to tune the timing. 20 */ 21 typedef struct { 22 uint8_t spi_din_mode; /*!< input signal delay mode*/ 23 uint8_t spi_din_num; /*!< input signal delay number */ 24 uint8_t extra_dummy_len; /*!< extra dummy length*/ 25 } mspi_timing_tuning_param_t; 26 27 typedef struct { 28 mspi_timing_tuning_param_t tuning_config_table[MSPI_TIMING_CONFIG_NUM_DEFAULT]; //available timing tuning configs 29 uint32_t available_config_num; 30 uint32_t default_config_id; //If tuning fails, we use this one as default 31 } mspi_timing_config_t; 32 33 /** 34 * The SPI FLASH module clock and SPI PSRAM module clock is divided from the SPI core clock, core clock is from system clock: 35 * 36 * PLL ----| |---- FLASH Module Clock 37 * XTAL ----|----> Core Clock ---->| 38 * RTC8M ----| |---- PSRAM Module Clock 39 * 40 */ 41 typedef enum { 42 MSPI_TIMING_CONFIG_CORE_CLOCK_80M, 43 MSPI_TIMING_CONFIG_CORE_CLOCK_120M, 44 MSPI_TIMING_CONFIG_CORE_CLOCK_160M, 45 MSPI_TIMING_CONFIG_CORE_CLOCK_240M 46 } mspi_timing_config_core_clock_t; 47 48 49 //-------------------------------------- Generic Config APIs --------------------------------------// 50 /** 51 * @brief Get required core clock, under current sdkconfig (Flash / PSRAM mode, speed, etc.) 52 */ 53 mspi_timing_config_core_clock_t mspi_timing_config_get_core_clock(void); 54 55 /** 56 * @brief Set MSPI core clock 57 * 58 * @param spi_num SPI0 / 1 59 * @param core_clock core clock 60 */ 61 void mspi_timing_config_set_core_clock(uint8_t spi_num, mspi_timing_config_core_clock_t core_clock); 62 63 /** 64 * @brief Set MSPI Flash module clock 65 * 66 * @param spi_num SPI0 / 1 67 * @param freqdiv Freq divider 68 */ 69 void mspi_timing_config_set_flash_clock(uint8_t spi_num, uint32_t freqdiv); 70 71 /** 72 * @brief Set MSPI Flash Din Mode and Din Num 73 * 74 * @param spi_num SPI0 / 1 75 * @param din_mode Din mode 76 * @param din_num Din num 77 */ 78 void mspi_timing_config_flash_set_din_mode_num(uint8_t spi_num, uint8_t din_mode, uint8_t din_num); 79 80 /** 81 * @brief Set MSPI Flash extra dummy 82 * 83 * @param spi_num SPI0 / 1 84 * @param extra_dummy extra dummy 85 */ 86 void mspi_timing_config_flash_set_extra_dummy(uint8_t spi_num, uint8_t extra_dummy); 87 88 /** 89 * @brief Configure Flash to read data via SPI1 90 * 91 * @param buf buffer 92 * @param addr address 93 * @param len length 94 */ 95 void mspi_timing_config_flash_read_data(uint8_t *buf, uint32_t addr, uint32_t len); 96 97 /** 98 * @brief Set MSPI PSRAM module clock 99 * 100 * @param spi_num SPI0 / 1 101 * @param freqdiv Freq divider 102 */ 103 void mspi_timing_config_set_psram_clock(uint8_t spi_num, uint32_t freqdiv); 104 105 /** 106 * @brief Set MSPI PSRAM Din Mode and Din Num 107 * 108 * @param spi_num SPI0 / 1 109 * @param din_mode Din mode 110 * @param din_num Din num 111 */ 112 void mspi_timing_config_psram_set_din_mode_num(uint8_t spi_num, uint8_t din_mode, uint8_t din_num); 113 114 /** 115 * @brief Set MSPI PSRAM extra dummy 116 * 117 * @param spi_num SPI0 / 1 118 * @param extra_dummy extra dummy 119 */ 120 void mspi_timing_config_psram_set_extra_dummy(uint8_t spi_num, uint8_t extra_dummy); 121 122 /** 123 * @brief Configure PSRAM to write data via SPI1 124 * 125 * @param buf buffer 126 * @param addr address 127 * @param len length 128 */ 129 void mspi_timing_config_psram_write_data(uint8_t *buf, uint32_t addr, uint32_t len); 130 131 /** 132 * @brief Configure PSRAM to read data via SPI1 133 * 134 * @param buf buffer 135 * @param addr address 136 * @param len length 137 */ 138 void mspi_timing_config_psram_read_data(uint8_t *buf, uint32_t addr, uint32_t len); 139 140 /*------------------------------------------------------------------------------------------------- 141 * SPI1 Timing Tuning APIs 142 * 143 * These APIs are only used in `mspi_timing_tuning.c` for configuring SPI1 timing 144 * tuning related registers to find best tuning parameter for Flash and PSRAM 145 *-------------------------------------------------------------------------------------------------*/ 146 /** 147 * @brief Tune Flash timing registers for SPI1 accessing Flash 148 * 149 * @param[in] params Timing parameters 150 */ 151 void mspi_timing_config_flash_set_tuning_regs(const mspi_timing_tuning_param_t *params); 152 153 /** 154 * @brief Tune PSRAM timing registers for SPI1 accessing PSRAM 155 * 156 * @param[in] params Timing parameters 157 */ 158 void mspi_timing_config_psram_set_tuning_regs(const mspi_timing_tuning_param_t *params); 159 160 161 /*------------------------------------------------------------------------------------------------- 162 * APIs for coordination with ESP Flash driver 163 *-------------------------------------------------------------------------------------------------*/ 164 /** 165 * SPI1 register info get APIs. These APIs inform `mspi_timing_tuning.c` (driver layer) of the SPI1 flash settings. 166 * In this way, other components (e.g.: esp_flash driver) can get the info from it (`mspi_timing_tuning.c`). 167 */ 168 169 /** 170 * @brief Get CS timing 171 * 172 * @param[out] setup_time Setup time 173 * @param[out] hold_time Hold time 174 */ 175 void mspi_timing_config_get_cs_timing(uint8_t *setup_time, uint32_t *hold_time); 176 177 /** 178 * @brief Get Flash clock reg val 179 * 180 * @return Flash clock reg val 181 */ 182 uint32_t mspi_timing_config_get_flash_clock_reg(void); 183 184 #ifdef __cplusplus 185 } 186 #endif 187