1 /* 2 * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 #pragma once 7 8 #include "sdkconfig.h" 9 #include "esp_assert.h" 10 // #include "esp_flash_partitions.h" 11 12 #define MSPI_TIMING_CONFIG_NUM_DEFAULT 20 //This should be larger than the max available timing config num 13 #define MSPI_TIMING_TEST_DATA_LEN 64 14 #define MSPI_TIMING_PSRAM_TEST_DATA_ADDR 0 15 #define MSPI_TIMING_FLASH_TEST_DATA_ADDR ESP_BOOTLOADER_OFFSET 16 /** 17 * @note BACKGOURND: 18 * 19 * The SPI FLASH module clock and SPI PSRAM module clock is divided from the SPI core clock, core clock is from system clock: 20 * 21 * PLL ----| |---- FLASH Module Clock 22 * XTAL ----|----> Core Clock ---->| 23 * RTC8M ----| |---- PSRAM Module Clock 24 * 25 * 26 * DDR stands for double data rate, MSPI samples at both posedge and negedge. So the real spped will be doubled. 27 * Speed from high to low: 120M DDR > 80M DDR > 120 SDR > 80M SDR > ... 28 * 29 * Module with speed lower than 120M SDR doesn't need to be tuned 30 * 31 * @note LIMITATION: 32 * How to determine the core clock on 728. There are 2 limitations. 33 * 34 * 1. MSPI FLASH and PSRAM share the core clock register. Therefore: 35 * MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ == MSPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ 36 * 37 * 2. DDR mode requires the core clock divider (core_clk / div = module_clk) to be power of 2. 38 */ 39 //--------------------------------------FLASH Sampling Mode --------------------------------------// 40 #define MSPI_TIMING_FLASH_DTR_MODE CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_DTR 41 #define MSPI_TIMING_FLASH_STR_MODE CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR 42 //--------------------------------------FLASH Module Clock --------------------------------------// 43 #if CONFIG_ESPTOOLPY_FLASHFREQ_20M 44 #define MSPI_TIMING_FLASH_MODULE_CLOCK 20 45 #elif CONFIG_ESPTOOLPY_FLASHFREQ_40M 46 #define MSPI_TIMING_FLASH_MODULE_CLOCK 40 47 #elif CONFIG_ESPTOOLPY_FLASHFREQ_80M 48 #define MSPI_TIMING_FLASH_MODULE_CLOCK 80 49 #else //CONFIG_ESPTOOLPY_FLASHFREQ_120M 50 #define MSPI_TIMING_FLASH_MODULE_CLOCK 120 51 #endif 52 //------------------------------------FLASH Needs Tuning or not-------------------------------------// 53 #if MSPI_TIMING_FLASH_DTR_MODE 54 #define MSPI_TIMING_FLASH_NEEDS_TUNING (MSPI_TIMING_FLASH_MODULE_CLOCK > 40) 55 #elif MSPI_TIMING_FLASH_STR_MODE 56 #define MSPI_TIMING_FLASH_NEEDS_TUNING (MSPI_TIMING_FLASH_MODULE_CLOCK > 80) 57 #endif 58 59 //--------------------------------------PSRAM Sampling Mode --------------------------------------// 60 #define MSPI_TIMING_PSRAM_DTR_MODE CONFIG_SPIRAM_MODE_OCT 61 #define MSPI_TIMING_PSRAM_STR_MODE !CONFIG_SPIRAM_MODE_OCT 62 //--------------------------------------PSRAM Module Clock --------------------------------------// 63 #if CONFIG_SPIRAM 64 #if CONFIG_SPIRAM_SPEED_40M 65 #define MSPI_TIMING_PSRAM_MODULE_CLOCK 40 66 #elif CONFIG_SPIRAM_SPEED_80M 67 #define MSPI_TIMING_PSRAM_MODULE_CLOCK 80 68 #else //CONFIG_SPIRAM_SPEED_120M 69 #define MSPI_TIMING_PSRAM_MODULE_CLOCK 120 70 #endif 71 #else //Disable PSRAM 72 #define MSPI_TIMING_PSRAM_MODULE_CLOCK 10 //Define this to 10MHz, because we rely on `MSPI_TIMING_PSRAM_MODULE_CLOCK` macro for calculation and check below, see `Determine the Core Clock` chapter 73 #endif 74 //------------------------------------PSRAM Needs Tuning or not-------------------------------------// 75 #if MSPI_TIMING_PSRAM_DTR_MODE 76 #define MSPI_TIMING_PSRAM_NEEDS_TUNING (MSPI_TIMING_PSRAM_MODULE_CLOCK > 40) 77 #elif MSPI_TIMING_PSRAM_STR_MODE 78 #define MSPI_TIMING_PSRAM_NEEDS_TUNING (MSPI_TIMING_PSRAM_MODULE_CLOCK > 80) 79 #endif 80 81 82 /** 83 * @note Define A feasible core clock below: MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ and MSPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ 84 */ 85 /** 86 * Due to MSPI core clock is used by both MSPI Flash and PSRAM clock, 87 * define the STR/DTR mode here for selecting the core clock: 88 * @note If either Flash or PSRAM, or both of them are set to DTR mode, then we use DIV 2 89 */ 90 #if (MSPI_TIMING_FLASH_DTR_MODE || MSPI_TIMING_PSRAM_DTR_MODE) 91 #define MSPI_TIMING_CORE_CLOCK_DIV 2 92 #else //#if (MSPI_TIMING_FLASH_STR_MODE && (MSPI_TIMING_PSRAM_STR_MODE)) 93 #define MSPI_TIMING_CORE_CLOCK_DIV 1 94 #endif 95 96 ///////////////////////////////////// FLASH CORE CLOCK ///////////////////////////////////// 97 //FLASH 80M DTR 98 #if MSPI_TIMING_FLASH_DTR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_80M 99 #define MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 160 100 #endif 101 102 //FLASH 120M DTR 103 #if MSPI_TIMING_FLASH_DTR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_120M 104 #define MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 240 105 #endif 106 107 //FLASH 120M STR 108 #if MSPI_TIMING_FLASH_STR_MODE && CONFIG_ESPTOOLPY_FLASHFREQ_120M 109 #if (MSPI_TIMING_CORE_CLOCK_DIV == 2) 110 #define MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 240 111 #elif (MSPI_TIMING_CORE_CLOCK_DIV == 1) 112 #define MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 120 113 #endif 114 #endif //FLASH 120M STR 115 116 ///////////////////////////////////// PSRAM CORE CLOCK ///////////////////////////////////// 117 //PSRAM 80M DTR 118 #if MSPI_TIMING_PSRAM_DTR_MODE && CONFIG_SPIRAM_SPEED_80M 119 #define MSPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ 160 120 #endif 121 122 //PSRAM 120M STR 123 #if MSPI_TIMING_PSRAM_STR_MODE && CONFIG_SPIRAM_SPEED_120M 124 #if (MSPI_TIMING_CORE_CLOCK_DIV == 2) 125 #define MSPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ 240 126 #elif (MSPI_TIMING_CORE_CLOCK_DIV == 1) 127 #define MSPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ 120 128 #endif 129 #endif //PSRAM 120M STR 130 131 //PSRAM 120M STR 132 #if MSPI_TIMING_PSRAM_DTR_MODE && CONFIG_SPIRAM_SPEED_120M 133 #define MSPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ 240 134 #endif //PSRAM 120M DTR 135 136 137 //------------------------------------------Determine the Core Clock-----------------------------------------------// 138 /** 139 * @note 140 * Limitation 1: 141 * On 728, MSPI FLASH and PSRAM share the core clock register. Therefore, 142 * the expected CORE CLOCK frequencies should be the same. 143 */ 144 #if MSPI_TIMING_FLASH_NEEDS_TUNING && MSPI_TIMING_PSRAM_NEEDS_TUNING 145 ESP_STATIC_ASSERT(MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ == MSPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ, "FLASH and PSRAM Mode configuration are not supported"); 146 #define MSPI_TIMING_CORE_CLOCK_MHZ MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 147 148 //If only FLASH needs tuning, the core clock COULD be as FLASH expected 149 #elif MSPI_TIMING_FLASH_NEEDS_TUNING && !MSPI_TIMING_PSRAM_NEEDS_TUNING 150 ESP_STATIC_ASSERT(MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ % MSPI_TIMING_PSRAM_MODULE_CLOCK == 0, "FLASH and PSRAM Mode configuration are not supported"); 151 #define MSPI_TIMING_CORE_CLOCK_MHZ MSPI_TIMING_FLASH_EXPECTED_CORE_CLK_MHZ 152 153 //If only PSRAM needs tuning, the core clock COULD be as PSRAM expected 154 #elif !MSPI_TIMING_FLASH_NEEDS_TUNING && MSPI_TIMING_PSRAM_NEEDS_TUNING 155 ESP_STATIC_ASSERT(MSPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ % MSPI_TIMING_FLASH_MODULE_CLOCK == 0, "FLASH and PSRAM Mode configuration are not supported"); 156 #define MSPI_TIMING_CORE_CLOCK_MHZ MSPI_TIMING_PSRAM_EXPECTED_CORE_CLK_MHZ 157 158 #else 159 #define MSPI_TIMING_CORE_CLOCK_MHZ 80 160 #endif 161 162 /** 163 * @note 164 * Limitation 2: DDR mode requires the core clock divider (core_clk / div = module_clk) to be power of 2. 165 */ 166 #define CHECK_POWER_OF_2(n) ((((n) & ((~(n)) + 1))) == (n)) 167 168 #if MSPI_TIMING_FLASH_DTR_MODE 169 ESP_STATIC_ASSERT(CHECK_POWER_OF_2(MSPI_TIMING_CORE_CLOCK_MHZ / MSPI_TIMING_FLASH_MODULE_CLOCK), "FLASH and PSRAM Mode configuration are not supported"); 170 #endif 171 #if MSPI_TIMING_PSRAM_DTR_MODE 172 ESP_STATIC_ASSERT(CHECK_POWER_OF_2(MSPI_TIMING_CORE_CLOCK_MHZ / MSPI_TIMING_PSRAM_MODULE_CLOCK), "FLASH and PSRAM Mode configuration are not supported"); 173 #endif 174 175 176 //------------------------------------------Helper Macros to get FLASH/PSRAM tuning configs-----------------------------------------------// 177 #define __GET_TUNING_CONFIG(type, core_clock, module_clock, mode) \ 178 (mspi_timing_config_t) { .tuning_config_table = MSPI_TIMING_##type##_CONFIG_TABLE_CORE_CLK_##core_clock##M_MODULE_CLK_##module_clock##M_##mode, \ 179 .available_config_num = MSPI_TIMING_##type##_CONFIG_NUM_CORE_CLK_##core_clock##M_MODULE_CLK_##module_clock##M_##mode, \ 180 .default_config_id = MSPI_TIMING_##type##_DEFAULT_CONFIG_ID_CORE_CLK_##core_clock##M_MODULE_CLK_##module_clock##M_##mode } 181 182 #define _GET_TUNING_CONFIG(type, core_clock, module_clock, mode) __GET_TUNING_CONFIG(type, core_clock, module_clock, mode) 183 184 #define MSPI_TIMING_FLASH_GET_TUNING_CONFIG(core_clock_mhz, module_clock_mhz, mode) _GET_TUNING_CONFIG(FLASH, core_clock_mhz, module_clock_mhz, mode) 185 #define MSPI_TIMING_PSRAM_GET_TUNING_CONFIG(core_clock_mhz, module_clock_mhz, mode) _GET_TUNING_CONFIG(PSRAM, core_clock_mhz, module_clock_mhz, mode) 186 187 188 189 /** 190 * Timing Tuning Parameters 191 */ 192 //FLASH: core clock 160M, module clock 40M, DTR mode 193 #define MSPI_TIMING_FLASH_CONFIG_TABLE_CORE_CLK_160M_MODULE_CLK_40M_DTR_MODE {{1, 0, 0}, {0, 0, 0}, {2, 1, 1}, {2, 0, 1}, {2, 2, 2}, {2, 1, 2}, {1, 0, 1}, {0, 0, 1}} 194 #define MSPI_TIMING_FLASH_CONFIG_NUM_CORE_CLK_160M_MODULE_CLK_40M_DTR_MODE 8 195 #define MSPI_TIMING_FLASH_DEFAULT_CONFIG_ID_CORE_CLK_160M_MODULE_CLK_40M_DTR_MODE 2 196 197 //FLASH: core clock 160M, module clock 80M, DTR mode 198 #define MSPI_TIMING_FLASH_CONFIG_TABLE_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE {{0, 0, 0}, {4, 2, 2}, {2, 1, 2}, {4, 1, 2}, {1, 0, 1}, {4, 0, 2}, {0, 0, 1}, {4, 2, 3}, {2, 1, 3}, {4, 1, 3}, {1, 0, 2}, {4, 0, 3}, {0, 0, 2}, {4, 2, 4}} 199 #define MSPI_TIMING_FLASH_CONFIG_NUM_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE 14 200 #define MSPI_TIMING_FLASH_DEFAULT_CONFIG_ID_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE 1 201 202 //FLASH: core clock 240M, module clock 120M, DTR mode 203 #define MSPI_TIMING_FLASH_CONFIG_TABLE_CORE_CLK_240M_MODULE_CLK_120M_DTR_MODE {{0, 0, 0}, {4, 1, 2}, {1, 0, 1}, {4, 0, 2}, {0, 0, 1}, {4, 1, 3}, {1, 0, 2}, {4, 0, 3}, {0, 0, 2}, {4, 1, 4}, {1, 0, 3}, {4, 0, 4}, {0, 0, 3}, {4, 1, 5}} 204 #define MSPI_TIMING_FLASH_CONFIG_NUM_CORE_CLK_240M_MODULE_CLK_120M_DTR_MODE 14 205 #define MSPI_TIMING_FLASH_DEFAULT_CONFIG_ID_CORE_CLK_240M_MODULE_CLK_120M_DTR_MODE 1 206 207 //FLASH: core clock 160M, module clock 80M, STR mode 208 #define MSPI_TIMING_FLASH_CONFIG_TABLE_CORE_CLK_160M_MODULE_CLK_80M_STR_MODE {{1, 0, 0}, {0, 0, 0}, {2, 1, 1}, {2, 0, 1}, {2, 2, 2}, {2, 1, 2}, {1, 0, 1}, {0, 0, 1}} 209 #define MSPI_TIMING_FLASH_CONFIG_NUM_CORE_CLK_160M_MODULE_CLK_80M_STR_MODE 8 210 #define MSPI_TIMING_FLASH_DEFAULT_CONFIG_ID_CORE_CLK_160M_MODULE_CLK_80M_STR_MODE 2 211 212 //FLASH: core clock 120M, module clock 120M, STR mode 213 #define MSPI_TIMING_FLASH_CONFIG_TABLE_CORE_CLK_120M_MODULE_CLK_120M_STR_MODE {{2, 0, 1}, {0, 0, 0}, {2, 2, 2}, {1, 0, 1}, {2, 0, 2}, {0, 0, 1}, {2, 2, 3}, {1, 0, 2}, {2, 0, 3}, {0, 0, 2}, {2, 2, 4}, {1, 0, 3}} 214 #define MSPI_TIMING_FLASH_CONFIG_NUM_CORE_CLK_120M_MODULE_CLK_120M_STR_MODE 12 215 #define MSPI_TIMING_FLASH_DEFAULT_CONFIG_ID_CORE_CLK_120M_MODULE_CLK_120M_STR_MODE 2 216 217 //FLASH: core clock 240M, module clock 120M, STR mode 218 #define MSPI_TIMING_FLASH_CONFIG_TABLE_CORE_CLK_240M_MODULE_CLK_120M_STR_MODE {{1, 0, 0}, {0, 0, 0}, {1, 1, 1}, {2, 3, 2}, {1, 0, 1}, {0, 0, 1}, {1, 1, 2}, {2, 3, 3}, {1, 0, 2}, {0, 0, 2}, {1, 1, 3}, {2, 3, 4}} 219 #define MSPI_TIMING_FLASH_CONFIG_NUM_CORE_CLK_240M_MODULE_CLK_120M_STR_MODE 12 220 #define MSPI_TIMING_FLASH_DEFAULT_CONFIG_ID_CORE_CLK_240M_MODULE_CLK_120M_STR_MODE 2 221 222 //PSRAM: core clock 80M, module clock 40M, DTR mode 223 #define MSPI_TIMING_PSRAM_CONFIG_TABLE_CORE_CLK_80M_MODULE_CLK_40M_DTR_MODE {{1, 0, 0}, {2, 1, 1}, {2, 0, 1}, {0, 0, 0}, {3, 1, 1}, {3, 0, 1}, {1, 0, 1}, {2, 1, 2}, {2, 0, 2}, {0, 0, 1}, {3, 1, 2}, {3, 0, 2}} 224 #define MSPI_TIMING_PSRAM_CONFIG_NUM_CORE_CLK_80M_MODULE_CLK_40M_DTR_MODE 12 225 #define MSPI_TIMING_PSRAM_DEFAULT_CONFIG_ID_CORE_CLK_80M_MODULE_CLK_40M_DTR_MODE 4 226 227 //PSRAM: core clock 160M, module clock 80M, DTR mode 228 #define MSPI_TIMING_PSRAM_CONFIG_TABLE_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE {{0, 0, 0}, {4, 2, 2}, {2, 1, 2}, {4, 1, 2}, {1, 0, 1}, {4, 0, 2}, {0, 0, 1}, {4, 2, 3}, {2, 1, 3}, {4, 1, 3}, {1, 0, 2}, {4, 0, 3}, {0, 0, 2}, {4, 2, 4}} 229 #define MSPI_TIMING_PSRAM_CONFIG_NUM_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE 14 230 #define MSPI_TIMING_PSRAM_DEFAULT_CONFIG_ID_CORE_CLK_160M_MODULE_CLK_80M_DTR_MODE 5 231 232 //PSRAM: core clock 240M, module clock 120M, STR mode 233 #define MSPI_TIMING_PSRAM_CONFIG_TABLE_CORE_CLK_240M_MODULE_CLK_120M_STR_MODE {{1, 0, 0}, {0, 0, 0}, {1, 1, 1}, {2, 3, 2}, {1, 0, 1}, {0, 0, 1}, {1, 1, 2}, {2, 3, 3}, {1, 0, 2}, {0, 0, 2}, {1, 1, 3}, {2, 3, 4}} 234 #define MSPI_TIMING_PSRAM_CONFIG_NUM_CORE_CLK_240M_MODULE_CLK_120M_STR_MODE 12 235 #define MSPI_TIMING_PSRAM_DEFAULT_CONFIG_ID_CORE_CLK_240M_MODULE_CLK_120M_STR_MODE 2 236 237 //PSRAM: core clock 120M, module clock 120M, STR mode 238 #define MSPI_TIMING_PSRAM_CONFIG_TABLE_CORE_CLK_120M_MODULE_CLK_120M_STR_MODE {{2, 0, 1}, {0, 0, 0}, {2, 2, 2}, {1, 0, 1}, {2, 0, 2}, {0, 0, 1}, {2, 2, 3}, {1, 0, 2}, {2, 0, 3}, {0, 0, 2}, {2, 2, 4}, {1, 0, 3}} 239 #define MSPI_TIMING_PSRAM_CONFIG_NUM_CORE_CLK_120M_MODULE_CLK_120M_STR_MODE 12 240 #define MSPI_TIMING_PSRAM_DEFAULT_CONFIG_ID_CORE_CLK_120M_MODULE_CLK_120M_STR_MODE 2 241 242 //PSRAM: core clock 240M, module clock 120M, DTR mode 243 #define MSPI_TIMING_PSRAM_CONFIG_TABLE_CORE_CLK_240M_MODULE_CLK_120M_DTR_MODE {{0, 0, 0}, {4, 1, 2}, {1, 0, 1}, {4, 0, 2}, {0, 0, 1}, {4, 1, 3}, {1, 0, 2}, {4, 0, 3}, {0, 0, 2}, {4, 1, 4}, {1, 0, 3}, {4, 0, 4}, {0, 0, 3}, {4, 1, 5}} 244 #define MSPI_TIMING_PSRAM_CONFIG_NUM_CORE_CLK_240M_MODULE_CLK_120M_DTR_MODE 14 245 #define MSPI_TIMING_PSRAM_DEFAULT_CONFIG_ID_CORE_CLK_240M_MODULE_CLK_120M_DTR_MODE 1 246 247 //------------------------------------------Frequency Scanning Related-----------------------------------------------// 248 /** 249 * On ESP32S3, only module clock 120M, DDR mode needs frequency scan. Frequency scanning is to get the max workable PLL 250 * frequency under each successfull timing tuning configuration. PLL frequency may fluctuate under high temperature, 251 * this method is to get the tuning configuration that can work under higher PLL frequency. 252 */ 253 #define MSPI_TIMING_PLL_FREQ_SCAN_RANGE_MHZ_MIN 440 254 #define MSPI_TIMING_PLL_FREQ_SCAN_RANGE_MHZ_MAX 600 255 #define MSPI_TIMING_PLL_FREQ_SCAN_THRESH_MHZ_LOW 448 256 #define MSPI_TIMING_PLL_FREQ_SCAN_THRESH_MHZ_HIGH 520 257 #define MSPI_TIMING_PLL_FREQ_SCAN_STEP_MHZ_MODULE_CLK_120M 8 258