spiram_psram.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. /*
  2. Driver bits for PSRAM chips (at the moment only the ESP-PSRAM32 chip).
  3. */
  4. // Copyright 2013-2017 Espressif Systems (Shanghai) PTE LTD
  5. //
  6. // Licensed under the Apache License, Version 2.0 (the "License");
  7. // you may not use this file except in compliance with the License.
  8. // You may obtain a copy of the License at
  9. //
  10. // http://www.apache.org/licenses/LICENSE-2.0
  11. //
  12. // Unless required by applicable law or agreed to in writing, software
  13. // distributed under the License is distributed on an "AS IS" BASIS,
  14. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. // See the License for the specific language governing permissions and
  16. // limitations under the License.
  17. #include "sdkconfig.h"
  18. #include "string.h"
  19. #include "esp_attr.h"
  20. #include "esp_err.h"
  21. #include "esp_types.h"
  22. #include "esp_log.h"
  23. #include "spiram_psram.h"
  24. #include "rom/ets_sys.h"
  25. #include "rom/spi_flash.h"
  26. #include "rom/gpio.h"
  27. #include "rom/cache.h"
  28. #include "soc/io_mux_reg.h"
  29. #include "soc/dport_reg.h"
  30. #include "soc/gpio_sig_map.h"
  31. #include "soc/efuse_reg.h"
  32. #include "driver/gpio.h"
  33. #include "driver/spi_common.h"
  34. #include "driver/periph_ctrl.h"
  35. #if CONFIG_SPIRAM_SUPPORT
  36. //Commands for PSRAM chip
  37. #define PSRAM_READ 0x03
  38. #define PSRAM_FAST_READ 0x0B
  39. #define PSRAM_FAST_READ_DUMMY 0x3
  40. #define PSRAM_FAST_READ_QUAD 0xEB
  41. #define PSRAM_WRITE 0x02
  42. #define PSRAM_QUAD_WRITE 0x38
  43. #define PSRAM_ENTER_QMODE 0x35
  44. #define PSRAM_EXIT_QMODE 0xF5
  45. #define PSRAM_RESET_EN 0x66
  46. #define PSRAM_RESET 0x99
  47. #define PSRAM_SET_BURST_LEN 0xC0
  48. #define PSRAM_DEVICE_ID 0x9F
  49. #if CONFIG_SPIRAM_TYPE_ESPPSRAM32
  50. #define PSRAM_MFG_ID_M 0xff
  51. #define PSRAM_MFG_ID_S 8
  52. #define PSRAM_MFG_ID_V 0x5d
  53. #endif
  54. // IO-pins for PSRAM. These need to be in the VDD_SIO power domain because all chips we
  55. // currently support are 1.8V parts.
  56. // WARNING: PSRAM shares all but the CS and CLK pins with the flash, so these defines
  57. // hardcode the flash pins as well, making this code incompatible with either a setup
  58. // that has the flash on non-standard pins or ESP32s with built-in flash.
  59. #define FLASH_CLK_IO 6 //Psram clock is a delayed version of this in 40MHz mode
  60. #define FLASH_CS_IO 11
  61. #define PSRAM_CLK_IO 17
  62. #define PSRAM_CS_IO 16
  63. #define PSRAM_SPIQ_IO 7
  64. #define PSRAM_SPID_IO 8
  65. #define PSRAM_SPIWP_IO 10
  66. #define PSRAM_SPIHD_IO 9
  67. #define PSRAM_INTERNAL_IO_28 28
  68. #define PSRAM_INTERNAL_IO_29 29
  69. #define PSRAM_IO_MATRIX_DUMMY_40M 1
  70. #define PSRAM_IO_MATRIX_DUMMY_80M 2
  71. #if CONFIG_FLASHMODE_QIO
  72. #define SPI_CACHE_DUMMY SPI0_R_QIO_DUMMY_CYCLELEN //qio 3
  73. #elif CONFIG_FLASHMODE_QOUT
  74. #define SPI_CACHE_DUMMY SPI0_R_FAST_DUMMY_CYCLELEN //qout 7
  75. #elif CONFIG_FLASHMODE_DIO
  76. #define SPI_CACHE_DUMMY SPI0_R_DIO_DUMMY_CYCLELEN //dio 3
  77. #elif CONFIG_FLASHMODE_DOUT
  78. #define SPI_CACHE_DUMMY SPI0_R_FAST_DUMMY_CYCLELEN //dout 7
  79. #endif
  80. static const char* TAG = "psram";
  81. typedef enum {
  82. PSRAM_SPI_1 = 0x1,
  83. PSRAM_SPI_2,
  84. PSRAM_SPI_3,
  85. PSRAM_SPI_MAX ,
  86. } psram_spi_num_t;
  87. static psram_cache_mode_t s_psram_mode = PSRAM_CACHE_MAX;
  88. /* dummy_len_plus values defined in ROM for SPI flash configuration */
  89. extern uint8_t g_rom_spiflash_dummy_len_plus[];
  90. static int extra_dummy = 0;
  91. typedef enum {
  92. PSRAM_CMD_QPI,
  93. PSRAM_CMD_SPI,
  94. } psram_cmd_mode_t;
  95. typedef struct {
  96. uint16_t cmd; /*!< Command value */
  97. uint16_t cmdBitLen; /*!< Command byte length*/
  98. uint32_t *addr; /*!< Point to address value*/
  99. uint16_t addrBitLen; /*!< Address byte length*/
  100. uint32_t *txData; /*!< Point to send data buffer*/
  101. uint16_t txDataBitLen; /*!< Send data byte length.*/
  102. uint32_t *rxData; /*!< Point to recevie data buffer*/
  103. uint16_t rxDataBitLen; /*!< Recevie Data byte length.*/
  104. uint32_t dummyBitLen;
  105. } psram_cmd_t;
  106. static void IRAM_ATTR psram_cache_init(psram_cache_mode_t psram_cache_mode, psram_vaddr_mode_t vaddrmode);
  107. static void psram_clear_spi_fifo(psram_spi_num_t spi_num)
  108. {
  109. int i;
  110. for (i = 0; i < 16; i++) {
  111. WRITE_PERI_REG(SPI_W0_REG(spi_num)+i*4, 0);
  112. }
  113. }
  114. //set basic SPI write mode
  115. static void psram_set_basic_write_mode(psram_spi_num_t spi_num)
  116. {
  117. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_FWRITE_QIO);
  118. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_FWRITE_DIO);
  119. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_FWRITE_QUAD);
  120. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_FWRITE_DUAL);
  121. }
  122. //set QPI write mode
  123. static void psram_set_qio_write_mode(psram_spi_num_t spi_num)
  124. {
  125. SET_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_FWRITE_QIO);
  126. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_FWRITE_DIO);
  127. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_FWRITE_QUAD);
  128. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_FWRITE_DUAL);
  129. }
  130. //set QPI read mode
  131. static void psram_set_qio_read_mode(psram_spi_num_t spi_num)
  132. {
  133. SET_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_FREAD_QIO);
  134. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_FREAD_QUAD);
  135. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_FREAD_DUAL);
  136. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_FREAD_DIO);
  137. }
  138. //set SPI read mode
  139. static void psram_set_basic_read_mode(psram_spi_num_t spi_num)
  140. {
  141. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_FREAD_QIO);
  142. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_FREAD_QUAD);
  143. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_FREAD_DUAL);
  144. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_FREAD_DIO);
  145. }
  146. //start sending cmd/addr and optionally, receiving data
  147. static void IRAM_ATTR psram_cmd_recv_start(psram_spi_num_t spi_num, uint32_t* pRxData, uint16_t rxByteLen,
  148. psram_cmd_mode_t cmd_mode)
  149. {
  150. //get cs1
  151. CLEAR_PERI_REG_MASK(SPI_PIN_REG(PSRAM_SPI_1), SPI_CS1_DIS_M);
  152. SET_PERI_REG_MASK(SPI_PIN_REG(PSRAM_SPI_1), SPI_CS0_DIS_M);
  153. uint32_t mode_backup = (READ_PERI_REG(SPI_USER_REG(spi_num)) >> SPI_FWRITE_DUAL_S) & 0xf;
  154. uint32_t rd_mode_backup = READ_PERI_REG(SPI_CTRL_REG(spi_num)) & (SPI_FREAD_DIO_M | SPI_FREAD_DUAL_M | SPI_FREAD_QUAD_M | SPI_FREAD_QIO_M);
  155. if (cmd_mode == PSRAM_CMD_SPI) {
  156. psram_set_basic_write_mode(spi_num);
  157. psram_set_basic_read_mode(spi_num);
  158. } else if (cmd_mode == PSRAM_CMD_QPI) {
  159. psram_set_qio_write_mode(spi_num);
  160. psram_set_qio_read_mode(spi_num);
  161. }
  162. //Wait for SPI0 to idle
  163. while ( READ_PERI_REG(SPI_EXT2_REG(0)) != 0);
  164. DPORT_SET_PERI_REG_MASK(DPORT_HOST_INF_SEL_REG, 1 << 14);
  165. // Start send data
  166. SET_PERI_REG_MASK(SPI_CMD_REG(spi_num), SPI_USR);
  167. while ((READ_PERI_REG(SPI_CMD_REG(spi_num)) & SPI_USR));
  168. DPORT_CLEAR_PERI_REG_MASK(DPORT_HOST_INF_SEL_REG, 1 << 14);
  169. //recover spi mode
  170. SET_PERI_REG_BITS(SPI_USER_REG(spi_num), (pRxData?SPI_FWRITE_DUAL_M:0xf), mode_backup, SPI_FWRITE_DUAL_S);
  171. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), (SPI_FREAD_DIO_M|SPI_FREAD_DUAL_M|SPI_FREAD_QUAD_M|SPI_FREAD_QIO_M));
  172. SET_PERI_REG_MASK(SPI_CTRL_REG(spi_num), rd_mode_backup);
  173. //return cs to cs0
  174. SET_PERI_REG_MASK(SPI_PIN_REG(PSRAM_SPI_1), SPI_CS1_DIS_M);
  175. CLEAR_PERI_REG_MASK(SPI_PIN_REG(PSRAM_SPI_1), SPI_CS0_DIS_M);
  176. if (pRxData) {
  177. int idx = 0;
  178. // Read data out
  179. do {
  180. *pRxData++ = READ_PERI_REG(SPI_W0_REG(spi_num) + (idx << 2));
  181. } while (++idx < ((rxByteLen / 4) + ((rxByteLen % 4) ? 1 : 0)));
  182. }
  183. }
  184. static uint32_t backup_usr[3];
  185. static uint32_t backup_usr1[3];
  186. static uint32_t backup_usr2[3];
  187. //setup spi command/addr/data/dummy in user mode
  188. static int psram_cmd_config(psram_spi_num_t spi_num, psram_cmd_t* pInData)
  189. {
  190. while (READ_PERI_REG(SPI_CMD_REG(spi_num)) & SPI_USR);
  191. backup_usr[spi_num]=READ_PERI_REG(SPI_USER_REG(spi_num));
  192. backup_usr1[spi_num]=READ_PERI_REG(SPI_USER1_REG(spi_num));
  193. backup_usr2[spi_num]=READ_PERI_REG(SPI_USER2_REG(spi_num));
  194. // Set command by user.
  195. if (pInData->cmdBitLen != 0) {
  196. // Max command length 16 bits.
  197. SET_PERI_REG_BITS(SPI_USER2_REG(spi_num), SPI_USR_COMMAND_BITLEN, pInData->cmdBitLen - 1,
  198. SPI_USR_COMMAND_BITLEN_S);
  199. // Enable command
  200. SET_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_USR_COMMAND);
  201. // Load command,bit15-0 is cmd value.
  202. SET_PERI_REG_BITS(SPI_USER2_REG(spi_num), SPI_USR_COMMAND_VALUE, pInData->cmd, SPI_USR_COMMAND_VALUE_S);
  203. } else {
  204. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_USR_COMMAND);
  205. SET_PERI_REG_BITS(SPI_USER2_REG(spi_num), SPI_USR_COMMAND_BITLEN, 0, SPI_USR_COMMAND_BITLEN_S);
  206. }
  207. // Set Address by user.
  208. if (pInData->addrBitLen != 0) {
  209. SET_PERI_REG_BITS(SPI_USER1_REG(spi_num), SPI_USR_ADDR_BITLEN, (pInData->addrBitLen - 1), SPI_USR_ADDR_BITLEN_S);
  210. // Enable address
  211. SET_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_USR_ADDR);
  212. // Set address
  213. WRITE_PERI_REG(SPI_ADDR_REG(spi_num), *pInData->addr);
  214. } else {
  215. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_USR_ADDR);
  216. SET_PERI_REG_BITS(SPI_USER1_REG(spi_num), SPI_USR_ADDR_BITLEN, 0, SPI_USR_ADDR_BITLEN_S);
  217. }
  218. // Set data by user.
  219. uint32_t* p_tx_val = pInData->txData;
  220. if (pInData->txDataBitLen != 0) {
  221. // Enable MOSI
  222. SET_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_USR_MOSI);
  223. // Load send buffer
  224. int len = (pInData->txDataBitLen + 31) / 32;
  225. if (p_tx_val != NULL) {
  226. memcpy((void*)SPI_W0_REG(spi_num), p_tx_val, len * 4);
  227. }
  228. // Set data send buffer length.Max data length 64 bytes.
  229. SET_PERI_REG_BITS(SPI_MOSI_DLEN_REG(spi_num), SPI_USR_MOSI_DBITLEN, (pInData->txDataBitLen - 1),
  230. SPI_USR_MOSI_DBITLEN_S);
  231. } else {
  232. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_USR_MOSI);
  233. SET_PERI_REG_BITS(SPI_MOSI_DLEN_REG(spi_num), SPI_USR_MOSI_DBITLEN, 0, SPI_USR_MOSI_DBITLEN_S);
  234. }
  235. // Set rx data by user.
  236. if (pInData->rxDataBitLen != 0) {
  237. // Enable MOSI
  238. SET_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_USR_MISO);
  239. // Set data send buffer length.Max data length 64 bytes.
  240. SET_PERI_REG_BITS(SPI_MISO_DLEN_REG(spi_num), SPI_USR_MISO_DBITLEN, (pInData->rxDataBitLen - 1),
  241. SPI_USR_MISO_DBITLEN_S);
  242. } else {
  243. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_USR_MISO);
  244. SET_PERI_REG_BITS(SPI_MISO_DLEN_REG(spi_num), SPI_USR_MISO_DBITLEN, 0, SPI_USR_MISO_DBITLEN_S);
  245. }
  246. if (pInData->dummyBitLen != 0) {
  247. SET_PERI_REG_MASK(SPI_USER_REG(PSRAM_SPI_1), SPI_USR_DUMMY); // dummy en
  248. SET_PERI_REG_BITS(SPI_USER1_REG(PSRAM_SPI_1), SPI_USR_DUMMY_CYCLELEN_V, pInData->dummyBitLen - 1,
  249. SPI_USR_DUMMY_CYCLELEN_S); //DUMMY
  250. } else {
  251. CLEAR_PERI_REG_MASK(SPI_USER_REG(PSRAM_SPI_1), SPI_USR_DUMMY); // dummy en
  252. SET_PERI_REG_BITS(SPI_USER1_REG(PSRAM_SPI_1), SPI_USR_DUMMY_CYCLELEN_V, 0, SPI_USR_DUMMY_CYCLELEN_S); //DUMMY
  253. }
  254. return 0;
  255. }
  256. void psram_cmd_end(int spi_num) {
  257. while (READ_PERI_REG(SPI_CMD_REG(spi_num)) & SPI_USR);
  258. WRITE_PERI_REG(SPI_USER_REG(spi_num), backup_usr[spi_num]);
  259. WRITE_PERI_REG(SPI_USER1_REG(spi_num), backup_usr1[spi_num]);
  260. WRITE_PERI_REG(SPI_USER2_REG(spi_num), backup_usr2[spi_num]);
  261. }
  262. //exit QPI mode(set back to SPI mode)
  263. static void psram_disable_qio_mode(psram_spi_num_t spi_num)
  264. {
  265. psram_cmd_t ps_cmd;
  266. uint32_t cmd_exit_qpi;
  267. switch (s_psram_mode) {
  268. case PSRAM_CACHE_F80M_S80M:
  269. cmd_exit_qpi = PSRAM_EXIT_QMODE;
  270. ps_cmd.txDataBitLen = 8;
  271. break;
  272. case PSRAM_CACHE_F80M_S40M:
  273. case PSRAM_CACHE_F40M_S40M:
  274. default:
  275. cmd_exit_qpi = PSRAM_EXIT_QMODE << 8;
  276. ps_cmd.txDataBitLen = 16;
  277. break;
  278. }
  279. ps_cmd.txData = &cmd_exit_qpi;
  280. ps_cmd.cmd = 0;
  281. ps_cmd.cmdBitLen = 0;
  282. ps_cmd.addr = 0;
  283. ps_cmd.addrBitLen = 0;
  284. ps_cmd.rxData = NULL;
  285. ps_cmd.rxDataBitLen = 0;
  286. ps_cmd.dummyBitLen = 0;
  287. psram_cmd_config(spi_num, &ps_cmd);
  288. psram_cmd_recv_start(spi_num, NULL, 0, PSRAM_CMD_QPI);
  289. psram_cmd_end(spi_num);
  290. }
  291. //read psram id
  292. static void psram_read_id(uint32_t* dev_id)
  293. {
  294. psram_spi_num_t spi_num = PSRAM_SPI_1;
  295. psram_disable_qio_mode(spi_num);
  296. uint32_t addr = (PSRAM_DEVICE_ID << 24) | 0;
  297. uint32_t dummy_bits = 0;
  298. psram_cmd_t ps_cmd;
  299. switch (s_psram_mode) {
  300. case PSRAM_CACHE_F80M_S80M:
  301. dummy_bits = 0 + extra_dummy;
  302. ps_cmd.cmdBitLen = 0;
  303. break;
  304. case PSRAM_CACHE_F80M_S40M:
  305. case PSRAM_CACHE_F40M_S40M:
  306. default:
  307. dummy_bits = 0 + extra_dummy;
  308. ps_cmd.cmdBitLen = 2; //this two bits is used to delay 2 clock cycle
  309. break;
  310. }
  311. ps_cmd.cmd = 0;
  312. ps_cmd.addr = &addr;
  313. ps_cmd.addrBitLen = 4 * 8;
  314. ps_cmd.txDataBitLen = 0;
  315. ps_cmd.txData = NULL;
  316. ps_cmd.rxDataBitLen = 4 * 8;
  317. ps_cmd.rxData = dev_id;
  318. ps_cmd.dummyBitLen = dummy_bits;
  319. psram_cmd_config(spi_num, &ps_cmd);
  320. psram_clear_spi_fifo(spi_num);
  321. psram_cmd_recv_start(spi_num, ps_cmd.rxData, ps_cmd.rxDataBitLen / 8, PSRAM_CMD_SPI);
  322. psram_cmd_end(spi_num);
  323. }
  324. //enter QPI mode
  325. static esp_err_t IRAM_ATTR psram_enable_qio_mode(psram_spi_num_t spi_num)
  326. {
  327. psram_cmd_t ps_cmd;
  328. uint32_t addr = (PSRAM_ENTER_QMODE << 24) | 0;
  329. switch (s_psram_mode) {
  330. case PSRAM_CACHE_F80M_S80M:
  331. ps_cmd.cmdBitLen = 0;
  332. break;
  333. case PSRAM_CACHE_F80M_S40M:
  334. case PSRAM_CACHE_F40M_S40M:
  335. default:
  336. ps_cmd.cmdBitLen = 2;
  337. break;
  338. }
  339. ps_cmd.cmd = 0;
  340. ps_cmd.addr = &addr;
  341. ps_cmd.addrBitLen = 8;
  342. ps_cmd.txData = NULL;
  343. ps_cmd.txDataBitLen = 0;
  344. ps_cmd.rxData = NULL;
  345. ps_cmd.rxDataBitLen = 0;
  346. ps_cmd.dummyBitLen = 0;
  347. psram_cmd_config(spi_num, &ps_cmd);
  348. psram_cmd_recv_start(spi_num, NULL, 0, PSRAM_CMD_SPI);
  349. psram_cmd_end(spi_num);
  350. return ESP_OK;
  351. }
  352. //spi param init for psram
  353. void IRAM_ATTR psram_spi_init(psram_spi_num_t spi_num, psram_cache_mode_t mode)
  354. {
  355. uint8_t i, k;
  356. CLEAR_PERI_REG_MASK(SPI_SLAVE_REG(spi_num), SPI_TRANS_DONE << 5);
  357. SET_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_CS_SETUP);
  358. // SPI_CPOL & SPI_CPHA
  359. CLEAR_PERI_REG_MASK(SPI_PIN_REG(spi_num), SPI_CK_IDLE_EDGE);
  360. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_CK_OUT_EDGE);
  361. // SPI bit order
  362. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_WR_BIT_ORDER);
  363. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(spi_num), SPI_RD_BIT_ORDER);
  364. // SPI bit order
  365. CLEAR_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_DOUTDIN);
  366. // May be not must to do.
  367. WRITE_PERI_REG(SPI_USER1_REG(spi_num), 0);
  368. // SPI mode type
  369. CLEAR_PERI_REG_MASK(SPI_SLAVE_REG(spi_num), SPI_SLAVE_MODE);
  370. // Set SPI speed for non-80M mode. (80M mode uses APB clock directly.)
  371. if (mode!=PSRAM_CACHE_F80M_S80M) {
  372. i = 1; //Pre-divider
  373. k = 2; //Main divider. Divide by 2 so we get 40MHz
  374. //clear bit 31, set SPI clock div
  375. CLEAR_PERI_REG_MASK(SPI_CLOCK_REG(spi_num), SPI_CLK_EQU_SYSCLK);
  376. WRITE_PERI_REG(SPI_CLOCK_REG(spi_num),
  377. (((i - 1) & SPI_CLKDIV_PRE) << SPI_CLKDIV_PRE_S) |
  378. (((k - 1) & SPI_CLKCNT_N) << SPI_CLKCNT_N_S) |
  379. ((((k + 1) / 2 - 1) & SPI_CLKCNT_H) << SPI_CLKCNT_H_S) | //50% duty cycle
  380. (((k - 1) & SPI_CLKCNT_L) << SPI_CLKCNT_L_S));
  381. }
  382. // Enable MOSI
  383. SET_PERI_REG_MASK(SPI_USER_REG(spi_num), SPI_CS_SETUP | SPI_CS_HOLD | SPI_USR_MOSI);
  384. memset((void*)SPI_W0_REG(spi_num), 0, 16 * 4);
  385. }
  386. static void IRAM_ATTR psram_gpio_config(psram_cache_mode_t mode)
  387. {
  388. gpio_matrix_out(FLASH_CS_IO, SPICS0_OUT_IDX, 0, 0);
  389. gpio_matrix_out(PSRAM_SPIQ_IO, SPIQ_OUT_IDX, 0, 0);
  390. gpio_matrix_in(PSRAM_SPIQ_IO, SPIQ_IN_IDX, 0);
  391. gpio_matrix_out(PSRAM_SPID_IO, SPID_OUT_IDX, 0, 0);
  392. gpio_matrix_in(PSRAM_SPID_IO, SPID_IN_IDX, 0);
  393. gpio_matrix_out(PSRAM_SPIWP_IO, SPIWP_OUT_IDX, 0, 0);
  394. gpio_matrix_in(PSRAM_SPIWP_IO, SPIWP_IN_IDX, 0);
  395. gpio_matrix_out(PSRAM_SPIHD_IO, SPIHD_OUT_IDX, 0, 0);
  396. gpio_matrix_in(PSRAM_SPIHD_IO, SPIHD_IN_IDX, 0);
  397. switch (mode) {
  398. case PSRAM_CACHE_F80M_S40M:
  399. extra_dummy = PSRAM_IO_MATRIX_DUMMY_40M;
  400. g_rom_spiflash_dummy_len_plus[1] = PSRAM_IO_MATRIX_DUMMY_40M;
  401. SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN_V, SPI_CACHE_DUMMY + PSRAM_IO_MATRIX_DUMMY_80M, SPI_USR_DUMMY_CYCLELEN_S); //DUMMY
  402. //set drive ability for clock
  403. SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, 3, FUN_DRV_S);
  404. SET_PERI_REG_BITS(GPIO_PIN_MUX_REG[PSRAM_CLK_IO], FUN_DRV, 2, FUN_DRV_S);
  405. break;
  406. case PSRAM_CACHE_F80M_S80M:
  407. extra_dummy = PSRAM_IO_MATRIX_DUMMY_80M;
  408. g_rom_spiflash_dummy_len_plus[1] = PSRAM_IO_MATRIX_DUMMY_80M;
  409. SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN_V, SPI_CACHE_DUMMY + PSRAM_IO_MATRIX_DUMMY_80M, SPI_USR_DUMMY_CYCLELEN_S); //DUMMY
  410. //set drive ability for clock
  411. SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, 3, FUN_DRV_S);
  412. SET_PERI_REG_BITS(GPIO_PIN_MUX_REG[PSRAM_CLK_IO], FUN_DRV, 3, FUN_DRV_S);
  413. break;
  414. case PSRAM_CACHE_F40M_S40M:
  415. extra_dummy = PSRAM_IO_MATRIX_DUMMY_40M;
  416. g_rom_spiflash_dummy_len_plus[1] = PSRAM_IO_MATRIX_DUMMY_40M;
  417. SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN_V, SPI_CACHE_DUMMY + PSRAM_IO_MATRIX_DUMMY_40M, SPI_USR_DUMMY_CYCLELEN_S); //DUMMY
  418. //set drive ability for clock
  419. SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, 2, FUN_DRV_S);
  420. SET_PERI_REG_BITS(GPIO_PIN_MUX_REG[PSRAM_CLK_IO], FUN_DRV, 2, FUN_DRV_S);
  421. break;
  422. default:
  423. break;
  424. }
  425. SET_PERI_REG_MASK(SPI_USER_REG(0), SPI_USR_DUMMY); // dummy en
  426. //select pin function gpio
  427. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, PIN_FUNC_GPIO);
  428. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, PIN_FUNC_GPIO);
  429. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA2_U, PIN_FUNC_GPIO);
  430. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA3_U, PIN_FUNC_GPIO);
  431. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, PIN_FUNC_GPIO);
  432. //flash clock signal should come from IO MUX.
  433. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
  434. }
  435. //psram gpio init , different working frequency we have different solutions
  436. esp_err_t IRAM_ATTR psram_enable(psram_cache_mode_t mode, psram_vaddr_mode_t vaddrmode) //psram init
  437. {
  438. uint32_t chip_ver = REG_GET_FIELD(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_PKG);
  439. uint32_t pkg_ver = chip_ver & 0x7;
  440. if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5) {
  441. ESP_EARLY_LOGE(TAG, "ESP32D2WD do not support psram yet");
  442. return ESP_FAIL;
  443. } else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2) {
  444. ESP_EARLY_LOGE(TAG, "ESP32PICOD2 do not support psram yet");
  445. return ESP_FAIL;
  446. } else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4) {
  447. ESP_EARLY_LOGE(TAG, "ESP32PICOD4 do not support psram yet");
  448. return ESP_FAIL;
  449. }
  450. /* note: If the third mode(80Mhz+80Mhz) is enabled, VSPI port will be occupied by the system,
  451. Application code should never touch VSPI hardware in this case. We try to stop applications
  452. from doing this using the drivers by claiming the port for ourselves*/
  453. if (mode == PSRAM_CACHE_F80M_S80M) {
  454. periph_module_enable(PERIPH_VSPI_MODULE);
  455. bool r=spicommon_periph_claim(VSPI_HOST);
  456. if (!r) {
  457. return ESP_ERR_INVALID_STATE;
  458. }
  459. }
  460. WRITE_PERI_REG(GPIO_ENABLE_W1TC_REG, BIT(PSRAM_CLK_IO) | BIT(PSRAM_CS_IO)); //DISABLE OUPUT FOR IO16/17
  461. assert(mode < PSRAM_CACHE_MAX && "we don't support any other mode for now.");
  462. s_psram_mode = mode;
  463. periph_module_enable(PERIPH_SPI_MODULE);
  464. WRITE_PERI_REG(SPI_EXT3_REG(0), 0x1);
  465. CLEAR_PERI_REG_MASK(SPI_USER_REG(PSRAM_SPI_1), SPI_USR_PREP_HOLD_M);
  466. switch (mode) {
  467. case PSRAM_CACHE_F80M_S80M:
  468. psram_spi_init(PSRAM_SPI_1, mode);
  469. CLEAR_PERI_REG_MASK(SPI_USER_REG(PSRAM_SPI_1), SPI_CS_HOLD);
  470. gpio_matrix_out(PSRAM_CS_IO, SPICS1_OUT_IDX, 0, 0);
  471. gpio_matrix_out(PSRAM_CLK_IO, VSPICLK_OUT_IDX, 0, 0);
  472. //use spi3 clock,but use spi1 data/cs wires
  473. //We get a solid 80MHz clock from SPI3 by setting it up, starting a transaction, waiting until it
  474. //is in progress, then cutting the clock (but not the reset!) to that peripheral.
  475. WRITE_PERI_REG(SPI_ADDR_REG(PSRAM_SPI_3), 32 << 24);
  476. WRITE_PERI_REG(SPI_CLOCK_REG(PSRAM_SPI_3), SPI_CLK_EQU_SYSCLK_M); //SET 80M AND CLEAR OTHERS
  477. SET_PERI_REG_MASK(SPI_CMD_REG(PSRAM_SPI_3), SPI_FLASH_READ_M);
  478. uint32_t spi_status;
  479. while (1) {
  480. spi_status = READ_PERI_REG(SPI_EXT2_REG(PSRAM_SPI_3));
  481. if (spi_status != 0 && spi_status != 1) {
  482. DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI_CLK_EN_2);
  483. break;
  484. }
  485. }
  486. break;
  487. case PSRAM_CACHE_F80M_S40M:
  488. case PSRAM_CACHE_F40M_S40M:
  489. default:
  490. psram_spi_init(PSRAM_SPI_1, mode);
  491. CLEAR_PERI_REG_MASK(SPI_USER_REG(PSRAM_SPI_1), SPI_CS_HOLD);
  492. gpio_matrix_out(PSRAM_CS_IO, SPICS1_OUT_IDX, 0, 0);
  493. /* We need to delay CLK to the PSRAM with respect to the clock signal as output by the SPI peripheral.
  494. We do this by routing it signal to signal 224/225, which are used as a loopback; the extra run through
  495. the GPIO matrix causes the delay. We use GPIO20 (which is not in any package but has pad logic in
  496. silicon) as a temporary pad for this. So the signal path is:
  497. SPI CLK --> GPIO28 --> signal224(in then out) --> internal GPIO29 --> signal225(in then out) --> GPIO17(PSRAM CLK)
  498. */
  499. gpio_matrix_out(PSRAM_INTERNAL_IO_28, SPICLK_OUT_IDX, 0, 0);
  500. gpio_matrix_in(PSRAM_INTERNAL_IO_28, SIG_IN_FUNC224_IDX, 0);
  501. gpio_matrix_out(PSRAM_INTERNAL_IO_29, SIG_IN_FUNC224_IDX, 0, 0);
  502. gpio_matrix_in(PSRAM_INTERNAL_IO_29, SIG_IN_FUNC225_IDX, 0);
  503. gpio_matrix_out(PSRAM_CLK_IO, SIG_IN_FUNC225_IDX, 0, 0);
  504. break;
  505. }
  506. CLEAR_PERI_REG_MASK(SPI_USER_REG(PSRAM_SPI_1), SPI_CS_SETUP_M);
  507. psram_gpio_config(mode);
  508. WRITE_PERI_REG(GPIO_ENABLE_W1TS_REG, BIT(PSRAM_CS_IO)| BIT(PSRAM_CLK_IO));
  509. PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[PSRAM_CS_IO], PIN_FUNC_GPIO);
  510. PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[PSRAM_CLK_IO], PIN_FUNC_GPIO);
  511. uint32_t id;
  512. psram_read_id(&id);
  513. if (((id >> PSRAM_MFG_ID_S) & PSRAM_MFG_ID_M) != PSRAM_MFG_ID_V) {
  514. return ESP_FAIL;
  515. }
  516. psram_enable_qio_mode(PSRAM_SPI_1);
  517. psram_cache_init(mode, vaddrmode);
  518. return ESP_OK;
  519. }
  520. //register initialization for sram cache params and r/w commands
  521. static void IRAM_ATTR psram_cache_init(psram_cache_mode_t psram_cache_mode, psram_vaddr_mode_t vaddrmode)
  522. {
  523. CLEAR_PERI_REG_MASK(SPI_CLOCK_REG(0), SPI_CLK_EQU_SYSCLK_M);
  524. SET_PERI_REG_BITS(SPI_CLOCK_REG(0), SPI_CLKDIV_PRE_V, 0, SPI_CLKDIV_PRE_S);
  525. SET_PERI_REG_BITS(SPI_CLOCK_REG(0), SPI_CLKCNT_N, 1, SPI_CLKCNT_N_S);
  526. SET_PERI_REG_BITS(SPI_CLOCK_REG(0), SPI_CLKCNT_H, 0, SPI_CLKCNT_H_S);
  527. SET_PERI_REG_BITS(SPI_CLOCK_REG(0), SPI_CLKCNT_L, 1, SPI_CLKCNT_L_S);
  528. switch (psram_cache_mode) {
  529. case PSRAM_CACHE_F80M_S80M:
  530. CLEAR_PERI_REG_MASK(SPI_DATE_REG(0), BIT(31)); //flash 1 div clk,80+40;
  531. CLEAR_PERI_REG_MASK(SPI_DATE_REG(0), BIT(30)); //pre clk div , ONLY IF SPI/SRAM@ DIFFERENT SPEED,JUST FOR SPI0. FLASH DIV 2+SRAM DIV4
  532. WRITE_PERI_REG(SPI_CLOCK_REG(0), SPI_CLK_EQU_SYSCLK_M); //SET 1DIV CLOCK AND RESET OTHER PARAMS
  533. SET_PERI_REG_MASK(SPI_CACHE_SCTRL_REG(0), SPI_USR_RD_SRAM_DUMMY_M); //enable cache read dummy
  534. SET_PERI_REG_BITS(SPI_CACHE_SCTRL_REG(0), SPI_SRAM_DUMMY_CYCLELEN_V, PSRAM_FAST_READ_DUMMY + extra_dummy,
  535. SPI_SRAM_DUMMY_CYCLELEN_S); //dummy, psram cache : 40m--+1dummy,80m--+2dummy
  536. SET_PERI_REG_MASK(SPI_CACHE_SCTRL_REG(0), SPI_CACHE_SRAM_USR_RCMD_M); //enable user mode for cache read command
  537. break;
  538. case PSRAM_CACHE_F80M_S40M:
  539. SET_PERI_REG_MASK(SPI_DATE_REG(0), BIT(31)); //flash 1 div clk
  540. CLEAR_PERI_REG_MASK(SPI_DATE_REG(0), BIT(30)); //pre clk div , ONLY IF SPI/SRAM@ DIFFERENT SPEED,JUST FOR SPI0.
  541. SET_PERI_REG_MASK(SPI_CACHE_SCTRL_REG(0), SPI_USR_RD_SRAM_DUMMY_M); //enable cache read dummy
  542. SET_PERI_REG_BITS(SPI_CACHE_SCTRL_REG(0), SPI_SRAM_DUMMY_CYCLELEN_V, PSRAM_FAST_READ_DUMMY + extra_dummy,
  543. SPI_SRAM_DUMMY_CYCLELEN_S); //dummy, psram cache : 40m--+1dummy,80m--+2dummy
  544. SET_PERI_REG_MASK(SPI_CACHE_SCTRL_REG(0), SPI_CACHE_SRAM_USR_RCMD_M); //enable user mode for cache read command
  545. break;
  546. case PSRAM_CACHE_F40M_S40M:
  547. default:
  548. CLEAR_PERI_REG_MASK(SPI_DATE_REG(0), BIT(31)); //flash 1 div clk
  549. CLEAR_PERI_REG_MASK(SPI_DATE_REG(0), BIT(30)); //pre clk div
  550. SET_PERI_REG_MASK(SPI_CACHE_SCTRL_REG(0), SPI_USR_RD_SRAM_DUMMY_M); //enable cache read dummy
  551. SET_PERI_REG_BITS(SPI_CACHE_SCTRL_REG(0), SPI_SRAM_DUMMY_CYCLELEN_V, PSRAM_FAST_READ_DUMMY + extra_dummy,
  552. SPI_SRAM_DUMMY_CYCLELEN_S); //dummy, psram cache : 40m--+1dummy,80m--+2dummy
  553. SET_PERI_REG_MASK(SPI_CACHE_SCTRL_REG(0), SPI_CACHE_SRAM_USR_RCMD_M); //enable user mode for cache read command
  554. break;
  555. }
  556. SET_PERI_REG_MASK(SPI_CACHE_SCTRL_REG(0), SPI_CACHE_SRAM_USR_WCMD_M); // cache write command enable
  557. SET_PERI_REG_BITS(SPI_CACHE_SCTRL_REG(0), SPI_SRAM_ADDR_BITLEN_V, 23, SPI_SRAM_ADDR_BITLEN_S); //write address for cache command.
  558. SET_PERI_REG_MASK(SPI_CACHE_SCTRL_REG(0), SPI_USR_SRAM_QIO_M); //enable qio mode for cache command
  559. CLEAR_PERI_REG_MASK(SPI_CACHE_SCTRL_REG(0), SPI_USR_SRAM_DIO_M); //disable dio mode for cache command
  560. //config sram cache r/w command
  561. switch (psram_cache_mode) {
  562. case PSRAM_CACHE_F80M_S80M: //in this mode , no delay is needed
  563. SET_PERI_REG_BITS(SPI_SRAM_DWR_CMD_REG(0), SPI_CACHE_SRAM_USR_WR_CMD_BITLEN, 7,
  564. SPI_CACHE_SRAM_USR_WR_CMD_BITLEN_S);
  565. SET_PERI_REG_BITS(SPI_SRAM_DWR_CMD_REG(0), SPI_CACHE_SRAM_USR_WR_CMD_VALUE, PSRAM_QUAD_WRITE,
  566. SPI_CACHE_SRAM_USR_WR_CMD_VALUE_S); //0x38
  567. SET_PERI_REG_BITS(SPI_SRAM_DRD_CMD_REG(0), SPI_CACHE_SRAM_USR_RD_CMD_BITLEN_V, 7,
  568. SPI_CACHE_SRAM_USR_RD_CMD_BITLEN_S);
  569. SET_PERI_REG_BITS(SPI_SRAM_DRD_CMD_REG(0), SPI_CACHE_SRAM_USR_RD_CMD_VALUE_V, PSRAM_FAST_READ,
  570. SPI_CACHE_SRAM_USR_RD_CMD_VALUE_S); //0x0b
  571. break;
  572. case PSRAM_CACHE_F80M_S40M: //is sram is @40M, need 2 cycles of delay
  573. case PSRAM_CACHE_F40M_S40M:
  574. default:
  575. SET_PERI_REG_BITS(SPI_SRAM_DRD_CMD_REG(0), SPI_CACHE_SRAM_USR_RD_CMD_BITLEN_V, 15,
  576. SPI_CACHE_SRAM_USR_RD_CMD_BITLEN_S); //read command length, 2 bytes(1byte for delay),sending in qio mode in cache
  577. SET_PERI_REG_BITS(SPI_SRAM_DRD_CMD_REG(0), SPI_CACHE_SRAM_USR_RD_CMD_VALUE_V, ((PSRAM_FAST_READ) << 8),
  578. SPI_CACHE_SRAM_USR_RD_CMD_VALUE_S); //0x0b, read command value,(0x00 for delay,0x0b for cmd)
  579. SET_PERI_REG_BITS(SPI_SRAM_DWR_CMD_REG(0), SPI_CACHE_SRAM_USR_WR_CMD_BITLEN, 15,
  580. SPI_CACHE_SRAM_USR_WR_CMD_BITLEN_S); //write command length,2 bytes(1byte for delay,send in qio mode in cache)
  581. SET_PERI_REG_BITS(SPI_SRAM_DWR_CMD_REG(0), SPI_CACHE_SRAM_USR_WR_CMD_VALUE, ((PSRAM_QUAD_WRITE) << 8),
  582. SPI_CACHE_SRAM_USR_WR_CMD_VALUE_S); //0x38, write command value,(0x00 for delay)
  583. break;
  584. }
  585. DPORT_CLEAR_PERI_REG_MASK(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_DRAM_HL|DPORT_PRO_DRAM_SPLIT);
  586. DPORT_CLEAR_PERI_REG_MASK(DPORT_APP_CACHE_CTRL_REG, DPORT_APP_DRAM_HL|DPORT_APP_DRAM_SPLIT);
  587. if (vaddrmode == PSRAM_VADDR_MODE_LOWHIGH) {
  588. DPORT_SET_PERI_REG_MASK(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_DRAM_HL);
  589. DPORT_SET_PERI_REG_MASK(DPORT_APP_CACHE_CTRL_REG, DPORT_APP_DRAM_HL);
  590. } else if (vaddrmode == PSRAM_VADDR_MODE_EVENODD) {
  591. DPORT_SET_PERI_REG_MASK(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_DRAM_SPLIT);
  592. DPORT_SET_PERI_REG_MASK(DPORT_APP_CACHE_CTRL_REG, DPORT_APP_DRAM_SPLIT);
  593. }
  594. DPORT_CLEAR_PERI_REG_MASK(DPORT_PRO_CACHE_CTRL1_REG, DPORT_PRO_CACHE_MASK_DRAM1|DPORT_PRO_CACHE_MASK_OPSDRAM); //use Dram1 to visit ext sram.
  595. //cache page mode : 1 -->16k 4 -->2k 0-->32k,(accord with the settings in cache_sram_mmu_set)
  596. DPORT_SET_PERI_REG_BITS(DPORT_PRO_CACHE_CTRL1_REG, DPORT_PRO_CMMU_SRAM_PAGE_MODE, 0, DPORT_PRO_CMMU_SRAM_PAGE_MODE_S);
  597. DPORT_CLEAR_PERI_REG_MASK(DPORT_APP_CACHE_CTRL1_REG, DPORT_APP_CACHE_MASK_DRAM1|DPORT_APP_CACHE_MASK_OPSDRAM); //use Dram1 to visit ext sram.
  598. //cache page mode : 1 -->16k 4 -->2k 0-->32k,(accord with the settings in cache_sram_mmu_set)
  599. DPORT_SET_PERI_REG_BITS(DPORT_APP_CACHE_CTRL1_REG, DPORT_APP_CMMU_SRAM_PAGE_MODE, 0, DPORT_APP_CMMU_SRAM_PAGE_MODE_S);
  600. CLEAR_PERI_REG_MASK(SPI_PIN_REG(0), SPI_CS1_DIS_M); //ENABLE SPI0 CS1 TO PSRAM(CS0--FLASH; CS1--SRAM)
  601. }
  602. #endif // CONFIG_SPIRAM_SUPPORT