spi_flash_rom_patch.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849
  1. // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. #include "sdkconfig.h"
  14. #if CONFIG_IDF_TARGET_ESP32
  15. #include "esp32/rom/ets_sys.h"
  16. #include "esp32/rom/gpio.h"
  17. #include "esp32/rom/spi_flash.h"
  18. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  19. #include "esp32s2beta/rom/ets_sys.h"
  20. #include "esp32s2beta/rom/gpio.h"
  21. #include "esp32s2beta/rom/spi_flash.h"
  22. #endif
  23. #include "soc/spi_periph.h"
  24. #define SPI_IDX 1
  25. #define OTH_IDX 0
  26. extern esp_rom_spiflash_chip_t g_rom_spiflash_chip;
  27. esp_rom_spiflash_result_t esp_rom_spiflash_wait_idle(esp_rom_spiflash_chip_t *spi)
  28. {
  29. uint32_t status;
  30. #if CONFIG_IDF_TARGET_ESP32
  31. //wait for spi control ready
  32. while ((REG_READ(SPI_EXT2_REG(1)) & SPI_ST)) {
  33. }
  34. while ((REG_READ(SPI_EXT2_REG(0)) & SPI_ST)) {
  35. }
  36. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  37. while ((REG_READ(SPI_MEM_FSM_REG(1)) & SPI_MEM_ST)) {
  38. }
  39. while ((REG_READ(SPI_MEM_FSM_REG(0)) & SPI_MEM_ST)) {
  40. }
  41. #endif
  42. //wait for flash status ready
  43. if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_read_status(spi, &status)) {
  44. return ESP_ROM_SPIFLASH_RESULT_ERR;
  45. }
  46. return ESP_ROM_SPIFLASH_RESULT_OK;
  47. }
  48. /* Modified version of esp_rom_spiflash_unlock() that replaces version in ROM.
  49. This works around a bug where esp_rom_spiflash_unlock sometimes reads the wrong
  50. high status byte (RDSR2 result) and then copies it back to the
  51. flash status, which can cause the CMP bit or Status Register
  52. Protect bit to become set.
  53. Like other ROM SPI functions, this function is not designed to be
  54. called directly from an RTOS environment without taking precautions
  55. about interrupts, CPU coordination, flash mapping. However some of
  56. the functions in esp_spi_flash.c call it.
  57. */
  58. esp_rom_spiflash_result_t esp_rom_spiflash_unlock(void)
  59. {
  60. uint32_t status;
  61. esp_rom_spiflash_wait_idle(&g_rom_spiflash_chip);
  62. if (esp_rom_spiflash_read_statushigh(&g_rom_spiflash_chip, &status) != ESP_ROM_SPIFLASH_RESULT_OK) {
  63. return ESP_ROM_SPIFLASH_RESULT_ERR;
  64. }
  65. /* Clear all bits except QIE, if it is set.
  66. (This is different from ROM esp_rom_spiflash_unlock, which keeps all bits as-is.)
  67. */
  68. status &= ESP_ROM_SPIFLASH_QE;
  69. esp_rom_spiflash_wait_idle(&g_rom_spiflash_chip);
  70. #if CONFIG_IDF_TARGET_ESP32
  71. REG_WRITE(SPI_CMD_REG(SPI_IDX), SPI_FLASH_WREN);
  72. while (REG_READ(SPI_CMD_REG(SPI_IDX)) != 0) {
  73. }
  74. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  75. REG_WRITE(SPI_MEM_CMD_REG(SPI_IDX), SPI_MEM_FLASH_WREN);
  76. while (REG_READ(SPI_MEM_CMD_REG(SPI_IDX)) != 0) {
  77. }
  78. #endif
  79. esp_rom_spiflash_wait_idle(&g_rom_spiflash_chip);
  80. #if CONFIG_IDF_TARGET_ESP32
  81. SET_PERI_REG_MASK(SPI_CTRL_REG(SPI_IDX), SPI_WRSR_2B);
  82. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  83. SET_PERI_REG_MASK(SPI_MEM_CTRL_REG(SPI_IDX), SPI_MEM_WRSR_2B);
  84. #endif
  85. if (esp_rom_spiflash_write_status(&g_rom_spiflash_chip, status) != ESP_ROM_SPIFLASH_RESULT_OK) {
  86. return ESP_ROM_SPIFLASH_RESULT_ERR;
  87. }
  88. return ESP_ROM_SPIFLASH_RESULT_OK;
  89. }
  90. #if CONFIG_SPI_FLASH_ROM_DRIVER_PATCH
  91. extern uint8_t g_rom_spiflash_dummy_len_plus[];
  92. static esp_rom_spiflash_result_t esp_rom_spiflash_enable_write(esp_rom_spiflash_chip_t *spi);
  93. //only support spi1
  94. static esp_rom_spiflash_result_t esp_rom_spiflash_erase_chip_internal(esp_rom_spiflash_chip_t *spi)
  95. {
  96. esp_rom_spiflash_wait_idle(spi);
  97. // Chip erase.
  98. #if CONFIG_IDF_TARGET_ESP32
  99. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_CE);
  100. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  101. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_MEM_FLASH_CE);
  102. #endif
  103. while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0);
  104. // check erase is finished.
  105. esp_rom_spiflash_wait_idle(spi);
  106. return ESP_ROM_SPIFLASH_RESULT_OK;
  107. }
  108. //only support spi1
  109. static esp_rom_spiflash_result_t esp_rom_spiflash_erase_sector_internal(esp_rom_spiflash_chip_t *spi, uint32_t addr)
  110. {
  111. //check if addr is 4k alignment
  112. if (0 != (addr & 0xfff)) {
  113. return ESP_ROM_SPIFLASH_RESULT_ERR;
  114. }
  115. esp_rom_spiflash_wait_idle(spi);
  116. // sector erase 4Kbytes erase is sector erase.
  117. WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, addr & 0xffffff);
  118. #if CONFIG_IDF_TARGET_ESP32
  119. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_SE);
  120. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  121. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_MEM_FLASH_SE);
  122. #endif
  123. while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0);
  124. esp_rom_spiflash_wait_idle(spi);
  125. return ESP_ROM_SPIFLASH_RESULT_OK;
  126. }
  127. //only support spi1
  128. static esp_rom_spiflash_result_t esp_rom_spiflash_erase_block_internal(esp_rom_spiflash_chip_t *spi, uint32_t addr)
  129. {
  130. esp_rom_spiflash_wait_idle(spi);
  131. // sector erase 4Kbytes erase is sector erase.
  132. WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, addr & 0xffffff);
  133. #if CONFIG_IDF_TARGET_ESP32
  134. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_BE);
  135. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  136. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_MEM_FLASH_BE);
  137. #endif
  138. while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0);
  139. esp_rom_spiflash_wait_idle(spi);
  140. return ESP_ROM_SPIFLASH_RESULT_OK;
  141. }
  142. //only support spi1
  143. static esp_rom_spiflash_result_t esp_rom_spiflash_program_page_internal(esp_rom_spiflash_chip_t *spi, uint32_t spi_addr,
  144. uint32_t *addr_source, int32_t byte_length)
  145. {
  146. uint32_t temp_addr;
  147. int32_t temp_bl;
  148. uint8_t i;
  149. uint8_t remain_word_num;
  150. //check 4byte alignment
  151. if (0 != (byte_length & 0x3)) {
  152. return ESP_ROM_SPIFLASH_RESULT_ERR;
  153. }
  154. //check if write in one page
  155. if ((spi->page_size) < ((spi_addr % (spi->page_size)) + byte_length)) {
  156. return ESP_ROM_SPIFLASH_RESULT_ERR;
  157. }
  158. esp_rom_spiflash_wait_idle(spi);
  159. temp_addr = spi_addr;
  160. temp_bl = byte_length;
  161. while (temp_bl > 0 ) {
  162. if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(spi)) {
  163. return ESP_ROM_SPIFLASH_RESULT_ERR;
  164. }
  165. if ( temp_bl >= ESP_ROM_SPIFLASH_BUFF_BYTE_WRITE_NUM ) {
  166. WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, (temp_addr & 0xffffff) | ( ESP_ROM_SPIFLASH_BUFF_BYTE_WRITE_NUM << ESP_ROM_SPIFLASH_BYTES_LEN )); // 32 byte a block
  167. for (i = 0; i < (ESP_ROM_SPIFLASH_BUFF_BYTE_WRITE_NUM >> 2); i++) {
  168. WRITE_PERI_REG(PERIPHS_SPI_FLASH_C0 + i * 4, *addr_source++);
  169. }
  170. temp_bl = temp_bl - 32;
  171. temp_addr = temp_addr + 32;
  172. } else {
  173. WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, (temp_addr & 0xffffff) | (temp_bl << ESP_ROM_SPIFLASH_BYTES_LEN ));
  174. remain_word_num = (0 == (temp_bl & 0x3)) ? (temp_bl >> 2) : (temp_bl >> 2) + 1;
  175. for (i = 0; i < remain_word_num; i++) {
  176. WRITE_PERI_REG(PERIPHS_SPI_FLASH_C0 + i * 4, *addr_source++);
  177. temp_bl = temp_bl - 4;
  178. }
  179. temp_bl = 0;
  180. }
  181. #if CONFIG_IDF_TARGET_ESP32
  182. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_PP);
  183. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  184. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_MEM_FLASH_PP);
  185. #endif
  186. while ( READ_PERI_REG(PERIPHS_SPI_FLASH_CMD ) != 0 );
  187. esp_rom_spiflash_wait_idle(spi);
  188. }
  189. return ESP_ROM_SPIFLASH_RESULT_OK;
  190. }
  191. //only support spi1
  192. static esp_rom_spiflash_result_t esp_rom_spiflash_read_data(esp_rom_spiflash_chip_t *spi, uint32_t flash_addr,
  193. uint32_t *addr_dest, int32_t byte_length)
  194. {
  195. uint32_t temp_addr;
  196. int32_t temp_length;
  197. uint8_t i;
  198. uint8_t remain_word_num;
  199. //address range check
  200. if ((flash_addr + byte_length) > (spi->chip_size)) {
  201. return ESP_ROM_SPIFLASH_RESULT_ERR;
  202. }
  203. temp_addr = flash_addr;
  204. temp_length = byte_length;
  205. esp_rom_spiflash_wait_idle(spi);
  206. while (temp_length > 0) {
  207. if (temp_length >= ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM) {
  208. //WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, temp_addr |(ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM << ESP_ROM_SPIFLASH_BYTES_LEN));
  209. #if CONFIG_IDF_TARGET_ESP32
  210. REG_WRITE(SPI_MISO_DLEN_REG(1), ((ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM << 3) - 1) << SPI_USR_MISO_DBITLEN_S);
  211. WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, temp_addr << 8);
  212. REG_WRITE(PERIPHS_SPI_FLASH_CMD, SPI_USR);
  213. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  214. REG_WRITE(SPI_MEM_MISO_DLEN_REG(1), ((ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM << 3) - 1) << SPI_MEM_USR_MISO_DBITLEN_S);
  215. WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, temp_addr << 8);
  216. REG_WRITE(PERIPHS_SPI_FLASH_CMD, SPI_MEM_USR);
  217. #endif
  218. while (REG_READ(PERIPHS_SPI_FLASH_CMD) != 0);
  219. for (i = 0; i < (ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM >> 2); i++) {
  220. *addr_dest++ = READ_PERI_REG(PERIPHS_SPI_FLASH_C0 + i * 4);
  221. }
  222. temp_length = temp_length - ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM;
  223. temp_addr = temp_addr + ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM;
  224. } else {
  225. //WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, temp_addr |(temp_length << ESP_ROM_SPIFLASH_BYTES_LEN ));
  226. WRITE_PERI_REG(PERIPHS_SPI_FLASH_ADDR, temp_addr << 8);
  227. #if CONFIG_IDF_TARGET_ESP32
  228. REG_WRITE(SPI_MISO_DLEN_REG(1), ((ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM << 3) - 1) << SPI_USR_MISO_DBITLEN_S);
  229. REG_WRITE(PERIPHS_SPI_FLASH_CMD, SPI_USR);
  230. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  231. REG_WRITE(SPI_MEM_MISO_DLEN_REG(1), ((ESP_ROM_SPIFLASH_BUFF_BYTE_READ_NUM << 3) - 1) << SPI_MEM_USR_MISO_DBITLEN_S);
  232. REG_WRITE(PERIPHS_SPI_FLASH_CMD, SPI_MEM_USR);
  233. #endif
  234. while (REG_READ(PERIPHS_SPI_FLASH_CMD) != 0);
  235. remain_word_num = (0 == (temp_length & 0x3)) ? (temp_length >> 2) : (temp_length >> 2) + 1;
  236. for (i = 0; i < remain_word_num; i++) {
  237. *addr_dest++ = READ_PERI_REG(PERIPHS_SPI_FLASH_C0 + i * 4);
  238. }
  239. temp_length = 0;
  240. }
  241. }
  242. return ESP_ROM_SPIFLASH_RESULT_OK;
  243. }
  244. esp_rom_spiflash_result_t esp_rom_spiflash_read_status(esp_rom_spiflash_chip_t *spi, uint32_t *status)
  245. {
  246. uint32_t status_value = ESP_ROM_SPIFLASH_BUSY_FLAG;
  247. if (g_rom_spiflash_dummy_len_plus[1] == 0) {
  248. while (ESP_ROM_SPIFLASH_BUSY_FLAG == (status_value & ESP_ROM_SPIFLASH_BUSY_FLAG)) {
  249. WRITE_PERI_REG(PERIPHS_SPI_FLASH_STATUS, 0); // clear regisrter
  250. #if CONFIG_IDF_TARGET_ESP32
  251. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_RDSR);
  252. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  253. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_MEM_FLASH_RDSR);
  254. #endif
  255. while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0);
  256. status_value = READ_PERI_REG(PERIPHS_SPI_FLASH_STATUS) & (spi->status_mask);
  257. }
  258. } else {
  259. while (ESP_ROM_SPIFLASH_BUSY_FLAG == (status_value & ESP_ROM_SPIFLASH_BUSY_FLAG)) {
  260. esp_rom_spiflash_read_user_cmd(&status_value, 0x05);
  261. }
  262. }
  263. *status = status_value;
  264. return ESP_ROM_SPIFLASH_RESULT_OK;
  265. }
  266. esp_rom_spiflash_result_t esp_rom_spiflash_read_statushigh(esp_rom_spiflash_chip_t *spi, uint32_t *status)
  267. {
  268. esp_rom_spiflash_result_t ret;
  269. esp_rom_spiflash_wait_idle(&g_rom_spiflash_chip);
  270. ret = esp_rom_spiflash_read_user_cmd(status, 0x35);
  271. *status = *status << 8;
  272. return ret;
  273. }
  274. esp_rom_spiflash_result_t esp_rom_spiflash_write_status(esp_rom_spiflash_chip_t *spi, uint32_t status_value)
  275. {
  276. esp_rom_spiflash_wait_idle(spi);
  277. // update status value by status_value
  278. WRITE_PERI_REG(PERIPHS_SPI_FLASH_STATUS, status_value); // write status regisrter
  279. #if CONFIG_IDF_TARGET_ESP32
  280. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_WRSR);
  281. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  282. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_MEM_FLASH_WRSR);
  283. #endif
  284. while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0);
  285. esp_rom_spiflash_wait_idle(spi);
  286. return ESP_ROM_SPIFLASH_RESULT_OK;
  287. }
  288. static esp_rom_spiflash_result_t esp_rom_spiflash_enable_write(esp_rom_spiflash_chip_t *spi)
  289. {
  290. uint32_t flash_status = 0;
  291. esp_rom_spiflash_wait_idle(spi);
  292. //enable write
  293. #if CONFIG_IDF_TARGET_ESP32
  294. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_FLASH_WREN); // enable write operation
  295. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  296. WRITE_PERI_REG(PERIPHS_SPI_FLASH_CMD, SPI_MEM_FLASH_WREN); // enable write operation
  297. #endif
  298. while (READ_PERI_REG(PERIPHS_SPI_FLASH_CMD) != 0);
  299. // make sure the flash is ready for writing
  300. while (ESP_ROM_SPIFLASH_WRENABLE_FLAG != (flash_status & ESP_ROM_SPIFLASH_WRENABLE_FLAG)) {
  301. esp_rom_spiflash_read_status(spi, &flash_status);
  302. }
  303. return ESP_ROM_SPIFLASH_RESULT_OK;
  304. }
  305. static void spi_cache_mode_switch(uint32_t modebit)
  306. {
  307. #if CONFIG_IDF_TARGET_ESP32
  308. if ((modebit & SPI_FREAD_QIO) && (modebit & SPI_FASTRD_MODE)) {
  309. REG_CLR_BIT(SPI_USER_REG(0), SPI_USR_MOSI);
  310. REG_SET_BIT(SPI_USER_REG(0), SPI_USR_MISO | SPI_USR_DUMMY | SPI_USR_ADDR);
  311. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN, SPI0_R_QIO_ADDR_BITSLEN);
  312. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_QIO_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  313. REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0xEB);
  314. } else if (modebit & SPI_FASTRD_MODE) {
  315. REG_CLR_BIT(SPI_USER_REG(0), SPI_USR_MOSI);
  316. REG_SET_BIT(SPI_USER_REG(0), SPI_USR_MISO | SPI_USR_DUMMY | SPI_USR_ADDR);
  317. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN, SPI0_R_FAST_ADDR_BITSLEN);
  318. if ((modebit & SPI_FREAD_QUAD)) {
  319. REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0x6B);
  320. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  321. } else if ((modebit & SPI_FREAD_DIO)) {
  322. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN, SPI0_R_DIO_ADDR_BITSLEN);
  323. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_DIO_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  324. REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0xBB);
  325. } else if ((modebit & SPI_FREAD_DUAL)) {
  326. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  327. REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0x3B);
  328. } else {
  329. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, SPI0_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  330. REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0x0B);
  331. }
  332. } else {
  333. REG_CLR_BIT(SPI_USER_REG(0), SPI_USR_MOSI);
  334. if (g_rom_spiflash_dummy_len_plus[0] == 0) {
  335. REG_CLR_BIT(SPI_USER_REG(0), SPI_USR_DUMMY);
  336. } else {
  337. REG_SET_BIT(SPI_USER_REG(0), SPI_USR_DUMMY);
  338. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN, g_rom_spiflash_dummy_len_plus[0] - 1);
  339. }
  340. REG_SET_BIT(SPI_USER_REG(0), SPI_USR_MISO | SPI_USR_ADDR);
  341. REG_SET_FIELD(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN, SPI0_R_SIO_ADDR_BITSLEN);
  342. REG_SET_FIELD(SPI_USER2_REG(0), SPI_USR_COMMAND_VALUE, 0x03);
  343. }
  344. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  345. if ((modebit & SPI_MEM_FREAD_QIO) && (modebit & SPI_MEM_FASTRD_MODE)) {
  346. REG_CLR_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_MOSI);
  347. REG_SET_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_MISO | SPI_MEM_USR_DUMMY | SPI_MEM_USR_ADDR);
  348. REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_ADDR_BITLEN, SPI0_R_QIO_ADDR_BITSLEN);
  349. REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_DUMMY_CYCLELEN, SPI0_R_QIO_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  350. REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_VALUE, 0xEB);
  351. } else if (modebit & SPI_MEM_FASTRD_MODE) {
  352. REG_CLR_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_MOSI);
  353. REG_SET_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_MISO | SPI_MEM_USR_DUMMY | SPI_MEM_USR_ADDR);
  354. REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_ADDR_BITLEN, SPI0_R_FAST_ADDR_BITSLEN);
  355. if ((modebit & SPI_MEM_FREAD_QUAD)) {
  356. REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_VALUE, 0x6B);
  357. REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_DUMMY_CYCLELEN, SPI0_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  358. } else if ((modebit & SPI_MEM_FREAD_DIO)) {
  359. REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_DUMMY_CYCLELEN, SPI0_R_DIO_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  360. REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_VALUE, 0xBB);
  361. } else if ((modebit & SPI_MEM_FREAD_DUAL)) {
  362. REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_DUMMY_CYCLELEN, SPI0_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  363. REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_VALUE, 0x3B);
  364. } else{
  365. REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_DUMMY_CYCLELEN, SPI0_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[0]);
  366. REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_VALUE, 0x0B);
  367. }
  368. } else {
  369. REG_CLR_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_MOSI);
  370. if (g_rom_spiflash_dummy_len_plus[0] == 0) {
  371. REG_CLR_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_DUMMY);
  372. } else {
  373. REG_SET_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_DUMMY);
  374. REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_DUMMY_CYCLELEN, g_rom_spiflash_dummy_len_plus[0] - 1);
  375. }
  376. REG_SET_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_MISO | SPI_MEM_USR_ADDR);
  377. REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_ADDR_BITLEN, SPI0_R_SIO_ADDR_BITSLEN);
  378. REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_VALUE, 0x03);
  379. }
  380. #endif
  381. }
  382. esp_rom_spiflash_result_t esp_rom_spiflash_lock(void)
  383. {
  384. uint32_t status;
  385. //read QE bit, not write if not QE
  386. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_read_statushigh(&g_rom_spiflash_chip, &status)) {
  387. return ESP_ROM_SPIFLASH_RESULT_ERR;
  388. }
  389. //enable 2 byte status writing
  390. SET_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL, ESP_ROM_SPIFLASH_TWO_BYTE_STATUS_EN);
  391. if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(&g_rom_spiflash_chip)) {
  392. return ESP_ROM_SPIFLASH_RESULT_ERR;
  393. }
  394. if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_write_status(&g_rom_spiflash_chip, status | ESP_ROM_SPIFLASH_WR_PROTECT)) {
  395. return ESP_ROM_SPIFLASH_RESULT_ERR;
  396. }
  397. return ESP_ROM_SPIFLASH_RESULT_OK;
  398. }
  399. esp_rom_spiflash_result_t esp_rom_spiflash_config_readmode(esp_rom_spiflash_read_mode_t mode)
  400. {
  401. uint32_t modebit;
  402. #if CONFIG_IDF_TARGET_ESP32
  403. while ((REG_READ(SPI_EXT2_REG(1)) & SPI_ST)) {
  404. }
  405. while ((REG_READ(SPI_EXT2_REG(0)) & SPI_ST)) {
  406. }
  407. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  408. while ((REG_READ(SPI_MEM_FSM_REG(1)) & SPI_MEM_ST)) {
  409. }
  410. while ((REG_READ(SPI_MEM_FSM_REG(0)) & SPI_MEM_ST)) {
  411. }
  412. #endif
  413. //clear old mode bit
  414. #if CONFIG_IDF_TARGET_ESP32
  415. CLEAR_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL, SPI_FREAD_QIO | SPI_FREAD_QUAD | SPI_FREAD_DIO | SPI_FREAD_DUAL | SPI_FASTRD_MODE);
  416. CLEAR_PERI_REG_MASK(SPI_CTRL_REG(0), SPI_FREAD_QIO | SPI_FREAD_QUAD | SPI_FREAD_DIO | SPI_FREAD_DUAL | SPI_FASTRD_MODE);
  417. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  418. CLEAR_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL, SPI_MEM_FREAD_QIO | SPI_MEM_FREAD_QUAD | SPI_MEM_FREAD_DIO | SPI_MEM_FREAD_DUAL | SPI_MEM_FASTRD_MODE);
  419. CLEAR_PERI_REG_MASK(SPI_MEM_CTRL_REG(0), SPI_MEM_FREAD_QIO | SPI_MEM_FREAD_QUAD | SPI_MEM_FREAD_DIO | SPI_MEM_FREAD_DUAL | SPI_MEM_FASTRD_MODE);
  420. #endif
  421. //configure read mode
  422. switch (mode) {
  423. #if CONFIG_IDF_TARGET_ESP32
  424. case ESP_ROM_SPIFLASH_QIO_MODE : modebit = SPI_FREAD_QIO | SPI_FASTRD_MODE; break;
  425. case ESP_ROM_SPIFLASH_QOUT_MODE : modebit = SPI_FREAD_QUAD | SPI_FASTRD_MODE; break;
  426. case ESP_ROM_SPIFLASH_DIO_MODE : modebit = SPI_FREAD_DIO | SPI_FASTRD_MODE; break;
  427. case ESP_ROM_SPIFLASH_DOUT_MODE : modebit = SPI_FREAD_DUAL | SPI_FASTRD_MODE; break;
  428. case ESP_ROM_SPIFLASH_FASTRD_MODE: modebit = SPI_FASTRD_MODE; break;
  429. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  430. case ESP_ROM_SPIFLASH_QIO_MODE : modebit = SPI_MEM_FREAD_QIO | SPI_MEM_FASTRD_MODE; break;
  431. case ESP_ROM_SPIFLASH_QOUT_MODE : modebit = SPI_MEM_FREAD_QUAD | SPI_MEM_FASTRD_MODE; break;
  432. case ESP_ROM_SPIFLASH_DIO_MODE : modebit = SPI_MEM_FREAD_DIO | SPI_MEM_FASTRD_MODE; break;
  433. case ESP_ROM_SPIFLASH_DOUT_MODE : modebit = SPI_MEM_FREAD_DUAL | SPI_MEM_FASTRD_MODE; break;
  434. case ESP_ROM_SPIFLASH_FASTRD_MODE: modebit = SPI_MEM_FASTRD_MODE; break;
  435. #endif
  436. case ESP_ROM_SPIFLASH_SLOWRD_MODE: modebit = 0; break;
  437. default : modebit = 0;
  438. }
  439. SET_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL, modebit);
  440. #if CONFIG_IDF_TARGET_ESP32
  441. SET_PERI_REG_MASK(SPI_CTRL_REG(0), modebit);
  442. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  443. SET_PERI_REG_MASK(SPI_MEM_CTRL_REG(0), modebit);
  444. #endif
  445. spi_cache_mode_switch(modebit);
  446. return ESP_ROM_SPIFLASH_RESULT_OK;
  447. }
  448. esp_rom_spiflash_result_t esp_rom_spiflash_erase_chip(void)
  449. {
  450. if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(&g_rom_spiflash_chip)) {
  451. return ESP_ROM_SPIFLASH_RESULT_ERR;
  452. }
  453. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_chip_internal(&g_rom_spiflash_chip)) {
  454. return ESP_ROM_SPIFLASH_RESULT_ERR;
  455. }
  456. return ESP_ROM_SPIFLASH_RESULT_OK;
  457. }
  458. esp_rom_spiflash_result_t esp_rom_spiflash_erase_block(uint32_t block_num)
  459. {
  460. // flash write is always 1 line currently
  461. #if CONFIG_IDF_TARGET_ESP32
  462. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
  463. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN);
  464. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  465. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_DUMMY);
  466. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_ADDR_BITLEN, ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN);
  467. #endif
  468. //check program size
  469. if (block_num >= ((g_rom_spiflash_chip.chip_size) / (g_rom_spiflash_chip.block_size))) {
  470. return ESP_ROM_SPIFLASH_RESULT_ERR;
  471. }
  472. if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(&g_rom_spiflash_chip)) {
  473. return ESP_ROM_SPIFLASH_RESULT_ERR;
  474. }
  475. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_block_internal(&g_rom_spiflash_chip, block_num * (g_rom_spiflash_chip.block_size))) {
  476. return ESP_ROM_SPIFLASH_RESULT_ERR;
  477. }
  478. return ESP_ROM_SPIFLASH_RESULT_OK;
  479. }
  480. esp_rom_spiflash_result_t esp_rom_spiflash_erase_sector(uint32_t sector_num)
  481. {
  482. // flash write is always 1 line currently
  483. #if CONFIG_IDF_TARGET_ESP32
  484. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
  485. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN);
  486. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  487. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_DUMMY);
  488. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_ADDR_BITLEN, ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN);
  489. #endif
  490. //check program size
  491. if (sector_num >= ((g_rom_spiflash_chip.chip_size) / (g_rom_spiflash_chip.sector_size))) {
  492. return ESP_ROM_SPIFLASH_RESULT_ERR;
  493. }
  494. if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_enable_write(&g_rom_spiflash_chip)) {
  495. return ESP_ROM_SPIFLASH_RESULT_ERR;
  496. }
  497. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_sector_internal(&g_rom_spiflash_chip, sector_num * (g_rom_spiflash_chip.sector_size))) {
  498. return ESP_ROM_SPIFLASH_RESULT_ERR;
  499. }
  500. return ESP_ROM_SPIFLASH_RESULT_OK;
  501. }
  502. esp_rom_spiflash_result_t esp_rom_spiflash_write(uint32_t target, const uint32_t *src_addr, int32_t len)
  503. {
  504. uint32_t page_size;
  505. uint32_t pgm_len, pgm_num;
  506. uint8_t i;
  507. // flash write is always 1 line currently
  508. #if CONFIG_IDF_TARGET_ESP32
  509. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
  510. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN);
  511. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  512. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_DUMMY);
  513. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_ADDR_BITLEN, ESP_ROM_SPIFLASH_W_SIO_ADDR_BITSLEN);
  514. #endif
  515. //check program size
  516. if ( (target + len) > (g_rom_spiflash_chip.chip_size)) {
  517. return ESP_ROM_SPIFLASH_RESULT_ERR;
  518. }
  519. page_size = g_rom_spiflash_chip.page_size;
  520. pgm_len = page_size - (target % page_size);
  521. if (len < pgm_len) {
  522. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_program_page_internal(&g_rom_spiflash_chip,
  523. target, (uint32_t *)src_addr, len)) {
  524. return ESP_ROM_SPIFLASH_RESULT_ERR;
  525. }
  526. } else {
  527. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_program_page_internal(&g_rom_spiflash_chip,
  528. target, (uint32_t *)src_addr, pgm_len)) {
  529. return ESP_ROM_SPIFLASH_RESULT_ERR;
  530. }
  531. //whole page program
  532. pgm_num = (len - pgm_len) / page_size;
  533. for (i = 0; i < pgm_num; i++) {
  534. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_program_page_internal(&g_rom_spiflash_chip,
  535. target + pgm_len, (uint32_t *)src_addr + (pgm_len >> 2), page_size)) {
  536. return ESP_ROM_SPIFLASH_RESULT_ERR;
  537. }
  538. pgm_len += page_size;
  539. }
  540. //remain parts to program
  541. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_program_page_internal(&g_rom_spiflash_chip,
  542. target + pgm_len, (uint32_t *)src_addr + (pgm_len >> 2), len - pgm_len)) {
  543. return ESP_ROM_SPIFLASH_RESULT_ERR;
  544. }
  545. }
  546. return ESP_ROM_SPIFLASH_RESULT_OK;
  547. }
  548. #if CONFIG_IDF_TARGET_ESP32
  549. esp_rom_spiflash_result_t esp_rom_spiflash_write_encrypted(uint32_t flash_addr, uint32_t *data, uint32_t len)
  550. {
  551. esp_rom_spiflash_result_t ret = ESP_ROM_SPIFLASH_RESULT_OK;
  552. uint32_t i;
  553. if ((flash_addr & 0x1f) || (len & 0x1f)) { //check 32 byte alignment
  554. return ESP_ROM_SPIFLASH_RESULT_ERR;
  555. }
  556. esp_rom_spiflash_write_encrypted_enable();
  557. for (i = 0; i < (len >> 5); i++) {
  558. if ((ret = esp_rom_spiflash_prepare_encrypted_data(flash_addr + (i << 5), data + (i << 3))) != ESP_ROM_SPIFLASH_RESULT_OK) {
  559. break;
  560. }
  561. if ((ret = esp_rom_spiflash_write(flash_addr + (i << 5), data, 32)) != ESP_ROM_SPIFLASH_RESULT_OK) {
  562. break;
  563. }
  564. }
  565. esp_rom_spiflash_write_encrypted_disable();
  566. return ret;
  567. }
  568. #endif
  569. esp_rom_spiflash_result_t esp_rom_spiflash_read(uint32_t target, uint32_t *dest_addr, int32_t len)
  570. {
  571. // QIO or SIO, non-QIO regard as SIO
  572. uint32_t modebit;
  573. modebit = READ_PERI_REG(PERIPHS_SPI_FLASH_CTRL);
  574. #if CONFIG_IDF_TARGET_ESP32
  575. if ((modebit & SPI_FREAD_QIO) && (modebit & SPI_FASTRD_MODE)) {
  576. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MOSI);
  577. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MISO | SPI_USR_DUMMY | SPI_USR_ADDR);
  578. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_QIO_ADDR_BITSLEN);
  579. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_DUMMY_CYCLELEN, SPI1_R_QIO_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[1]);
  580. //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0xEB);
  581. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0xEB);
  582. } else if (modebit & SPI_FASTRD_MODE) {
  583. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MOSI);
  584. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MISO | SPI_USR_ADDR);
  585. if (modebit & SPI_FREAD_DIO) {
  586. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  587. if ((modebit & SPI_MEM_FREAD_QIO) && (modebit & SPI_MEM_FASTRD_MODE)) {
  588. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_MOSI);
  589. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_MISO | SPI_MEM_USR_DUMMY | SPI_MEM_USR_ADDR);
  590. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_ADDR_BITLEN, SPI1_R_QIO_ADDR_BITSLEN);
  591. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_DUMMY_CYCLELEN, SPI1_R_QIO_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[1]);
  592. //REG_SET_FIELD(PERIPHS_SPI_SPI_MEM_H_USRREG2, SPI_USR_COMMAND_VALUE, 0xEB);
  593. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_MEM_USR_COMMAND_BITLEN_S) | 0xEB);
  594. } else if (modebit & SPI_MEM_FASTRD_MODE) {
  595. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_MOSI);
  596. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_MISO | SPI_MEM_USR_ADDR);
  597. if (modebit & SPI_MEM_FREAD_DIO) {
  598. #endif
  599. if (g_rom_spiflash_dummy_len_plus[1] == 0) {
  600. #if CONFIG_IDF_TARGET_ESP32
  601. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
  602. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_DIO_ADDR_BITSLEN);
  603. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0xBB);
  604. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  605. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_DUMMY);
  606. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_ADDR_BITLEN, SPI1_R_DIO_ADDR_BITSLEN);
  607. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_MEM_USR_COMMAND_BITLEN_S) | 0xBB);
  608. #endif
  609. } else {
  610. #if CONFIG_IDF_TARGET_ESP32
  611. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
  612. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_DIO_ADDR_BITSLEN);
  613. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_DUMMY_CYCLELEN, g_rom_spiflash_dummy_len_plus[1] - 1);
  614. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0xBB);
  615. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  616. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_DUMMY);
  617. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_ADDR_BITLEN, SPI1_R_DIO_ADDR_BITSLEN);
  618. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_DUMMY_CYCLELEN, g_rom_spiflash_dummy_len_plus[1] - 1);
  619. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_MEM_USR_COMMAND_VALUE, 0xBB);
  620. #endif
  621. }
  622. } else {
  623. #if CONFIG_IDF_TARGET_ESP32
  624. if ((modebit & SPI_FREAD_QUAD)) {
  625. //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0x6B);
  626. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0x6B);
  627. } else if ((modebit & SPI_FREAD_DUAL)) {
  628. //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0x3B);
  629. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0x3B);
  630. } else {
  631. //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0x0B);
  632. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0x0B);
  633. }
  634. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
  635. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_FAST_ADDR_BITSLEN);
  636. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_DUMMY_CYCLELEN, SPI1_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[1]);
  637. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  638. if ((modebit & SPI_MEM_FREAD_QUAD)) {
  639. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_MEM_USR_COMMAND_BITLEN_S) | 0x6B);
  640. } else if ((modebit & SPI_MEM_FREAD_DUAL)) {
  641. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_MEM_USR_COMMAND_BITLEN_S) | 0x3B);
  642. } else {
  643. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_MEM_USR_COMMAND_BITLEN_S) | 0x0B);
  644. }
  645. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_DUMMY);
  646. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_ADDR_BITLEN, SPI1_R_FAST_ADDR_BITSLEN);
  647. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_DUMMY_CYCLELEN, SPI1_R_FAST_DUMMY_CYCLELEN + g_rom_spiflash_dummy_len_plus[1]);
  648. #endif
  649. }
  650. } else {
  651. #if CONFIG_IDF_TARGET_ESP32
  652. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MOSI);
  653. if (g_rom_spiflash_dummy_len_plus[1] == 0) {
  654. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
  655. } else {
  656. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_DUMMY);
  657. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_DUMMY_CYCLELEN, g_rom_spiflash_dummy_len_plus[1] - 1);
  658. }
  659. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_USR_MISO | SPI_USR_ADDR);
  660. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_USR_ADDR_BITLEN, SPI1_R_SIO_ADDR_BITSLEN);
  661. //REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG2, SPI_USR_COMMAND_VALUE, 0x03);
  662. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_USR_COMMAND_BITLEN_S) | 0x03);
  663. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  664. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_MOSI);
  665. if (g_rom_spiflash_dummy_len_plus[1] == 0) {
  666. REG_CLR_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_DUMMY);
  667. } else {
  668. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_DUMMY);
  669. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_DUMMY_CYCLELEN, g_rom_spiflash_dummy_len_plus[1] - 1);
  670. }
  671. REG_SET_BIT(PERIPHS_SPI_FLASH_USRREG, SPI_MEM_USR_MISO | SPI_MEM_USR_ADDR);
  672. REG_SET_FIELD(PERIPHS_SPI_FLASH_USRREG1, SPI_MEM_USR_ADDR_BITLEN, SPI1_R_SIO_ADDR_BITSLEN);
  673. REG_WRITE(PERIPHS_SPI_FLASH_USRREG2, (0x7 << SPI_MEM_USR_COMMAND_BITLEN_S) | 0x03);
  674. #endif
  675. }
  676. if ( ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_read_data(&g_rom_spiflash_chip, target, dest_addr, len)) {
  677. return ESP_ROM_SPIFLASH_RESULT_ERR;
  678. }
  679. return ESP_ROM_SPIFLASH_RESULT_OK;
  680. }
  681. esp_rom_spiflash_result_t esp_rom_spiflash_erase_area(uint32_t start_addr, uint32_t area_len)
  682. {
  683. int32_t total_sector_num;
  684. int32_t head_sector_num;
  685. uint32_t sector_no;
  686. uint32_t sector_num_per_block;
  687. //set read mode to Fastmode ,not QDIO mode for erase
  688. //
  689. // TODO: this is probably a bug as it doesn't re-enable QIO mode, not serious as this
  690. // function is not used in IDF.
  691. esp_rom_spiflash_config_readmode(ESP_ROM_SPIFLASH_SLOWRD_MODE);
  692. //check if area is oversize of flash
  693. if ((start_addr + area_len) > g_rom_spiflash_chip.chip_size) {
  694. return ESP_ROM_SPIFLASH_RESULT_ERR;
  695. }
  696. //start_addr is aligned as sector boundary
  697. if (0 != (start_addr % g_rom_spiflash_chip.sector_size)) {
  698. return ESP_ROM_SPIFLASH_RESULT_ERR;
  699. }
  700. //Unlock flash to enable erase
  701. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_unlock(/*&g_rom_spiflash_chip*/)) {
  702. return ESP_ROM_SPIFLASH_RESULT_ERR;
  703. }
  704. sector_no = start_addr / g_rom_spiflash_chip.sector_size;
  705. sector_num_per_block = g_rom_spiflash_chip.block_size / g_rom_spiflash_chip.sector_size;
  706. total_sector_num = (0 == (area_len % g_rom_spiflash_chip.sector_size)) ? area_len / g_rom_spiflash_chip.sector_size :
  707. 1 + (area_len / g_rom_spiflash_chip.sector_size);
  708. //check if erase area reach over block boundary
  709. head_sector_num = sector_num_per_block - (sector_no % sector_num_per_block);
  710. head_sector_num = (head_sector_num >= total_sector_num) ? total_sector_num : head_sector_num;
  711. //JJJ, BUG of 6.0 erase
  712. //middle part of area is aligned by blocks
  713. total_sector_num -= head_sector_num;
  714. //head part of area is erased
  715. while (0 != head_sector_num) {
  716. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_sector(sector_no)) {
  717. return ESP_ROM_SPIFLASH_RESULT_ERR;
  718. }
  719. sector_no++;
  720. head_sector_num--;
  721. }
  722. while (total_sector_num > sector_num_per_block) {
  723. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_block(sector_no / sector_num_per_block)) {
  724. return ESP_ROM_SPIFLASH_RESULT_ERR;
  725. }
  726. sector_no += sector_num_per_block;
  727. total_sector_num -= sector_num_per_block;
  728. }
  729. //tail part of area burn
  730. while (0 < total_sector_num) {
  731. if (ESP_ROM_SPIFLASH_RESULT_OK != esp_rom_spiflash_erase_sector(sector_no)) {
  732. return ESP_ROM_SPIFLASH_RESULT_ERR;
  733. }
  734. sector_no++;
  735. total_sector_num--;
  736. }
  737. return ESP_ROM_SPIFLASH_RESULT_OK;
  738. }
  739. #endif