mspi_timing_config.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * SPDX-FileCopyrightText: 2019-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <sys/param.h>
  7. #include "sdkconfig.h"
  8. #include "esp_attr.h"
  9. #include "esp_err.h"
  10. #include "esp_types.h"
  11. #include "esp_log.h"
  12. #include "soc/soc_caps.h"
  13. #include "mspi_timing_config.h"
  14. #if SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY
  15. #include "mspi_timing_tuning_configs.h"
  16. #include "hal/mspi_timing_tuning_ll.h"
  17. #endif
  18. #if SOC_MEMSPI_CORE_CLK_SHARED_WITH_PSRAM
  19. #define FLASH_LOW_SPEED_CORE_CLOCK_MHZ MSPI_TIMING_LL_CORE_CLOCK_MHZ_DEFAULT
  20. #define FLASH_HIGH_SPEED_CORE_CLOCK_MHZ MSPI_TIMING_CORE_CLOCK_MHZ
  21. #define PSRAM_LOW_SPEED_CORE_CLOCK_MHZ MSPI_TIMING_LL_CORE_CLOCK_MHZ_DEFAULT
  22. #define PSRAM_HIGH_SPEED_CORE_CLOCK_MHZ MSPI_TIMING_CORE_CLOCK_MHZ
  23. #endif //SOC_MEMSPI_CORE_CLK_SHARED_WITH_PSRAM
  24. #if SOC_SPI_MEM_SUPPORT_TIMING_TUNING
  25. /**
  26. * Currently we only need these on chips with timing tuning
  27. */
  28. //-------------------------------------MSPI Clock Setting-------------------------------------//
  29. static void s_mspi_flash_set_core_clock(uint8_t spi_num, uint32_t core_clock_mhz)
  30. {
  31. mspi_timing_ll_set_core_clock(spi_num, core_clock_mhz);
  32. }
  33. static void s_mspi_psram_set_core_clock(uint8_t spi_num, uint32_t core_clock_mhz)
  34. {
  35. mspi_timing_ll_set_core_clock(spi_num, core_clock_mhz);
  36. }
  37. void mspi_timing_config_set_flash_clock(uint32_t flash_freq_mhz, mspi_timing_speed_mode_t speed_mode, bool control_both_mspi)
  38. {
  39. uint32_t core_clock_mhz = 0;
  40. if (speed_mode == MSPI_TIMING_SPEED_MODE_LOW_PERF) {
  41. core_clock_mhz = FLASH_LOW_SPEED_CORE_CLOCK_MHZ;
  42. } else {
  43. core_clock_mhz = FLASH_HIGH_SPEED_CORE_CLOCK_MHZ;
  44. }
  45. //SPI0 and SPI1 share the register for core clock. So we only set SPI0 here.
  46. s_mspi_flash_set_core_clock(0, core_clock_mhz);
  47. uint32_t freqdiv = core_clock_mhz / flash_freq_mhz;
  48. assert(freqdiv > 0);
  49. mspi_timing_ll_set_flash_clock(0, freqdiv);
  50. if (control_both_mspi) {
  51. mspi_timing_ll_set_flash_clock(1, freqdiv);
  52. }
  53. }
  54. void mspi_timing_config_set_psram_clock(uint32_t psram_freq_mhz, mspi_timing_speed_mode_t speed_mode, bool control_both_mspi)
  55. {
  56. (void)control_both_mspi; // for compatibility
  57. uint32_t core_clock_mhz = 0;
  58. if (speed_mode == MSPI_TIMING_SPEED_MODE_LOW_PERF) {
  59. core_clock_mhz = PSRAM_LOW_SPEED_CORE_CLOCK_MHZ;
  60. } else {
  61. core_clock_mhz = PSRAM_HIGH_SPEED_CORE_CLOCK_MHZ;
  62. }
  63. //SPI0 and SPI1 share the register for core clock. So we only set SPI0 here.
  64. s_mspi_psram_set_core_clock(0, core_clock_mhz);
  65. uint32_t freqdiv = core_clock_mhz / psram_freq_mhz;
  66. assert(freqdiv > 0);
  67. mspi_timing_ll_set_psram_clock(0, freqdiv);
  68. }
  69. #endif //#if SOC_SPI_MEM_SUPPORT_TIMING_TUNING