drv_flexspi.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-09-14 xjy198903 the first version for 1170
  9. */
  10. #include <rtthread.h>
  11. #ifdef BSP_USING_FLEXSPI
  12. #include "board.h"
  13. #include <rtdevice.h>
  14. #ifdef RT_USING_FINSH
  15. #include <finsh.h>
  16. #endif
  17. #include "flexspi_port.h"
  18. #include "fsl_flexspi.h"
  19. #define COMBINATION_MODE 1U
  20. #define FREE_RUNNING_MODE 1U
  21. #define FLEXSPI_DEBUG
  22. #define LOG_TAG "drv.flexspi"
  23. #include <drv_log.h>
  24. static flexspi_device_config_t deviceconfig = {
  25. .flexspiRootClk = 12000000,
  26. .flashSize = FLASH_SIZE,
  27. .CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle,
  28. .CSInterval = 2,
  29. .CSHoldTime = 3,
  30. .CSSetupTime = 3,
  31. .dataValidTime = 0,
  32. .columnspace = 0,
  33. .enableWordAddress = 0,
  34. .AWRSeqIndex = AWR_SEQ_INDEX,
  35. .AWRSeqNumber = AWR_SEQ_NUMBER,
  36. .ARDSeqIndex = ARD_SEQ_INDEX,
  37. .ARDSeqNumber = ARD_SEQ_NUMBER,
  38. .AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,
  39. .AHBWriteWaitInterval = 0,
  40. };
  41. const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
  42. /* 8bit mode */
  43. [4 * ARD_SEQ_INDEX] =
  44. FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_8PAD, 0),
  45. };
  46. static void flexspi_clock_init(clock_root_t root, uint8_t src, uint8_t div)
  47. {
  48. /*Clock setting for flexspi1*/
  49. CLOCK_SetRootClockDiv(root, div);
  50. CLOCK_SetRootClockMux(root, src);
  51. }
  52. static int rt_hw_imxrt_flexspi_init(void)
  53. {
  54. flexspi_config_t config;
  55. FLEXSPI_Type *base;
  56. #ifdef BSP_USING_FLEXSPI1
  57. base = FLEXSPI1_CONTROL_BASE;
  58. #else
  59. base = FLEXSPI2_CONTROL_BASE;
  60. #endif
  61. //Set root clk 80MHz
  62. flexspi_clock_init(kCLOCK_Root_Flexspi1, CLOCK_SRC, CLOCK_DIV);
  63. /*Get FLEXSPI default settings and configure the flexspi. */
  64. FLEXSPI_GetDefaultConfig(&config);
  65. /*Set AHB buffer size for reading data through AHB bus. */
  66. config.ahbConfig.enableAHBPrefetch = true;
  67. config.ahbConfig.enableAHBBufferable = true;
  68. config.ahbConfig.enableReadAddressOpt = true;
  69. config.ahbConfig.enableAHBCachable = true;
  70. config.ahbConfig.enableClearAHBBufferOpt = true;
  71. config.rxSampleClock = FLEXSPI_RX_SAMPLE_CLOCK;
  72. if(COMBINATION_MODE)
  73. {
  74. config.enableCombination = true;
  75. }
  76. if(FREE_RUNNING_MODE)
  77. {
  78. config.enableSckFreeRunning = true;
  79. }
  80. FLEXSPI_Init(base, &config);
  81. /* Configure flash settings according to serial flash feature. */
  82. FLEXSPI_SetFlashConfig(base, &deviceconfig, FLASH_PORT);
  83. /* Update LUT table. */
  84. FLEXSPI_UpdateLUT(base, 0, customLUT, CUSTOM_LUT_LENGTH);
  85. /* Do software reset. */
  86. FLEXSPI_SoftwareReset(base);
  87. return 0;
  88. }
  89. INIT_DEVICE_EXPORT(rt_hw_imxrt_flexspi_init);
  90. #ifdef FLEXSPI_DEBUG
  91. #ifdef FINSH_USING_MSH
  92. #define FLEXSPI_DATALEN 4U
  93. static rt_uint32_t send_buf[FLEXSPI_DATALEN] = {0x11223344, 0x55667788, 0x12345678, 0x9900aabb};
  94. static uint32_t recv_buf[FLEXSPI_DATALEN];
  95. /* read write 32bit test */
  96. static void flexspi_test(void)
  97. {
  98. volatile rt_uint32_t *flexspi = (rt_uint32_t *)FLEXSPI1_AHB_DATA_ADDRESS; /* FLEXSPI1 start address. */
  99. LOG_D("FLEXSPI Memory 32 bit Write Start\n");
  100. *(flexspi + 15) = send_buf[3];
  101. *(flexspi + 8) = send_buf[1];
  102. *(flexspi + 11) = send_buf[2];
  103. *(flexspi + 3) = send_buf[0];
  104. LOG_D("FLEXSPI Memory 32 bit Write End\n");
  105. rt_memset(recv_buf, 0, sizeof(recv_buf));
  106. LOG_D("FLEXSPI Memory 32 bit Read Start\n");
  107. recv_buf[2] = *(flexspi + 11);
  108. recv_buf[3] = *(flexspi + 15);
  109. recv_buf[1] = *(flexspi + 8);
  110. recv_buf[0] = *(flexspi + 3);
  111. LOG_D("FLEXSPI Memory 32 bit Read End\n");
  112. LOG_D("addr12 is 0x%x\n", recv_buf[0]);
  113. LOG_D("addr32 is 0x%x\n", recv_buf[1]);
  114. LOG_D("addr44 is 0x%x\n", recv_buf[2]);
  115. LOG_D("addr60 is 0x%x\n", recv_buf[3]);
  116. }
  117. MSH_CMD_EXPORT(flexspi_test, flexspi test)
  118. #endif /* FLEXSPI_DEBUG */
  119. #endif /* FINSH_USING_MSH */
  120. #endif /* BSP_USING_FLEXSPI */