spi_overlap.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. /*
  2. * ESPRSSIF MIT License
  3. *
  4. * Copyright (c) 2016 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
  5. *
  6. * Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
  7. * it is free of charge, to any person obtaining a copy of this software and associated
  8. * documentation files (the "Software"), to deal in the Software without restriction, including
  9. * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the Software is furnished
  11. * to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in all copies or
  14. * substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  18. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  19. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  20. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22. *
  23. */
  24. #include "driver/spi_overlap.h"
  25. #include "driver/spi.h"
  26. #include "gpio.h"
  27. #define SPI_FLASH_READ_MODE_MASK 0x196000
  28. #define WAIT_HSPI_IDLE() while(READ_PERI_REG(SPI_EXT2(HSPI))||(READ_PERI_REG(SPI_CMD(HSPI))&0xfffc0000));
  29. #define CONF_HSPI_CLK_DIV(div) WRITE_PERI_REG(SPI_CLOCK(HSPI), (((div<<1)+1)<<12)+(div<<6)+(div<<1)+1)
  30. #define HSPI_FALLING_EDGE_SAMPLE() SET_PERI_REG_MASK(SPI_USER(HSPI), SPI_CK_OUT_EDGE)
  31. #define HSPI_RISING_EDGE_SAMPLE() CLEAR_PERI_REG_MASK(SPI_USER(HSPI), SPI_CK_OUT_EDGE)
  32. #define ACTIVE_HSPI_CS0 CLEAR_PERI_REG_MASK(SPI_PIN(HSPI), SPI_CS0_DIS);\
  33. SET_PERI_REG_MASK(SPI_PIN(HSPI), SPI_CS1_DIS |SPI_CS2_DIS)
  34. #define ACTIVE_HSPI_CS1 CLEAR_PERI_REG_MASK(SPI_PIN(HSPI), SPI_CS1_DIS);\
  35. SET_PERI_REG_MASK(SPI_PIN(HSPI), SPI_CS0_DIS |SPI_CS2_DIS)
  36. #define ACTIVE_HSPI_CS2 CLEAR_PERI_REG_MASK(SPI_PIN(HSPI), SPI_CS2_DIS);\
  37. SET_PERI_REG_MASK(SPI_PIN(HSPI), SPI_CS0_DIS |SPI_CS1_DIS)
  38. #define ENABLE_HSPI_DEV_CS() PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2)
  39. #define DISABLE_HSPI_DEV_CS() GPIO_OUTPUT_SET(15, 1);\
  40. PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15)
  41. struct hspi_device_register hspi_dev_reg;
  42. /******************************************************************************
  43. * FunctionName : hspi_overlap_init
  44. * Description : enable hspi and spi module overlap mode
  45. *******************************************************************************/
  46. void ICACHE_FLASH_ATTR
  47. hspi_overlap_init(void)
  48. {
  49. //hspi overlap to spi, two spi masters on cspi
  50. SET_PERI_REG_MASK(HOST_INF_SEL, reg_cspi_overlap);
  51. //set higher priority for spi than hspi
  52. SET_PERI_REG_MASK(SPI_EXT3(SPI),0x1);
  53. SET_PERI_REG_MASK(SPI_EXT3(HSPI),0x3);
  54. SET_PERI_REG_MASK(SPI_USER(HSPI), BIT(5));
  55. }
  56. /******************************************************************************
  57. * FunctionName : hspi_overlap_deinit
  58. * Description : recover hspi and spi module from overlap mode
  59. *******************************************************************************/
  60. void ICACHE_FLASH_ATTR
  61. hspi_overlap_deinit(void)
  62. {
  63. //hspi overlap to spi, two spi masters on cspi
  64. CLEAR_PERI_REG_MASK(HOST_INF_SEL, reg_cspi_overlap);
  65. //set higher priority for spi than hspi
  66. CLEAR_PERI_REG_MASK(SPI_EXT3(SPI),0x1);
  67. CLEAR_PERI_REG_MASK(SPI_EXT3(HSPI),0x3);
  68. CLEAR_PERI_REG_MASK(SPI_USER(HSPI), BIT(5));
  69. }
  70. /******************************************************************************
  71. * FunctionName : spi_reg_backup
  72. * Description : backup SPI normal operation register value and disable CPU cache to modify some flash registers.
  73. * Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
  74. *******************************************************************************/
  75. void ICACHE_FLASH_ATTR
  76. spi_reg_backup(uint8 spi_no,uint32* backup_mem)
  77. {
  78. if(spi_no>1) return; //handle invalid input number
  79. backup_mem[PERIPHS_IO_MUX_BACKUP] =READ_PERI_REG(PERIPHS_IO_MUX);
  80. backup_mem[SPI_USER_BACKUP] =READ_PERI_REG(SPI_USER(spi_no));
  81. backup_mem[SPI_CTRL_BACKUP] =READ_PERI_REG(SPI_CTRL(spi_no));
  82. backup_mem[SPI_CLOCK_BACKUP] =READ_PERI_REG(SPI_CLOCK(spi_no));
  83. backup_mem[SPI_USER1_BACKUP] =READ_PERI_REG(SPI_USER1(spi_no));
  84. backup_mem[SPI_USER2_BACKUP] =READ_PERI_REG(SPI_USER2(spi_no));
  85. backup_mem[SPI_CMD_BACKUP] =READ_PERI_REG(SPI_CMD(spi_no));
  86. backup_mem[SPI_PIN_BACKUP] =READ_PERI_REG(SPI_PIN(spi_no));
  87. backup_mem[SPI_SLAVE_BACKUP] =READ_PERI_REG(SPI_SLAVE(spi_no));
  88. }
  89. /******************************************************************************
  90. * FunctionName : spi_reg_recover
  91. * Description : recover SPI normal operation register value and enable CPU cache.
  92. * Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
  93. *******************************************************************************/
  94. void ICACHE_FLASH_ATTR
  95. spi_reg_recover(uint8 spi_no,uint32* backup_mem)
  96. {
  97. if(spi_no>1) return; //handle invalid input number
  98. // WRITE_PERI_REG(PERIPHS_IO_MUX, backup_mem[PERIPHS_IO_MUX_BACKUP]);
  99. WRITE_PERI_REG(SPI_USER(spi_no), backup_mem[SPI_USER_BACKUP]);
  100. WRITE_PERI_REG(SPI_CTRL(spi_no), backup_mem[SPI_CTRL_BACKUP]);
  101. WRITE_PERI_REG(SPI_CLOCK(spi_no), backup_mem[SPI_CLOCK_BACKUP]);
  102. WRITE_PERI_REG(SPI_USER1(spi_no), backup_mem[SPI_USER1_BACKUP]);
  103. WRITE_PERI_REG(SPI_USER2(spi_no), backup_mem[SPI_USER2_BACKUP]);
  104. WRITE_PERI_REG(SPI_CMD(spi_no), backup_mem[SPI_CMD_BACKUP]);
  105. WRITE_PERI_REG(SPI_PIN(spi_no), backup_mem[SPI_PIN_BACKUP]);
  106. // WRITE_PERI_REG(SPI_SLAVE(spi_no), backup_mem[SPI_SLAVE_BACKUP]);
  107. }
  108. void ICACHE_FLASH_ATTR
  109. hspi_master_dev_init(uint8 dev_no,uint8 clk_polar,uint8 clk_div)
  110. {
  111. uint32 regtemp;
  112. if((dev_no>3)||(clk_polar>1)||(clk_div>0x1f))
  113. {
  114. os_printf("hspi_master_dev_init parameter is out of range!\n\r");
  115. return;
  116. }
  117. WAIT_HSPI_IDLE();
  118. if(!hspi_dev_reg.hspi_reg_backup_flag){
  119. if(READ_PERI_REG(PERIPHS_IO_MUX)&BIT8){
  120. hspi_dev_reg.spi_io_80m=1;
  121. SET_PERI_REG_MASK(SPI_CLOCK(HSPI),SPI_CLK_EQU_SYSCLK);
  122. }else{
  123. hspi_dev_reg.spi_io_80m=0;
  124. CLEAR_PERI_REG_MASK(SPI_CLOCK(HSPI),SPI_CLK_EQU_SYSCLK);
  125. }
  126. regtemp=READ_PERI_REG(SPI_CTRL(SPI))&SPI_FLASH_READ_MODE_MASK;
  127. CLEAR_PERI_REG_MASK(SPI_CTRL(HSPI), SPI_FLASH_READ_MODE_MASK);
  128. SET_PERI_REG_MASK(SPI_CTRL(HSPI), regtemp);
  129. spi_reg_backup(HSPI, hspi_dev_reg.hspi_flash_reg_backup);
  130. spi_master_init(HSPI);
  131. spi_reg_backup(HSPI, hspi_dev_reg.hspi_dev_reg_backup);
  132. hspi_dev_reg.hspi_reg_backup_flag=1;
  133. // spi_reg_recover(HSPI, hspi_dev_reg.hspi_flash_reg_backup);
  134. hspi_dev_reg.selected_dev_num=HSPI_IDLE;
  135. }
  136. hspi_dev_reg.hspi_dev_conf[dev_no].active=1;
  137. hspi_dev_reg.hspi_dev_conf[dev_no].clk_div=clk_div;
  138. hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar=clk_polar;
  139. switch(dev_no){
  140. case HSPI_CS_DEV :
  141. PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);
  142. PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);
  143. PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);
  144. PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);
  145. CLEAR_PERI_REG_MASK(PERIPHS_IO_MUX, BIT9);
  146. break;
  147. case SPI_CS1_DEV :
  148. PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_SPI_CS1);
  149. if(hspi_dev_reg.spi_io_80m){
  150. os_printf("SPI CS1 device must work at 80Mhz");
  151. }
  152. break;
  153. case SPI_CS2_DEV :
  154. PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_SPI_CS2);
  155. if(hspi_dev_reg.spi_io_80m){
  156. os_printf("SPI CS2 device must work at 80Mhz");
  157. }
  158. break;
  159. default: break;
  160. }
  161. }
  162. void ICACHE_FLASH_ATTR
  163. hspi_dev_sel(uint8 dev_no)
  164. {
  165. uint32 regval;
  166. if(dev_no>3){
  167. os_printf("hspi_dev_sel parameter is out of range!\n\r");
  168. return;
  169. }
  170. if(!hspi_dev_reg.hspi_dev_conf[dev_no].active){
  171. os_printf("device%d has not been initialized!\n\r",dev_no);
  172. return;
  173. }
  174. switch(hspi_dev_reg.selected_dev_num){
  175. case HSPI_CS_DEV:
  176. if((dev_no==SPI_CS1_DEV)||(dev_no==SPI_CS2_DEV)){
  177. WAIT_HSPI_IDLE();
  178. DISABLE_HSPI_DEV_CS();
  179. hspi_overlap_init();
  180. if(hspi_dev_reg.spi_io_80m) {SET_PERI_REG_MASK(SPI_CLOCK(HSPI), SPI_CLK_EQU_SYSCLK);}
  181. else {CONF_HSPI_CLK_DIV(hspi_dev_reg.hspi_dev_conf[dev_no].clk_div);}
  182. if(hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar) {HSPI_FALLING_EDGE_SAMPLE();}
  183. else {HSPI_RISING_EDGE_SAMPLE();}
  184. if(dev_no==SPI_CS1_DEV) {ACTIVE_HSPI_CS1;}
  185. else {ACTIVE_HSPI_CS2;}
  186. }
  187. else if(dev_no==SPI_CS0_FLASH){
  188. WAIT_HSPI_IDLE();
  189. DISABLE_HSPI_DEV_CS();
  190. hspi_overlap_init();
  191. spi_reg_recover(HSPI, hspi_dev_reg.hspi_flash_reg_backup);
  192. if(hspi_dev_reg.spi_io_80m) {SET_PERI_REG_MASK(SPI_CLOCK(HSPI), SPI_CLK_EQU_SYSCLK);}
  193. HSPI_RISING_EDGE_SAMPLE();
  194. ACTIVE_HSPI_CS0 ;
  195. }
  196. break;
  197. case SPI_CS1_DEV:
  198. if(dev_no==SPI_CS2_DEV){
  199. WAIT_HSPI_IDLE();
  200. if(!hspi_dev_reg.spi_io_80m) {CONF_HSPI_CLK_DIV(hspi_dev_reg.hspi_dev_conf[dev_no].clk_div);}
  201. if(hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar) {HSPI_FALLING_EDGE_SAMPLE();}
  202. else {HSPI_RISING_EDGE_SAMPLE();}
  203. ACTIVE_HSPI_CS2;
  204. }
  205. else if(dev_no==SPI_CS0_FLASH){
  206. WAIT_HSPI_IDLE();
  207. spi_reg_recover(HSPI, hspi_dev_reg.hspi_flash_reg_backup);
  208. HSPI_RISING_EDGE_SAMPLE();
  209. ACTIVE_HSPI_CS0;
  210. }
  211. else if(dev_no==HSPI_CS_DEV){
  212. WAIT_HSPI_IDLE();
  213. ENABLE_HSPI_DEV_CS();
  214. hspi_overlap_deinit();
  215. CONF_HSPI_CLK_DIV(hspi_dev_reg.hspi_dev_conf[dev_no].clk_div);
  216. if(hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar) {HSPI_FALLING_EDGE_SAMPLE();}
  217. else {HSPI_RISING_EDGE_SAMPLE();}
  218. ACTIVE_HSPI_CS0;
  219. }
  220. break;
  221. case SPI_CS2_DEV:
  222. if(dev_no==SPI_CS1_DEV){
  223. WAIT_HSPI_IDLE();
  224. if(!hspi_dev_reg.spi_io_80m) {CONF_HSPI_CLK_DIV(hspi_dev_reg.hspi_dev_conf[dev_no].clk_div);}
  225. if(hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar) {HSPI_FALLING_EDGE_SAMPLE();}
  226. else {HSPI_RISING_EDGE_SAMPLE();}
  227. ACTIVE_HSPI_CS1;
  228. }
  229. else if(dev_no==SPI_CS0_FLASH){
  230. WAIT_HSPI_IDLE();
  231. spi_reg_recover(HSPI, hspi_dev_reg.hspi_flash_reg_backup);
  232. HSPI_RISING_EDGE_SAMPLE();
  233. ACTIVE_HSPI_CS0;
  234. }
  235. else if(dev_no==HSPI_CS_DEV){
  236. WAIT_HSPI_IDLE();
  237. ENABLE_HSPI_DEV_CS();
  238. hspi_overlap_deinit();
  239. CONF_HSPI_CLK_DIV(hspi_dev_reg.hspi_dev_conf[dev_no].clk_div);
  240. if(hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar) {HSPI_FALLING_EDGE_SAMPLE();}
  241. else {HSPI_RISING_EDGE_SAMPLE();}
  242. ACTIVE_HSPI_CS0;
  243. }
  244. break;
  245. case SPI_CS0_FLASH:
  246. if((dev_no==SPI_CS1_DEV)||(dev_no==SPI_CS2_DEV)){
  247. WAIT_HSPI_IDLE();
  248. spi_reg_recover(HSPI, hspi_dev_reg.hspi_dev_reg_backup);
  249. if(hspi_dev_reg.spi_io_80m) {SET_PERI_REG_MASK(SPI_CLOCK(HSPI), SPI_CLK_EQU_SYSCLK);}
  250. else {CONF_HSPI_CLK_DIV(hspi_dev_reg.hspi_dev_conf[dev_no].clk_div);}
  251. if(hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar) {HSPI_FALLING_EDGE_SAMPLE();}
  252. else {HSPI_RISING_EDGE_SAMPLE();}
  253. if(dev_no==SPI_CS1_DEV) {ACTIVE_HSPI_CS1;}
  254. else {ACTIVE_HSPI_CS2;}
  255. }
  256. else if(dev_no==HSPI_CS_DEV){
  257. WAIT_HSPI_IDLE();
  258. ENABLE_HSPI_DEV_CS();
  259. hspi_overlap_deinit();
  260. spi_reg_recover(HSPI, hspi_dev_reg.hspi_dev_reg_backup);
  261. CONF_HSPI_CLK_DIV(hspi_dev_reg.hspi_dev_conf[dev_no].clk_div);
  262. if(hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar) {HSPI_FALLING_EDGE_SAMPLE();}
  263. else {HSPI_RISING_EDGE_SAMPLE();}
  264. ACTIVE_HSPI_CS0;
  265. }
  266. break;
  267. default:
  268. if((dev_no==SPI_CS1_DEV)||(dev_no==SPI_CS2_DEV)){
  269. WAIT_HSPI_IDLE();
  270. DISABLE_HSPI_DEV_CS();
  271. hspi_overlap_init();
  272. spi_reg_recover(HSPI, hspi_dev_reg.hspi_dev_reg_backup);
  273. if(hspi_dev_reg.spi_io_80m) {SET_PERI_REG_MASK(SPI_CLOCK(HSPI), SPI_CLK_EQU_SYSCLK);}
  274. else {CONF_HSPI_CLK_DIV(hspi_dev_reg.hspi_dev_conf[dev_no].clk_div);}
  275. if(hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar) {HSPI_FALLING_EDGE_SAMPLE();}
  276. else {HSPI_RISING_EDGE_SAMPLE();}
  277. if(dev_no==SPI_CS1_DEV) {ACTIVE_HSPI_CS1;}
  278. else {ACTIVE_HSPI_CS2;}
  279. }
  280. else if(dev_no==SPI_CS0_FLASH){
  281. WAIT_HSPI_IDLE();
  282. DISABLE_HSPI_DEV_CS();
  283. hspi_overlap_init();
  284. spi_reg_recover(HSPI, hspi_dev_reg.hspi_flash_reg_backup);
  285. if(hspi_dev_reg.spi_io_80m) {SET_PERI_REG_MASK(SPI_CLOCK(HSPI), SPI_CLK_EQU_SYSCLK);}
  286. HSPI_RISING_EDGE_SAMPLE();
  287. ACTIVE_HSPI_CS0 ;
  288. }
  289. else if(dev_no==HSPI_CS_DEV){
  290. WAIT_HSPI_IDLE();
  291. ENABLE_HSPI_DEV_CS();
  292. hspi_overlap_deinit();
  293. spi_reg_recover(HSPI, hspi_dev_reg.hspi_dev_reg_backup);
  294. CONF_HSPI_CLK_DIV(hspi_dev_reg.hspi_dev_conf[dev_no].clk_div);
  295. if(hspi_dev_reg.hspi_dev_conf[dev_no].clk_polar) {HSPI_FALLING_EDGE_SAMPLE();}
  296. else {HSPI_RISING_EDGE_SAMPLE();}
  297. ACTIVE_HSPI_CS0;
  298. }
  299. break;
  300. }
  301. hspi_dev_reg.selected_dev_num=dev_no;
  302. }
  303. /******************************************************************************
  304. * FunctionName : spi_read_data
  305. * Description : use hspi to read flash data for stability test
  306. * Parameters : SpiFlashChip * spi-- flash parameter structure pointer
  307. * uint32 flash_addr--flash start address
  308. * uint32 * addr_dest--start address for preped destination memory space
  309. * uint32 byte_length--length of the data which needs to be read from flash
  310. *******************************************************************************/
  311. SpiFlashOpResult ICACHE_FLASH_ATTR
  312. hspi_overlap_read_flash_data(SpiFlashChip * spi, uint32 flash_addr, uint32 * addr_dest, uint32 byte_length)
  313. {
  314. uint32 temp_addr,reg_tmp;
  315. sint32 temp_length;
  316. uint8 i;
  317. uint8 remain_word_num;
  318. hspi_dev_sel(SPI_CS0_FLASH);
  319. //address range check
  320. if ((flash_addr+byte_length) > (spi->chip_size))
  321. {
  322. return SPI_FLASH_RESULT_ERR;
  323. }
  324. temp_addr = flash_addr;
  325. temp_length = byte_length;
  326. while(temp_length > 0)
  327. {
  328. if(temp_length >= SPI_BUFF_BYTE_NUM)
  329. {
  330. // reg_tmp=((temp_addr&0xff)<<16)|(temp_addr&0xff00)|((temp_addr&0xff0000)>>16)|(SPI_BUFF_BYTE_NUM << SPI_FLASH_BYTES_LEN);
  331. reg_tmp= temp_addr |(SPI_BUFF_BYTE_NUM<< SPI_FLASH_BYTES_LEN) ;
  332. WRITE_PERI_REG(SPI_ADDR(HSPI), reg_tmp);
  333. WRITE_PERI_REG(SPI_CMD(HSPI), SPI_FLASH_READ);
  334. while(READ_PERI_REG(SPI_CMD(HSPI)) != 0);
  335. for(i=0; i<(SPI_BUFF_BYTE_NUM>>2);i++)
  336. {
  337. *addr_dest++ = READ_PERI_REG(SPI_W0(HSPI)+i*4);
  338. }
  339. temp_length = temp_length - SPI_BUFF_BYTE_NUM;
  340. temp_addr = temp_addr + SPI_BUFF_BYTE_NUM;
  341. }
  342. else
  343. {
  344. WRITE_PERI_REG(SPI_ADDR(HSPI), temp_addr |(temp_length << SPI_FLASH_BYTES_LEN ));
  345. WRITE_PERI_REG(SPI_CMD(HSPI), SPI_FLASH_READ);
  346. while(READ_PERI_REG(SPI_CMD(HSPI)) != 0);
  347. remain_word_num = (0== (temp_length&0x3))? (temp_length>>2) : (temp_length>>2)+1;
  348. for (i=0; i<remain_word_num; i++)
  349. {
  350. *addr_dest++ = READ_PERI_REG(SPI_W0(HSPI)+i*4);
  351. }
  352. temp_length = 0;
  353. }
  354. }
  355. return SPI_FLASH_RESULT_OK;
  356. }
  357. void ICACHE_FLASH_ATTR
  358. hspi_overlap_flash_init(void)
  359. {
  360. hspi_master_dev_init(SPI_CS0_FLASH,0,0);
  361. spi_flash_set_read_func(hspi_overlap_read_flash_data);
  362. }