1 /*
2  * SPDX-FileCopyrightText: 2019-2025 SiFli Technologies(Nanjing) Co., Ltd
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include "bf0_hal.h"
8 #include <string.h>
9 #include <stdlib.h>
10 #include "drv_io.h"
11 /** @addtogroup BF0_HAL_Driver
12   * @{
13   */
14 
15 /** @defgroup FLASH FLASH
16   * @brief FLASH HAL module driver
17   * @{
18   */
19 
20 
21 #if defined(HAL_MPI_MODULE_ENABLED)||defined(_SIFLI_DOXYGEN_)
22 
23 #include "flash_table.h"
24 
HAL_QSPI_Init(FLASH_HandleTypeDef * hflash,qspi_configure_t * cfg)25 __HAL_ROM_USED HAL_StatusTypeDef HAL_QSPI_Init(FLASH_HandleTypeDef *hflash, qspi_configure_t *cfg)
26 {
27     if (hflash == NULL || cfg == NULL)
28         return HAL_ERROR;
29 
30     hflash->ErrorCode = 0;
31     hflash->State = HAL_FLASH_STATE_READY;
32 
33     hflash->Instance = cfg->Instance;
34     hflash->Mode = cfg->line;
35     hflash->base = cfg->base;
36     hflash->size = cfg->msize * 0x100000;
37 
38     hflash->Instance->TIMR = 0xFF;
39     hflash->Instance->CIR = 0x50005000;
40     hflash->Instance->ABR1 = 0xFF;
41     hflash->Instance->HRABR = 0xff;
42 
43     return HAL_OK;
44 }
45 
HAL_FLASH_PreInit(FLASH_HandleTypeDef * hflash)46 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_PreInit(FLASH_HandleTypeDef *hflash)
47 {
48     uint8_t fid, did, mtype;
49     int size = 0;
50 
51     if (hflash == NULL)
52         return HAL_ERROR;
53 
54     hflash->ErrorCode = 0;
55     hflash->State = HAL_FLASH_STATE_READY;
56 
57     //hflash->Instance = cfg->Instance;
58     hflash->Mode = 0;
59     //hflash->base = cfg->base;
60     //hflash->size = cfg->msize * 0x100000;
61 
62     hflash->Instance->TIMR = 0xFF;
63     hflash->Instance->CIR = 0x50005000;
64     hflash->Instance->ABR1 = 0xFF;
65     hflash->Instance->HRABR = 0xff;
66 
67     hflash->isNand =  0;
68     hflash->dma = NULL;
69 
70     // enable QSPI
71     HAL_FLASH_ENABLE_QSPI(hflash, 1);
72 
73     uint32_t dev_id = HAL_FLASH_GET_NOR_ID(hflash);
74     fid = (uint8_t)dev_id & 0xff;
75     mtype = (uint8_t)((dev_id >> 8) & 0xff);
76     did = (uint8_t)((dev_id >> 16) & 0xff);
77 
78     hflash->ctable = spi_flash_get_cmd_by_id(fid, did, mtype);
79     if (hflash->ctable  == NULL)
80     {
81         // disable QSPI
82         HAL_FLASH_ENABLE_QSPI(hflash, 0);
83         return HAL_ERROR;
84     }
85 
86     size = spi_flash_get_size_by_id(fid, did, mtype);
87     if (size != 0)  // use size from table to replace configure size
88     {
89         hflash->size = size;
90     }
91 
92     // only nor need set QE mode at initial
93     if (hflash->isNand == SPI_MODE_NOR)
94     {
95         HAL_FLASH_CLR_PROTECT(hflash);
96         //HAL_Delay_us(30);
97         if (hflash->size > NOR_FLASH_MAX_3B_SIZE)
98         {
99             // enter 4 byte address mode
100             HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_EN4BM, 0);
101 
102             if (hflash->Mode == HAL_FLASH_NOR_MODE)
103             {
104                 HAL_FLASH_FADDR_SET_QSPI(hflash, false);
105             }
106             else
107             {
108                 HAL_FLASH_FADDR_SET_QSPI(hflash, true);
109             }
110         }
111         else
112         {
113             if (hflash->Mode == HAL_FLASH_NOR_MODE)
114             {
115                 HAL_FLASH_SET_QUAL_SPI(hflash, false);
116             }
117             else
118             {
119                 HAL_FLASH_SET_QUAL_SPI(hflash, true);
120             }
121         }
122     }
123 
124     return HAL_OK;
125 }
126 
HAL_FLASH_SET_AHB_RCMD(FLASH_HandleTypeDef * hflash,uint8_t cmd)127 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_AHB_RCMD(FLASH_HandleTypeDef *hflash, uint8_t cmd)
128 {
129     uint32_t value;
130     if (hflash == NULL)
131         return HAL_ERROR;
132 
133     value = hflash->Instance->HCMDR & (~MPI_HCMDR_RCMD_Msk);
134 
135     value |= ((cmd & 0xff) << MPI_HCMDR_RCMD_Pos);
136     hflash->Instance->HCMDR = value;
137 
138     return HAL_OK;
139 }
140 
HAL_FLASH_CFG_AHB_RCMD(FLASH_HandleTypeDef * hflash,int8_t data_mod,int8_t dum_cyc,int8_t ab_size,int8_t ab_mod,int8_t addr_size,int8_t addr_mod,int8_t cmd_mode)141 __HAL_ROM_USED void HAL_FLASH_CFG_AHB_RCMD(FLASH_HandleTypeDef *hflash, int8_t data_mod,
142         int8_t dum_cyc, int8_t ab_size, int8_t ab_mod,
143         int8_t addr_size, int8_t addr_mod, int8_t cmd_mode)
144 {
145     if (hflash == NULL)
146         return;
147 
148     uint32_t value = hflash->Instance->HRCCR;
149     uint32_t mask = MPI_HRCCR_DMODE | MPI_HRCCR_DCYC
150                     | MPI_HRCCR_ABSIZE | MPI_HRCCR_ABMODE | MPI_HRCCR_ADSIZE
151                     | MPI_HRCCR_ADMODE | MPI_HRCCR_IMODE;
152 
153     value &= ~mask;
154     value |= ((data_mod << MPI_HRCCR_DMODE_Pos)
155               | (dum_cyc << MPI_HRCCR_DCYC_Pos) | (addr_size << MPI_HRCCR_ADSIZE_Pos)
156               | (ab_mod << MPI_HRCCR_ABMODE_Pos) | (ab_size << MPI_HRCCR_ABSIZE_Pos)
157               | (addr_mod << MPI_HRCCR_ADMODE_Pos) | (cmd_mode << MPI_HRCCR_IMODE_Pos));
158 
159     hflash->Instance->HRCCR = value;
160 }
161 
HAL_FLASH_SET_AHB_WCMD(FLASH_HandleTypeDef * hflash,uint8_t cmd)162 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_AHB_WCMD(FLASH_HandleTypeDef *hflash, uint8_t cmd)
163 {
164     uint32_t value;
165     if (hflash == NULL)
166         return HAL_ERROR;
167 
168     value = hflash->Instance->HCMDR & (~MPI_HCMDR_WCMD_Msk);
169 
170     value |= ((cmd & 0xff) << MPI_HCMDR_WCMD_Pos);
171     hflash->Instance->HCMDR = value;
172 
173     return HAL_OK;
174 }
175 
HAL_FLASH_CFG_AHB_WCMD(FLASH_HandleTypeDef * hflash,int8_t data_mod,int8_t dum_cyc,int8_t ab_size,int8_t ab_mod,int8_t addr_size,int8_t addr_mod,int8_t cmd_mode)176 __HAL_ROM_USED void HAL_FLASH_CFG_AHB_WCMD(FLASH_HandleTypeDef *hflash, int8_t data_mod,
177         int8_t dum_cyc, int8_t ab_size, int8_t ab_mod,
178         int8_t addr_size, int8_t addr_mod, int8_t cmd_mode)
179 {
180     if (hflash == NULL)
181         return;
182 
183     uint32_t value = hflash->Instance->HWCCR;
184     uint32_t mask = MPI_HWCCR_DMODE | MPI_HWCCR_DCYC
185                     | MPI_HWCCR_ABSIZE | MPI_HWCCR_ABMODE | MPI_HWCCR_ADSIZE
186                     | MPI_HWCCR_ADMODE | MPI_HWCCR_IMODE;
187 
188     value &= ~mask;
189     value |= ((data_mod << MPI_HWCCR_DMODE_Pos)
190               | (dum_cyc << MPI_HWCCR_DCYC_Pos) | (addr_size << MPI_HWCCR_ADSIZE_Pos)
191               | (ab_mod << MPI_HWCCR_ABMODE_Pos) | (ab_size << MPI_HWCCR_ABSIZE_Pos)
192               | (addr_mod << MPI_HWCCR_ADMODE_Pos) | (cmd_mode << MPI_HWCCR_IMODE_Pos));
193 
194     hflash->Instance->HWCCR = value;
195 }
196 
HAL_FLASH_SET_CMD(FLASH_HandleTypeDef * hflash,uint8_t cmd,uint32_t addr)197 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_CMD(FLASH_HandleTypeDef *hflash, uint8_t cmd, uint32_t addr)
198 {
199 
200     HAL_StatusTypeDef res = HAL_OK;
201 
202     if (hflash == NULL)
203         return HAL_ERROR;
204 
205     hflash->Instance->AR1 = addr;
206     if (hflash->cs_ctrl != NULL)
207     {
208 #if 0
209         hflash->cs_ctrl(0);
210         // DELAY
211         volatile uint32_t i = 240 / 5; // max 240m?
212         while (i-- > 0);
213 #endif
214         hflash->cs_ctrl(1);
215     }
216     hflash->Instance->CMDR1 = cmd & 0XFF;
217 
218     while (!HAL_FLASH_IS_CMD_DONE(hflash));
219     HAL_FLASH_CLR_CMD_DONE(hflash);
220 
221     if (hflash->cs_ctrl)
222     {
223         /* pull up CS after command is done */
224         hflash->cs_ctrl(0);
225     }
226 
227     return res;
228 }
229 
HAL_FLASH_CFG_CMD(FLASH_HandleTypeDef * hflash,uint8_t cmd,uint32_t addr,uint8_t is_cmd2)230 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_CFG_CMD(FLASH_HandleTypeDef *hflash, uint8_t cmd, uint32_t addr, uint8_t is_cmd2)
231 {
232 
233     HAL_StatusTypeDef res = HAL_OK;
234 
235     if (hflash == NULL)
236         return HAL_ERROR;
237 
238     if (is_cmd2)
239     {
240         hflash->Instance->AR2 = addr;
241         hflash->Instance->CMDR2 = cmd & 0XFF;
242     }
243     else
244     {
245         hflash->Instance->AR1 = addr;
246         hflash->Instance->CMDR1 = cmd & 0XFF;
247     }
248 
249     return res;
250 }
251 
252 
HAL_FLASH_WRITE_WORD(FLASH_HandleTypeDef * hflash,uint32_t data)253 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_WRITE_WORD(FLASH_HandleTypeDef *hflash, uint32_t data)
254 {
255     if (hflash == NULL)
256         return HAL_ERROR;
257 
258     hflash->Instance->DR = data;
259 
260     return HAL_OK;
261 }
262 
HAL_FLASH_WRITE_DLEN(FLASH_HandleTypeDef * hflash,uint32_t len)263 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_WRITE_DLEN(FLASH_HandleTypeDef *hflash, uint32_t len)
264 {
265     if (hflash == NULL)
266         return HAL_ERROR;
267 
268     hflash->Instance->DLR1 = (len - 1) & MPI_DLR1_DLEN_Msk;
269 
270     return HAL_OK;
271 }
272 
HAL_FLASH_WRITE_DLEN2(FLASH_HandleTypeDef * hflash,uint16_t len)273 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_WRITE_DLEN2(FLASH_HandleTypeDef *hflash, uint16_t len)
274 {
275     if (hflash == NULL)
276         return HAL_ERROR;
277 
278     hflash->Instance->DLR2 = (len - 1) & MPI_DLR2_DLEN_Msk;
279 
280     return HAL_OK;
281 }
282 
HAL_FLASH_WRITE_ABYTE(FLASH_HandleTypeDef * hflash,uint32_t ab)283 __HAL_ROM_USED void HAL_FLASH_WRITE_ABYTE(FLASH_HandleTypeDef *hflash, uint32_t ab)
284 {
285     if (hflash == NULL)
286         return;
287 
288     hflash->Instance->ABR1 = ab;
289 }
290 
HAL_FLASH_IS_CMD_DONE(FLASH_HandleTypeDef * hflash)291 __HAL_ROM_USED bool HAL_FLASH_IS_CMD_DONE(FLASH_HandleTypeDef *hflash)
292 {
293     if (hflash == NULL)
294         return false;
295 
296     return (hflash->Instance->SR & MPI_SR_TCF);
297 }
298 
HAL_FLASH_CLR_CMD_DONE(FLASH_HandleTypeDef * hflash)299 __HAL_ROM_USED void HAL_FLASH_CLR_CMD_DONE(FLASH_HandleTypeDef *hflash)
300 {
301     if (hflash == NULL)
302         return ;
303 
304     hflash->Instance->SCR |= MPI_SCR_TCFC;
305 }
306 
HAL_FLASH_CLR_STATUS(FLASH_HandleTypeDef * hflash,uint32_t status)307 __HAL_ROM_USED void HAL_FLASH_CLR_STATUS(FLASH_HandleTypeDef *hflash, uint32_t status)
308 {
309     if (hflash == NULL)
310         return ;
311 
312     hflash->Instance->SCR |= status;
313 }
314 
HAL_FLASH_IS_BUSY(FLASH_HandleTypeDef * hflash)315 __HAL_ROM_USED bool HAL_FLASH_IS_BUSY(FLASH_HandleTypeDef *hflash)
316 {
317     if (hflash == NULL)
318         return false;
319 
320     return (hflash->Instance->SR & MPI_SR_BUSY);
321 }
322 
HAL_FLASH_STATUS_MATCH(FLASH_HandleTypeDef * hflash)323 __HAL_ROM_USED bool HAL_FLASH_STATUS_MATCH(FLASH_HandleTypeDef *hflash)
324 {
325     if (hflash == NULL)
326         return false;
327 
328     return (hflash->Instance->SR & MPI_SR_SMF_Msk);
329 }
330 
HAL_FLASH_IS_RX_EMPTY(FLASH_HandleTypeDef * hflash)331 __HAL_ROM_USED bool HAL_FLASH_IS_RX_EMPTY(FLASH_HandleTypeDef *hflash)
332 {
333     if (hflash == NULL)
334         return false;
335 
336     return (hflash->Instance->FIFOCR & MPI_FIFOCR_RXE);
337 }
338 
HAL_FLASH_IS_TX_FULL(FLASH_HandleTypeDef * hflash)339 __HAL_ROM_USED bool HAL_FLASH_IS_TX_FULL(FLASH_HandleTypeDef *hflash)
340 {
341     if (hflash == NULL)
342         return false;
343 
344     return (hflash->Instance->FIFOCR & MPI_FIFOCR_TXF);
345 }
HAL_FLASH_IS_TX_EMPTY(FLASH_HandleTypeDef * hflash)346 __HAL_ROM_USED bool HAL_FLASH_IS_TX_EMPTY(FLASH_HandleTypeDef *hflash)
347 {
348     if (hflash == NULL)
349         return false;
350 
351     return (hflash->Instance->SR & MPI_SR_FUF);
352 }
353 
HAL_FLASH_IS_PROG_DONE(FLASH_HandleTypeDef * hflash)354 __HAL_ROM_USED bool HAL_FLASH_IS_PROG_DONE(FLASH_HandleTypeDef *hflash)
355 {
356     if (hflash == NULL)
357         return true;
358 
359     // CHECK WIP : Write in Progress, 1 means device busy, 0 means device idle
360     // tdr and rdr all in DR now
361     return !(hflash->Instance->DR & 0X01);
362 }
363 
HAL_FLASH_READ32(FLASH_HandleTypeDef * hflash)364 __HAL_ROM_USED uint32_t HAL_FLASH_READ32(FLASH_HandleTypeDef *hflash)
365 {
366     if (hflash == NULL)
367         return 0;
368 
369     return (uint32_t)(hflash->Instance->DR);
370 }
371 
HAL_FLASH_CLEAR_FIFO(FLASH_HandleTypeDef * hflash,HAL_FLASH_ClearFifo mode)372 __HAL_ROM_USED void HAL_FLASH_CLEAR_FIFO(FLASH_HandleTypeDef *hflash, HAL_FLASH_ClearFifo mode)
373 {
374     if (hflash == NULL)
375         return;
376 
377     switch (mode)
378     {
379     case HAL_FLASH_CLR_RX_FIFO:
380         hflash->Instance->FIFOCR |= MPI_FIFOCR_RXCLR;
381         break;
382     case HAL_FLASH_CLR_TX_FIFO:
383         hflash->Instance->FIFOCR |= MPI_FIFOCR_TXCLR;
384         break;
385     case HAL_FLASH_CLR_RX_TX_FIFO:
386         hflash->Instance->FIFOCR |= (MPI_FIFOCR_RXCLR | MPI_FIFOCR_TXCLR);
387         //hflash->Instance->FIFOCR = MPI_FIFOCR_TXCLR;
388         break;
389     }
390 
391     //while (HAL_FLASH_IS_BUSY(hflash));
392 }
393 
HAL_FLASH_SET_TXSLOT(FLASH_HandleTypeDef * hflash,uint8_t slot)394 __HAL_ROM_USED void HAL_FLASH_SET_TXSLOT(FLASH_HandleTypeDef *hflash, uint8_t slot)
395 {
396     if (hflash == NULL)
397         return ;
398 
399     uint32_t value = hflash->Instance->FIFOCR & (~MPI_FIFOCR_TXSLOTS);
400 
401     hflash->Instance->FIFOCR = value | ((slot & 0x1f) << MPI_FIFOCR_TXSLOTS_Pos);
402 }
403 
HAL_FLASH_SET_CLK_rom(FLASH_HandleTypeDef * hflash,uint8_t div)404 __WEAK void HAL_FLASH_SET_CLK_rom(FLASH_HandleTypeDef *hflash, uint8_t div)
405 {
406     if (hflash == NULL)
407         return;
408 
409     //uint32_t value = hflash->Instance->CCR1;
410     //value &= ~QSPI_CCR1_DCYC;
411     //value |= ((delay & 0xf) << QSPI_CCR1_DCYC_Pos);
412 
413     //hflash->Instance->CCR1 = value;
414     hflash->Instance->PSCLR = div;
415 }
416 
HAL_FLASH_GET_DIV(FLASH_HandleTypeDef * hflash)417 __HAL_ROM_USED uint8_t HAL_FLASH_GET_DIV(FLASH_HandleTypeDef *hflash)
418 {
419     uint8_t div = 0;
420     if (hflash == NULL)
421         return div;
422 
423     div = GET_REG_VAL(hflash->Instance->PSCLR, MPI_PSCLR_DIV_Msk, MPI_PSCLR_DIV_Pos);
424     return div;
425 }
426 
HAL_FLASH_MANUAL_CMD(FLASH_HandleTypeDef * hflash,int8_t func_mod,int8_t data_mod,int8_t dum_cyc,int8_t ab_size,int8_t ab_mod,int8_t addr_size,int8_t addr_mod,int8_t cmd_mode)427 __HAL_ROM_USED void HAL_FLASH_MANUAL_CMD(FLASH_HandleTypeDef *hflash, int8_t func_mod, int8_t data_mod,
428         int8_t dum_cyc, int8_t ab_size, int8_t ab_mod,
429         int8_t addr_size, int8_t addr_mod, int8_t cmd_mode)
430 {
431     if (hflash == NULL)
432         return;
433 
434     uint32_t value = hflash->Instance->CCR1;
435     uint32_t mask = MPI_CCR1_FMODE | MPI_CCR1_DMODE | MPI_CCR1_DCYC
436                     | MPI_CCR1_ABMODE | MPI_CCR1_ABSIZE | MPI_CCR1_ADSIZE
437                     | MPI_CCR1_ADMODE | MPI_CCR1_IMODE;
438 
439     value &= ~mask;
440     value |= ((func_mod << MPI_CCR1_FMODE_Pos) | (data_mod << MPI_CCR1_DMODE_Pos)
441               | (dum_cyc << MPI_CCR1_DCYC_Pos) | (addr_size << MPI_CCR1_ADSIZE_Pos)
442               | (ab_mod << MPI_CCR1_ABMODE_Pos) | (ab_size << MPI_CCR1_ABSIZE_Pos)
443               | (addr_mod << MPI_CCR1_ADMODE_Pos) | (cmd_mode << MPI_CCR1_IMODE_Pos));
444 
445     hflash->Instance->CCR1 = value;
446 }
447 
HAL_FLASH_MANUAL_CMD2(FLASH_HandleTypeDef * hflash,int8_t func_mod,int8_t data_mod,int8_t dum_cyc,int8_t ab_size,int8_t ab_mod,int8_t addr_size,int8_t addr_mod,int8_t cmd_mode)448 __HAL_ROM_USED void HAL_FLASH_MANUAL_CMD2(FLASH_HandleTypeDef *hflash, int8_t func_mod, int8_t data_mod,
449         int8_t dum_cyc, int8_t ab_size, int8_t ab_mod,
450         int8_t addr_size, int8_t addr_mod, int8_t cmd_mode)
451 {
452     if (hflash == NULL)
453         return;
454 
455     uint32_t value = hflash->Instance->CCR2;
456     uint32_t mask = MPI_CCR2_FMODE | MPI_CCR2_DMODE | MPI_CCR2_DCYC
457                     | MPI_CCR2_ABMODE | MPI_CCR2_ABSIZE | MPI_CCR2_ADSIZE
458                     | MPI_CCR2_ADMODE | MPI_CCR2_IMODE;
459 
460     value &= ~mask;
461     value |= ((func_mod << MPI_CCR2_FMODE_Pos) | (data_mod << MPI_CCR2_DMODE_Pos)
462               | (dum_cyc << MPI_CCR2_DCYC_Pos) | (addr_size << MPI_CCR2_ADSIZE_Pos)
463               | (ab_mod << MPI_CCR2_ABMODE_Pos) | (ab_size << MPI_CCR2_ABSIZE_Pos)
464               | (addr_mod << MPI_CCR2_ADMODE_Pos) | (cmd_mode << MPI_CCR2_IMODE_Pos));
465 
466     hflash->Instance->CCR2 = value;
467 }
468 
469 
HAL_FLASH_SET_ALIAS_RANGE(FLASH_HandleTypeDef * hflash,uint32_t start,uint32_t len)470 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_ALIAS_RANGE(FLASH_HandleTypeDef *hflash, uint32_t start, uint32_t len)
471 {
472     HAL_StatusTypeDef res = HAL_OK;
473     uint32_t end;
474     if (hflash == NULL)
475         return HAL_ERROR;
476 
477     end = (start + len + 0x3ff) & MPI_AAEAR_EA;  // make end address aligned to 1024
478     hflash->Instance->AASAR = start & MPI_AASAR_SA;
479     hflash->Instance->AAEAR = end;
480 
481     return res;
482 }
483 
HAL_FLASH_SET_ALIAS_OFFSET(FLASH_HandleTypeDef * hflash,uint32_t offset)484 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_ALIAS_OFFSET(FLASH_HandleTypeDef *hflash, uint32_t offset)
485 {
486     HAL_StatusTypeDef res = HAL_OK;
487     if (hflash == NULL)
488         return HAL_ERROR;
489 
490     hflash->Instance->AAOAR = offset & MPI_AAOAR_OA;
491 
492     return res;
493 }
494 
HAL_FLASH_SET_CTR(FLASH_HandleTypeDef * hflash,uint32_t start,uint32_t end)495 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_CTR(FLASH_HandleTypeDef *hflash, uint32_t start, uint32_t end)
496 {
497     if (hflash == NULL)
498         return HAL_ERROR;
499 
500     hflash->Instance->CTRSAR = start & MPI_CTRSAR_SA;    // make start address aligned to 1024
501     hflash->Instance->CTREAR = (end + 0x3ff) & MPI_CTREAR_EA; // make end address aligned to 1024
502 
503     return HAL_OK;
504 }
505 
HAL_FLASH_SET_NONCE(FLASH_HandleTypeDef * hflash,uint8_t * data)506 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_NONCE(FLASH_HandleTypeDef *hflash, uint8_t *data)
507 {
508     if (hflash == NULL || data == NULL)
509         return HAL_ERROR;
510 
511     hflash->Instance->NONCEA = data[3] | ((uint32_t)data[2] << 8) | ((uint32_t)data[1] << 16) | ((uint32_t)data[0] << 24);
512     hflash->Instance->NONCEB = data[7] | ((uint32_t)data[6] << 8) | ((uint32_t)data[5] << 16) | ((uint32_t)data[4] << 24);
513 
514     return HAL_OK;
515 }
516 
HAL_FLASH_SET_AES(FLASH_HandleTypeDef * hflash,HAL_FLASH_AES_Mode mode)517 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_AES(FLASH_HandleTypeDef *hflash, HAL_FLASH_AES_Mode mode)
518 {
519     if (hflash == NULL)
520         return HAL_ERROR;
521 
522     if (mode == HAL_FLASH_AES256)
523     {
524         hflash->Instance->CR |= MPI_CR_CTRM;
525     }
526     else    // AES 128
527     {
528         hflash->Instance->CR &= (~MPI_CR_CTRM);
529         //hflash->Instance->CR |= (FLASHC_CR_CTRM_AES128);
530     }
531 
532     return HAL_OK;
533 }
534 
HAL_FLASH_ENABLE_AES(FLASH_HandleTypeDef * hflash,uint8_t en)535 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_ENABLE_AES(FLASH_HandleTypeDef *hflash, uint8_t en)
536 {
537     if (hflash == NULL)
538         return HAL_ERROR;
539 
540     if (en)
541     {
542         hflash->Instance->CR |= MPI_CR_CTRE;
543     }
544     else
545     {
546         hflash->Instance->CR &= (~MPI_CR_CTRE);
547     }
548 
549     return HAL_OK;
550 }
551 
HAL_FLASH_ENABLE_QSPI(FLASH_HandleTypeDef * hflash,uint8_t en)552 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_ENABLE_QSPI(FLASH_HandleTypeDef *hflash, uint8_t en)
553 {
554     if (hflash == NULL)
555         return HAL_ERROR;
556 
557     if (en)
558     {
559         hflash->Instance->CR |= MPI_CR_EN;
560     }
561     else
562     {
563         hflash->Instance->CR &= (~MPI_CR_EN);
564     }
565 
566     return HAL_OK;
567 }
568 
HAL_FLASH_ENABLE_OPI(FLASH_HandleTypeDef * hflash,uint8_t en)569 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_ENABLE_OPI(FLASH_HandleTypeDef *hflash, uint8_t en)
570 {
571     if (hflash == NULL)
572         return HAL_ERROR;
573 
574     if (en)
575     {
576         hflash->Instance->CR |= MPI_CR_OPIE;
577     }
578     else
579     {
580         hflash->Instance->CR &= (~MPI_CR_OPIE);
581     }
582 
583     return HAL_OK;
584 }
585 
HAL_FLASH_ENABLE_HYPER(FLASH_HandleTypeDef * hflash,uint8_t en)586 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_ENABLE_HYPER(FLASH_HandleTypeDef *hflash, uint8_t en)
587 {
588     if (hflash == NULL)
589         return HAL_ERROR;
590 
591     if (en)
592     {
593         hflash->Instance->DCR |= MPI_DCR_HYPER;
594     }
595     else
596     {
597         hflash->Instance->DCR &= (~MPI_DCR_HYPER);
598     }
599 
600     return HAL_OK;
601 }
602 
HAL_FLASH_ENABLE_CMD2(FLASH_HandleTypeDef * hflash,uint8_t en)603 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_ENABLE_CMD2(FLASH_HandleTypeDef *hflash, uint8_t en)
604 {
605     if (hflash == NULL)
606         return HAL_ERROR;
607 
608     if (en)
609     {
610         hflash->Instance->CR |= MPI_CR_CMD2E ;
611     }
612     else
613     {
614         hflash->Instance->CR &= ~(MPI_CR_CMD2E);
615     }
616 
617     return HAL_OK;
618 }
619 
HAL_FLASH_STAUS_MATCH_CMD2(FLASH_HandleTypeDef * hflash,uint8_t en)620 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_STAUS_MATCH_CMD2(FLASH_HandleTypeDef *hflash, uint8_t en)
621 {
622     if (hflash == NULL)
623         return HAL_ERROR;
624 
625     if (en)
626     {
627         hflash->Instance->CR |=  MPI_CR_SME2;
628     }
629     else
630     {
631         hflash->Instance->CR &= ~(MPI_CR_SME2);
632     }
633 
634     return HAL_OK;
635 }
636 
637 
HAL_FLASH_SET_CS_TIME(FLASH_HandleTypeDef * hflash,uint16_t cslmin,uint16_t cslmax,uint16_t cshmin,uint16_t trcmin)638 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_CS_TIME(FLASH_HandleTypeDef *hflash,
639         uint16_t cslmin, uint16_t cslmax, uint16_t cshmin, uint16_t trcmin)
640 {
641     uint32_t val;
642 
643     if (hflash == NULL)
644         return HAL_ERROR;
645 
646     val = hflash->Instance->DCR;
647     val &= ~(MPI_DCR_CSLMAX | MPI_DCR_CSLMIN | MPI_DCR_CSHMIN | MPI_DCR_TRCMIN);
648     val |= (cslmax << MPI_DCR_CSLMAX_Pos) | (cslmin << MPI_DCR_CSLMIN_Pos) | (cshmin << MPI_DCR_CSHMIN_Pos) | (trcmin << MPI_DCR_TRCMIN_Pos);
649     hflash->Instance->DCR = val;
650 
651     return HAL_OK;
652 }
653 
HAL_FLASH_SET_ROW_BOUNDARY(FLASH_HandleTypeDef * hflash,uint8_t rb_size)654 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_ROW_BOUNDARY(FLASH_HandleTypeDef *hflash, uint8_t rb_size)
655 {
656     if (hflash == NULL)
657         return HAL_ERROR;
658 
659     MODIFY_REG(hflash->Instance->DCR, MPI_DCR_RBSIZE_Msk, MAKE_REG_VAL(rb_size, MPI_DCR_RBSIZE_Msk, MPI_DCR_RBSIZE_Pos));
660 
661     return HAL_OK;
662 }
663 
HAL_FLASH_SET_LEGACY(FLASH_HandleTypeDef * hflash,uint8_t en)664 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_LEGACY(FLASH_HandleTypeDef *hflash, uint8_t en)
665 {
666     if (hflash == NULL)
667         return HAL_ERROR;
668 
669     if (en)
670         hflash->Instance->DCR |= MPI_DCR_XLEGACY;
671     else
672         hflash->Instance->DCR &= ~MPI_DCR_XLEGACY;
673 
674     return HAL_OK;
675 }
676 
677 
HAL_FLASH_SET_DUAL_MODE(FLASH_HandleTypeDef * hflash,uint8_t dual)678 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_DUAL_MODE(FLASH_HandleTypeDef *hflash, uint8_t dual)
679 {
680     if (hflash == NULL)
681         return HAL_ERROR;
682 
683     if (dual)
684         hflash->Instance->CR |= MPI_CR_DFM;
685     else
686         hflash->Instance->CR &= ~MPI_CR_DFM;
687 
688     return HAL_OK;
689 }
690 
HAL_FLASH_GET_DUAL_MODE(FLASH_HandleTypeDef * hflash)691 __HAL_ROM_USED int HAL_FLASH_GET_DUAL_MODE(FLASH_HandleTypeDef *hflash)
692 {
693     if (hflash == NULL)
694         return 0;
695 
696     if (hflash->Instance->CR & MPI_CR_DFM)
697         return 1;
698 
699     return 0;
700 }
701 
HAL_FLASH_SET_X16_MODE(FLASH_HandleTypeDef * hflash,uint8_t en)702 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_X16_MODE(FLASH_HandleTypeDef *hflash, uint8_t en)
703 {
704     if (hflash == NULL)
705         return HAL_ERROR;
706 
707     if (en)
708         hflash->Instance->CR |= MPI_CR_MX16;
709     else
710         hflash->Instance->CR &= ~MPI_CR_MX16;
711 
712     return HAL_OK;
713 }
714 
HAL_MPI_EN_FIXLAT(FLASH_HandleTypeDef * hflash,uint8_t fix)715 __HAL_ROM_USED HAL_StatusTypeDef HAL_MPI_EN_FIXLAT(FLASH_HandleTypeDef *hflash, uint8_t fix)
716 {
717     if (hflash == NULL)
718         return HAL_ERROR;
719 
720     if (fix)
721         hflash->Instance->DCR |= MPI_DCR_FIXLAT;
722     else
723         hflash->Instance->DCR &= ~MPI_DCR_FIXLAT;
724 
725     return HAL_OK;
726 }
727 
HAL_MPI_SET_HYPER(FLASH_HandleTypeDef * hflash,uint8_t hyper)728 __HAL_ROM_USED HAL_StatusTypeDef HAL_MPI_SET_HYPER(FLASH_HandleTypeDef *hflash, uint8_t hyper)
729 {
730     if (hflash == NULL)
731         return HAL_ERROR;
732 
733     if (hyper)
734         hflash->Instance->DCR |= MPI_DCR_HYPER;
735     else
736         hflash->Instance->DCR &= ~MPI_DCR_HYPER;
737 
738     return HAL_OK;
739 }
740 
HAL_MPI_ENABLE_DQS(FLASH_HandleTypeDef * hflash,uint8_t dqs)741 __HAL_ROM_USED HAL_StatusTypeDef HAL_MPI_ENABLE_DQS(FLASH_HandleTypeDef *hflash, uint8_t dqs)
742 {
743     if (hflash == NULL)
744         return HAL_ERROR;
745 
746     if (dqs)
747         hflash->Instance->DCR |= MPI_DCR_DQSE;
748     else
749         hflash->Instance->DCR &= ~MPI_DCR_DQSE;
750 
751     return HAL_OK;
752 }
753 
HAL_MPI_SET_DQS_DELAY(FLASH_HandleTypeDef * hflash,uint8_t delay)754 __HAL_ROM_USED HAL_StatusTypeDef HAL_MPI_SET_DQS_DELAY(FLASH_HandleTypeDef *hflash, uint8_t delay)
755 {
756     if (hflash == NULL)
757         return HAL_ERROR;
758 
759     uint32_t val = hflash->Instance->MISCR;
760     val &= ~MPI_MISCR_DQSDLY_Msk;
761     val |= (delay << MPI_MISCR_DQSDLY_Pos);
762     hflash->Instance->MISCR = val;
763 
764     return HAL_OK;
765 }
766 
HAL_MPI_SET_SCK(FLASH_HandleTypeDef * hflash,uint8_t delay,uint8_t inv)767 __HAL_ROM_USED HAL_StatusTypeDef HAL_MPI_SET_SCK(FLASH_HandleTypeDef *hflash, uint8_t delay, uint8_t inv)
768 {
769     if (hflash == NULL)
770         return HAL_ERROR;
771 
772     uint32_t val = hflash->Instance->MISCR;
773     val &= ~(MPI_MISCR_SCKINV_Msk | MPI_MISCR_SCKDLY_Msk);
774     val |= (delay << MPI_MISCR_SCKDLY_Pos) | (inv << MPI_MISCR_SCKINV_Pos);
775     hflash->Instance->MISCR = val;
776 
777     return HAL_OK;
778 }
779 
HAL_MPI_CFG_DTR(FLASH_HandleTypeDef * hflash,uint8_t en,uint8_t rclk_inv_delay)780 __HAL_ROM_USED HAL_StatusTypeDef HAL_MPI_CFG_DTR(FLASH_HandleTypeDef *hflash, uint8_t en, uint8_t rclk_inv_delay)
781 {
782     uint32_t value;
783     if (hflash == NULL)
784         return HAL_ERROR;
785 
786     value = hflash->Instance->MISCR;
787     if (en)
788     {
789         value |= (MPI_MISCR_DTRPRE);
790         value &= (~MPI_MISCR_RXCLKDLY);
791         value |= (0xa << MPI_MISCR_RXCLKDLY_Pos);   // todo, auto calibrate or manual set ? 4 ~ F
792         value &= (~MPI_MISCR_SCKDLY);
793         //value |= ((0xa & 0x7f) << MPI_MISCR_SCKDLY_Pos);
794         rclk_inv_delay = rclk_inv_delay > 2 ? rclk_inv_delay - 2 : rclk_inv_delay;
795         value |= ((rclk_inv_delay & 0x7f) << MPI_MISCR_SCKDLY_Pos);
796         if (rclk_inv_delay & 0x80)
797             value |= (MPI_MISCR_RXCLKINV);
798 
799         value &= ~(MPI_MISCR_SCKINV);
800     }
801     else
802     {
803         value &= ~(MPI_MISCR_DTRPRE | MPI_MISCR_RXCLKINV | MPI_MISCR_RXCLKDLY | MPI_MISCR_SCKDLY);
804         value |= (MPI_MISCR_SCKINV);
805     }
806     hflash->Instance->MISCR = value;
807 
808     return HAL_OK;
809 }
810 
HAL_MPI_MODIFY_RCMD_DELAY(FLASH_HandleTypeDef * hflash,int8_t dum_cyc)811 __HAL_ROM_USED void HAL_MPI_MODIFY_RCMD_DELAY(FLASH_HandleTypeDef *hflash, int8_t dum_cyc)
812 {
813     if (hflash == NULL)
814         return;
815 
816     uint32_t value = hflash->Instance->HRCCR;
817 
818     value &= ~MPI_HRCCR_DCYC;
819     value |= (dum_cyc << MPI_HRCCR_DCYC_Pos) ;
820 
821     hflash->Instance->HRCCR = value;
822 }
823 
HAL_MPI_MODIFY_WCMD_DELAY(FLASH_HandleTypeDef * hflash,int8_t dum_cyc)824 __HAL_ROM_USED void HAL_MPI_MODIFY_WCMD_DELAY(FLASH_HandleTypeDef *hflash, int8_t dum_cyc)
825 {
826     if (hflash == NULL)
827         return;
828 
829     uint32_t value = hflash->Instance->HWCCR;
830 
831     value &= ~MPI_HWCCR_DCYC;
832     value |= (dum_cyc << MPI_HWCCR_DCYC_Pos) ;
833 
834     hflash->Instance->HWCCR = value;
835 }
836 
HAL_FLASH_SET_WDT(FLASH_HandleTypeDef * hflash,uint16_t timeout)837 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_WDT(FLASH_HandleTypeDef *hflash, uint16_t timeout)
838 {
839     if (hflash == NULL)
840         return HAL_ERROR;
841 
842     uint32_t value = hflash->Instance->WDTR;
843 
844     if (timeout == 0)
845         value = 0;
846     else
847     {
848         value = timeout & MPI_WDTR_TIMEOUT_Msk;
849 #ifndef SF32LB58X
850         value |= MPI_WDTR_EN;
851 #endif
852     }
853 
854     hflash->Instance->WDTR = value;
855 
856     return HAL_OK;
857 }
858 
HAL_FLASH_GET_WDT_VALUE(FLASH_HandleTypeDef * hflash)859 __HAL_ROM_USED int HAL_FLASH_GET_WDT_VALUE(FLASH_HandleTypeDef *hflash)
860 {
861     uint32_t value = 0;
862 
863     if (hflash == NULL)
864         return 0;
865 
866     value = hflash->Instance->WDTR;
867 
868     return (value & MPI_WDTR_TIMEOUT_Msk);
869 }
870 
HAL_FLASH_GET_WDT_STATUS(FLASH_HandleTypeDef * hflash)871 __HAL_ROM_USED int HAL_FLASH_GET_WDT_STATUS(FLASH_HandleTypeDef *hflash)
872 {
873     uint32_t value = 0;
874 
875     if (hflash == NULL)
876         return 0;
877 
878     value = hflash->Instance->WDTR;
879     if (value & MPI_WDTR_TOF_Msk)
880         return 1;
881 
882     return 0;
883 }
884 
HAL_FLASH_SET_INTERVAL(FLASH_HandleTypeDef * hflash,uint32_t val12,uint32_t val21)885 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_INTERVAL(FLASH_HandleTypeDef *hflash, uint32_t val12, uint32_t val21)
886 {
887     if (hflash == NULL)
888         return HAL_ERROR;
889     uint32_t value = (val12 & MPI_CIR_INTERVAL1) | ((val21 << MPI_CIR_INTERVAL2_Pos) & MPI_CIR_INTERVAL2);
890 
891     hflash->Instance->CIR = value;
892 
893     return HAL_OK;
894 }
895 
HAL_FLASH_DMA_EN(FLASH_HandleTypeDef * hflash,uint8_t en)896 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_DMA_EN(FLASH_HandleTypeDef *hflash, uint8_t en)
897 {
898     if (hflash == NULL)
899         return HAL_ERROR;
900 
901     if (en)
902         hflash->Instance->CR |= MPI_CR_DMAE;
903     else
904         hflash->Instance->CR &= ~MPI_CR_DMAE;
905 
906     return HAL_OK;
907 }
908 
909 #if defined(SF32LB56X) || defined(SF32LB52X)
910 
HAL_FLASH_SET_LOOP(FLASH_HandleTypeDef * hflash,uint32_t loop)911 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_SET_LOOP(FLASH_HandleTypeDef *hflash, uint32_t loop)
912 {
913     if ((hflash == NULL) || (loop > MPI_CR2_LOOP))
914         return HAL_ERROR;
915 
916     hflash->Instance->CR2 = loop & MPI_CR2_LOOP;
917 
918     return HAL_OK;
919 }
920 #endif
921 
HAL_FLASH_CONFIG_AHB_READ(FLASH_HandleTypeDef * hflash,bool qmode)922 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_CONFIG_AHB_READ(FLASH_HandleTypeDef *hflash, bool qmode)
923 {
924     if (hflash == NULL)
925         return HAL_ERROR;
926 
927     if (qmode)
928     {
929         if (hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4READ].cmd == 0)
930             return HAL_ERROR;
931         HAL_FLASH_CFG_AHB_RCMD(hflash, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4READ].data_mode,
932                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4READ].dummy_cycle, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4READ].ab_size,
933                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4READ].ab_mode, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4READ].addr_size,
934                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4READ].addr_mode, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4READ].ins_mode);
935         HAL_FLASH_SET_AHB_RCMD(hflash, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4READ].cmd);
936     }
937     else
938     {
939         if (hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FREAD].cmd == 0)
940             return HAL_ERROR;
941         HAL_FLASH_CFG_AHB_RCMD(hflash, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FREAD].data_mode,
942                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FREAD].dummy_cycle, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FREAD].ab_size,
943                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FREAD].ab_mode, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FREAD].addr_size,
944                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FREAD].addr_mode, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FREAD].ins_mode);
945         HAL_FLASH_SET_AHB_RCMD(hflash, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FREAD].cmd);
946     }
947 
948     return HAL_OK;
949 }
950 
HAL_FLASH_CONFIG_FULL_AHB_READ(FLASH_HandleTypeDef * hflash,bool qmode)951 __HAL_ROM_USED HAL_StatusTypeDef HAL_FLASH_CONFIG_FULL_AHB_READ(FLASH_HandleTypeDef *hflash, bool qmode)
952 {
953     if (hflash == NULL)
954         return HAL_ERROR;
955 
956     if (qmode)
957     {
958         HAL_FLASH_CFG_AHB_RCMD(hflash, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4RD4BA].data_mode,
959                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4RD4BA].dummy_cycle, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4RD4BA].ab_size,
960                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4RD4BA].ab_mode, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4RD4BA].addr_size,
961                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4RD4BA].addr_mode, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4RD4BA].ins_mode);
962         HAL_FLASH_SET_AHB_RCMD(hflash, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_4RD4BA].cmd);
963     }
964     else
965     {
966         HAL_FLASH_CFG_AHB_RCMD(hflash, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FR4BA].data_mode,
967                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FR4BA].dummy_cycle, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FR4BA].ab_size,
968                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FR4BA].ab_mode, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FR4BA].addr_size,
969                                hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FR4BA].addr_mode, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FR4BA].ins_mode);
970         HAL_FLASH_SET_AHB_RCMD(hflash, hflash->ctable->cmd_cfg[SPI_FLASH_CMD_FR4BA].cmd);
971     }
972 
973     return HAL_OK;
974 }
975 
HAL_FLASH_PRE_CMD(FLASH_HandleTypeDef * handle,SPI_FLASH_CMD_E cmd)976 __HAL_ROM_USED int HAL_FLASH_PRE_CMD(FLASH_HandleTypeDef *handle, SPI_FLASH_CMD_E cmd)
977 {
978     if ((handle->ctable == NULL) || (cmd >= SPI_FLASH_CMD_COUNT)
979             || (handle->ctable->cmd_cfg[cmd].cmd == 0))
980     {
981         return 1;
982     }
983     // get command configure
984     HAL_FLASH_MANUAL_CMD(handle, handle->ctable->cmd_cfg[cmd].func_mode, handle->ctable->cmd_cfg[cmd].data_mode,
985                          handle->ctable->cmd_cfg[cmd].dummy_cycle, handle->ctable->cmd_cfg[cmd].ab_size,
986                          handle->ctable->cmd_cfg[cmd].ab_mode, handle->ctable->cmd_cfg[cmd].addr_size,
987                          handle->ctable->cmd_cfg[cmd].addr_mode, handle->ctable->cmd_cfg[cmd].ins_mode);
988 
989     return 0;
990 }
991 
HAL_FLASH_ISSUE_CMD(FLASH_HandleTypeDef * handle,SPI_FLASH_CMD_E cmd,uint32_t addr)992 __HAL_ROM_USED int HAL_FLASH_ISSUE_CMD(FLASH_HandleTypeDef *handle, SPI_FLASH_CMD_E cmd, uint32_t addr)
993 {
994     HAL_StatusTypeDef res;
995     if ((handle->ctable == NULL) || (cmd >= SPI_FLASH_CMD_COUNT)
996             || (handle->ctable->cmd_cfg[cmd].cmd == 0))
997     {
998         return 1;
999     }
1000     // get command configure
1001     HAL_FLASH_MANUAL_CMD(handle, handle->ctable->cmd_cfg[cmd].func_mode, handle->ctable->cmd_cfg[cmd].data_mode,
1002                          handle->ctable->cmd_cfg[cmd].dummy_cycle, handle->ctable->cmd_cfg[cmd].ab_size,
1003                          handle->ctable->cmd_cfg[cmd].ab_mode, handle->ctable->cmd_cfg[cmd].addr_size,
1004                          handle->ctable->cmd_cfg[cmd].addr_mode, handle->ctable->cmd_cfg[cmd].ins_mode);
1005 
1006     res = HAL_FLASH_SET_CMD(handle, handle->ctable->cmd_cfg[cmd].cmd, addr);
1007     if (res != HAL_OK)
1008         return 1;
1009 
1010     return 0;
1011 }
1012 
HAL_FLASH_ISSUE_CMD_SEQ(FLASH_HandleTypeDef * handle,SPI_FLASH_CMD_E cmd1,uint32_t addr,SPI_FLASH_CMD_E cmd2,uint32_t param)1013 __HAL_ROM_USED int HAL_FLASH_ISSUE_CMD_SEQ(FLASH_HandleTypeDef *handle, SPI_FLASH_CMD_E cmd1, uint32_t addr, SPI_FLASH_CMD_E cmd2, uint32_t param)
1014 {
1015     //HAL_StatusTypeDef res;
1016     if ((handle->ctable == NULL) || (cmd1 >= SPI_FLASH_CMD_COUNT) || (handle->ctable->cmd_cfg[cmd1].cmd == 0)
1017             || (cmd2 >= SPI_FLASH_CMD_COUNT) || (handle->ctable->cmd_cfg[cmd2].cmd == 0))
1018     {
1019         //LOG_E("Error nand_issue_cmd param\n");
1020         return 1;
1021     }
1022     // get command configure
1023     HAL_FLASH_MANUAL_CMD(handle, handle->ctable->cmd_cfg[cmd1].func_mode, handle->ctable->cmd_cfg[cmd1].data_mode,
1024                          handle->ctable->cmd_cfg[cmd1].dummy_cycle, handle->ctable->cmd_cfg[cmd1].ab_size,
1025                          handle->ctable->cmd_cfg[cmd1].ab_mode, handle->ctable->cmd_cfg[cmd1].addr_size,
1026                          handle->ctable->cmd_cfg[cmd1].addr_mode, handle->ctable->cmd_cfg[cmd1].ins_mode);
1027     HAL_FLASH_MANUAL_CMD2(handle, handle->ctable->cmd_cfg[cmd2].func_mode, handle->ctable->cmd_cfg[cmd2].data_mode,
1028                           handle->ctable->cmd_cfg[cmd2].dummy_cycle, handle->ctable->cmd_cfg[cmd2].ab_size,
1029                           handle->ctable->cmd_cfg[cmd2].ab_mode, handle->ctable->cmd_cfg[cmd2].addr_size,
1030                           handle->ctable->cmd_cfg[cmd2].addr_mode, handle->ctable->cmd_cfg[cmd2].ins_mode);
1031 
1032     //res = HAL_FLASH_SET_CMD(handle, handle->ctable->cmd_cfg[cmd1].cmd, addr);
1033 
1034     handle->Instance->SMR = 0;  // clear match status
1035     handle->Instance->CMDR2 = handle->ctable->cmd_cfg[cmd2].cmd & 0XFF;
1036     handle->Instance->SMKR = param; // set status mask
1037     //handle->Instance->CR |= QSPI_CR_CMD2E | QSPI_CR_SME2;
1038     HAL_FLASH_ENABLE_CMD2(handle, 1);
1039     HAL_FLASH_STAUS_MATCH_CMD2(handle, 1);
1040 
1041     handle->Instance->AR1 = addr;
1042     handle->Instance->CMDR1 = handle->ctable->cmd_cfg[cmd1].cmd & 0XFF;  // set cmd 1 to start
1043 
1044     // wait command 2 done
1045     //while (HAL_FLASH_IS_BUSY(handle));
1046     while (!HAL_FLASH_STATUS_MATCH(handle));
1047 
1048     HAL_FLASH_CLR_STATUS(handle, MPI_SCR_SMFC | MPI_SCR_TCFC);
1049 
1050     // disable command 2
1051     HAL_FLASH_ENABLE_CMD2(handle, 0);
1052     HAL_FLASH_STAUS_MATCH_CMD2(handle, 0);
1053 
1054     return 0;
1055 }
1056 
nor_qspi_switch(FLASH_HandleTypeDef * hflash,bool en)1057 __HAL_ROM_USED void nor_qspi_switch(FLASH_HandleTypeDef *hflash, bool en)
1058 {
1059     //bool res;
1060     uint8_t srl, srh;
1061     uint32_t dlen;
1062     uint32_t value;
1063     int res;
1064 
1065     if ((hflash == NULL) || (hflash->ctable == NULL))
1066         return;
1067 
1068     if (en == 0) // for spi mode, defaut setting should work, do not need change
1069         return;
1070 
1071     //HAL_FLASH_CLEAR_FIFO(hflash, HAL_FLASH_CLR_RX_TX_FIFO);
1072 
1073     srl = 0;
1074     srh = 0;
1075     if ((hflash->ctable->cmd_cfg[SPI_FLASH_CMD_WRSR2].cmd != 0))
1076     {
1077         // get current status register value
1078         dlen = 1;
1079         dlen = dlen;
1080         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1081         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR2, 0);
1082         srh = (uint8_t)HAL_FLASH_READ32(hflash) & 0XFF;
1083 #if 1
1084         if (srh & 0x1)  // SRP1 TO protect flash SR, it should never happened!!!
1085         {
1086             HAL_ASSERT(0);
1087         }
1088 #endif
1089         // set/clear QE bit
1090         if (en)
1091         {
1092             //srh |= 2;   // set qe bit
1093             srh = 2;    // clear other bits to avoid error
1094         }
1095         else
1096         {
1097             //srh &= 0xfd;    // clear qe bit
1098             srh = 0;    // clear other bits to avoid error
1099         }
1100 
1101         value = (uint32_t)srh ;
1102 
1103         res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WVSR, 0);
1104         if (res != 0)   // no SPI_FLASH_CMD_WVSR support, need write en !
1105             HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WREN, 0);
1106         HAL_FLASH_WRITE_WORD(hflash, value);
1107 
1108         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1109         //HAL_FLASH_SET_CMD(hflash, FCMD_WVSR, 0);
1110         //HAL_FLASH_SET_CMD(hflash, FCMD_WRSR, 0);
1111         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WRSR2, 0);
1112         if (res != 0)   // no SPI_FLASH_CMD_WVSR support, WREN need check WIP bit
1113         {
1114             HAL_FLASH_WRITE_DLEN(hflash, dlen);
1115             do
1116             {
1117                 HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1118                 res = HAL_FLASH_IS_PROG_DONE(hflash);
1119             }
1120             while (!res);
1121         }
1122     }
1123     else
1124     {
1125         dlen = 1;
1126         dlen = dlen;
1127         // get current status register value
1128         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1129         //HAL_FLASH_SET_CMD(hflash, FCMD_RDSR, 0);
1130         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1131         srl = (uint8_t)HAL_FLASH_READ32(hflash) & 0XFF;
1132 
1133         //HAL_FLASH_SET_CMD(hflash, FCMD_RDSR2, 0);
1134         res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR2, 0);
1135         if (res == 0)
1136             srh = (uint8_t)HAL_FLASH_READ32(hflash) & 0XFF;
1137 
1138         // set/clear QE bit ,for word access, it 2 bytes should merge to 1 word
1139         if (en)
1140         {
1141             if (hflash->ctable->qe_mod_mask != 0)
1142             {
1143                 if ((hflash->ctable->qe_mod_mask & 0xf) == 0) // at register 1
1144                 {
1145                     //srl |= (1 << (hflash->ctable->qe_mod_mask >> 4));
1146                     srl = (1 << (hflash->ctable->qe_mod_mask >> 4));
1147                     srh = 0;
1148                 }
1149                 else // at register 2
1150                 {
1151                     //srh |= (1 << (hflash->ctable->qe_mod_mask >> 4));
1152                     srh = (1 << (hflash->ctable->qe_mod_mask >> 4));
1153                     srl = 0;
1154                 }
1155                 // todo , qe bit not on register 1 and register 2, not support
1156             }
1157             else // default qe bit at bit 2 register 2 (s9)
1158             {
1159                 //srh |= 2;   // set qe bit
1160                 srh = 2;    // clear other bits to avoid error
1161                 srl = 0;
1162             }
1163         }
1164         else
1165         {
1166             if (hflash->ctable->qe_mod_mask != 0)
1167             {
1168                 if ((hflash->ctable->qe_mod_mask & 0xf) == 0) // at register 1
1169                     srl &= ~(1 << (hflash->ctable->qe_mod_mask >> 4));
1170                 else // at register 2
1171                     srh &= ~(1 << (hflash->ctable->qe_mod_mask >> 4));
1172                 // todo , qe bit not on register 1 and register 2, not support
1173             }
1174             else
1175             {
1176                 //srh &= 0xfd;    // clear qe bit
1177                 srh = 0;    // clear other bits to avoid error
1178                 srl = 0;
1179             }
1180             srh = 0;    // clear all sr bits to avoid error
1181             srl = 0;
1182         }
1183 
1184 
1185         value = ((uint32_t)srh << 8) | (uint32_t)srl;
1186 
1187         res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WVSR, 0);
1188 
1189         if (res != 0)   // no SPI_FLASH_CMD_WVSR support, need write en !
1190             HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WREN, 0);
1191 
1192         HAL_FLASH_WRITE_WORD(hflash, value);
1193 
1194         dlen *= 2;
1195         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1196 
1197         //HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WREN, 0);
1198         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WRSR, 0);
1199         if (res != 0)   // no SPI_FLASH_CMD_WVSR support, WREN need check WIP bit
1200         {
1201             HAL_FLASH_WRITE_DLEN(hflash, 1);
1202             do
1203             {
1204                 HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1205                 res = HAL_FLASH_IS_PROG_DONE(hflash);
1206             }
1207             while (!res);
1208         }
1209     }
1210 
1211 }
1212 
HAL_FLASH_SET_QUAL_SPI(FLASH_HandleTypeDef * hflash,bool en)1213 __HAL_ROM_USED void HAL_FLASH_SET_QUAL_SPI(FLASH_HandleTypeDef *hflash, bool en)
1214 {
1215     nor_qspi_switch(hflash, en);
1216 
1217     HAL_FLASH_CONFIG_AHB_READ(hflash, en);
1218 }
1219 
HAL_FLASH_FADDR_SET_QSPI(FLASH_HandleTypeDef * hflash,bool en)1220 __HAL_ROM_USED void HAL_FLASH_FADDR_SET_QSPI(FLASH_HandleTypeDef *hflash, bool en)
1221 {
1222     nor_qspi_switch(hflash, en);
1223 
1224     HAL_FLASH_CONFIG_FULL_AHB_READ(hflash, en);
1225 }
1226 
HAL_FLASH_GET_NOR_ID(FLASH_HandleTypeDef * hflash)1227 __HAL_ROM_USED int HAL_FLASH_GET_NOR_ID(FLASH_HandleTypeDef *hflash)
1228 {
1229     uint32_t id;
1230     uint32_t dlen = 0;
1231 
1232     //HAL_FLASH_CLEAR_FIFO(hflash, HAL_FLASH_CLR_RX_FIFO);
1233 
1234     // configure CCR
1235     //HAL_FLASH_MANUAL_CMD(hflash, 0, 1, 0, 0, 0, 2, 1, 1);
1236     HAL_FLASH_MANUAL_CMD(hflash, 0, 1, 0, 0, 0, 0, 0, 1);
1237 
1238     // configure data length, 2 byte, manufacturer id and device id, 0X90
1239     // configure data length, 3 byte, manufacturer id , memory type id and capacity id, 0X9F
1240     dlen = 3;
1241     HAL_FLASH_WRITE_DLEN(hflash, dlen);
1242 
1243     // send command, read id command
1244     //HAL_FLASH_SET_CMD(hflash, 0x90, 0);
1245     HAL_FLASH_SET_CMD(hflash, 0x9f, 0);
1246 
1247     //while (HAL_FLASH_IS_RX_EMPTY(hflash));
1248 
1249     id = HAL_FLASH_READ32(hflash);
1250 
1251     return (int)(id & 0xffffff);
1252 }
1253 
HAL_FLASH_ID_DUAL_ID(FLASH_HandleTypeDef * hflash)1254 __HAL_ROM_USED int HAL_FLASH_ID_DUAL_ID(FLASH_HandleTypeDef *hflash)
1255 {
1256     uint32_t id, id2;;
1257     if (HAL_FLASH_GET_DUAL_MODE(hflash) == 0)
1258         return 0;
1259 
1260     //HAL_FLASH_CLEAR_FIFO(hflash, HAL_FLASH_CLR_RX_FIFO);
1261 
1262     // configure CCR
1263     //HAL_FLASH_MANUAL_CMD(hflash, 0, 1, 0, 0, 0, 2, 1, 1);
1264     HAL_FLASH_MANUAL_CMD(hflash, 0, 1, 0, 0, 0, 0, 0, 1);
1265 
1266     // configure data length, 2 byte, manufacturer id and device id, 0X90
1267     // configure data length, 3 byte, manufacturer id , memory type id and capacity id, 0X9F
1268     HAL_FLASH_WRITE_DLEN(hflash, 6);
1269 
1270     // send command, read id command
1271     //HAL_FLASH_SET_CMD(hflash, 0x90, 0);
1272     HAL_FLASH_SET_CMD(hflash, 0x9f, 0);
1273 
1274     //while (HAL_FLASH_IS_RX_EMPTY(hflash));
1275 
1276     id = HAL_FLASH_READ32(hflash);
1277     if ((id == 0xffffffff) || (id == 0x00)) // invalid id
1278         return 0;
1279 
1280     id2 = HAL_FLASH_READ32(hflash);
1281 
1282     if (((id & 0xff) == ((id & 0xff00) >> 8)) && (((id & 0xff0000) >> 16) == ((id & 0xff000000) >> 24))
1283             && ((id2 & 0xff) == ((id2 & 0xff00) >> 8)))
1284         return 1;
1285 
1286     return 0;
1287 }
1288 
HAL_FLASH_CLR_PROTECT(FLASH_HandleTypeDef * hflash)1289 __HAL_ROM_USED void HAL_FLASH_CLR_PROTECT(FLASH_HandleTypeDef *hflash)
1290 {
1291     uint8_t srl, srh;
1292     uint32_t dlen;
1293     uint32_t value;
1294     int res;
1295 
1296     if (hflash == NULL)
1297         return;
1298 
1299     srl = 0;
1300     srh = 0;
1301 
1302     if ((hflash->ctable->cmd_cfg[SPI_FLASH_CMD_WRSR2].cmd != 0))
1303     {
1304         // WRSR only work for low 8 bits
1305         dlen = 1;
1306         dlen = dlen;;
1307         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1308         res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1309         if (res == 0)
1310             srl = (uint8_t)HAL_FLASH_READ32(hflash) & 0XFF;
1311 
1312         if (hflash->ctable->ecc_sta_mask != 0)
1313             value = (~hflash->ctable->ecc_sta_mask) & srl;
1314         else
1315             value = 0;
1316 
1317         res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WVSR, 0);
1318         if (res != 0)   // no SPI_FLASH_CMD_WVSR support, need write en !
1319             HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WREN, 0);
1320 
1321         HAL_FLASH_WRITE_WORD(hflash, value);
1322         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1323 
1324         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WRSR, 0);
1325         if (res != 0)   // no SPI_FLASH_CMD_WVSR support, WREN need check WIP bit
1326         {
1327             HAL_FLASH_WRITE_DLEN(hflash, 1);
1328             do
1329             {
1330                 HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1331                 res = HAL_FLASH_IS_PROG_DONE(hflash);
1332             }
1333             while (!res);
1334         }
1335     }
1336     else
1337     {
1338         // WRSR work on low 8 bits and high 8 bits, need read all back
1339         dlen = 1;
1340         dlen = dlen;
1341         // get current status register value
1342         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1343         res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1344         if (res == 0)
1345             srl = (uint8_t)HAL_FLASH_READ32(hflash) & 0XFF;
1346 
1347         res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR2, 0);
1348         if (res == 0)
1349             srh = (uint8_t)HAL_FLASH_READ32(hflash) & 0XFF;
1350 
1351         if (hflash->ctable->ecc_sta_mask != 0)
1352             srl &= (~hflash->ctable->ecc_sta_mask);
1353         else
1354             srl = 0; // clear low 8 bit to 0 to remove protect bits
1355 
1356         value = ((uint32_t)srh << 8) | (uint32_t)srl;
1357 
1358         res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WVSR, 0);
1359         if (res != 0)   // no SPI_FLASH_CMD_WVSR support, need write en !
1360             HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WREN, 0);
1361 
1362         HAL_FLASH_WRITE_WORD(hflash, value);
1363 
1364         dlen *= 2;  // write 2 byte status register
1365         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1366 
1367         //HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WREN, 0);
1368         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WRSR, 0);
1369         if (res != 0)   // no SPI_FLASH_CMD_WVSR support, WREN need check WIP bit
1370         {
1371             HAL_FLASH_WRITE_DLEN(hflash, 1);
1372             do
1373             {
1374                 HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1375                 res = HAL_FLASH_IS_PROG_DONE(hflash);
1376             }
1377             while (!res);
1378         }
1379     }
1380 
1381 }
1382 
HAL_QSPI_SET_RXDELAY(uint8_t qspi_id,uint8_t clk_inv,uint8_t clk_delay)1383 __HAL_ROM_USED void HAL_QSPI_SET_RXDELAY(uint8_t qspi_id, uint8_t clk_inv, uint8_t clk_delay)
1384 {
1385     MPI_TypeDef *handle = NULL;
1386     uint32_t value;
1387 
1388     switch (qspi_id)
1389     {
1390     case 0:
1391         handle = FLASH1;
1392         break;
1393     case 1:
1394         handle = FLASH2;
1395         break;
1396 #ifdef FLASH3
1397     case 2:
1398         handle = FLASH3;
1399         break;
1400 #endif
1401 #ifdef FLASH4
1402     case 3:
1403         handle = FLASH4;
1404         break;
1405 #endif
1406 #ifdef FLASH5
1407     case 4:
1408         handle = FLASH5;
1409         break;
1410 #endif
1411     default:
1412         return;
1413         break;
1414     }
1415 
1416     if (handle != NULL)
1417     {
1418         value = handle->MISCR & (~(MPI_MISCR_RXCLKDLY | MPI_MISCR_RXCLKINV));
1419         value |= ((clk_delay << MPI_MISCR_RXCLKDLY_Pos) & MPI_MISCR_RXCLKDLY_Msk)
1420                  | ((clk_inv << MPI_MISCR_RXCLKINV_Pos)& MPI_MISCR_RXCLKINV_Msk);
1421         handle->MISCR = value;
1422     }
1423 }
1424 
HAL_QSPI_SET_CLK_INV(FLASH_HandleTypeDef * hflash,uint8_t clk_inv,uint8_t clk_delay)1425 __HAL_ROM_USED void HAL_QSPI_SET_CLK_INV(FLASH_HandleTypeDef *hflash, uint8_t clk_inv, uint8_t clk_delay)
1426 {
1427     uint32_t value;
1428     if (hflash == NULL)
1429         return;
1430 
1431     if (hflash->Instance != NULL)
1432     {
1433         value = hflash->Instance->MISCR & (~(MPI_MISCR_RXCLKDLY | MPI_MISCR_RXCLKINV));
1434         value |= ((clk_delay << MPI_MISCR_RXCLKDLY_Pos) & MPI_MISCR_RXCLKDLY_Msk)
1435                  | ((clk_inv << MPI_MISCR_RXCLKINV_Pos)& MPI_MISCR_RXCLKINV_Msk);
1436         hflash->Instance->MISCR = value;
1437     }
1438 }
1439 
1440 
1441 //extern void rt_kprintf(const char * fmt, ...);
HAL_QSPI_LOCK_OTP(FLASH_HandleTypeDef * hflash,uint32_t addr)1442 __HAL_ROM_USED int HAL_QSPI_LOCK_OTP(FLASH_HandleTypeDef *hflash, uint32_t addr)
1443 {
1444     uint32_t srh, srl, value;
1445     uint32_t dlen;
1446     int res, opbit;
1447 
1448     if (hflash == NULL || hflash->ctable == NULL)
1449         return -1;
1450     if (addr < SPI_FLASH_OTP_BASE || addr > SPI_FLASH_OTP_BASE + (hflash->ctable->mode_reg << 12))
1451         return -1;
1452 
1453     HAL_FLASH_CLEAR_FIFO(hflash, HAL_FLASH_CLR_RX_TX_FIFO);
1454     // get LB bits to check if OTP LOCKED (S11 ~ S13)
1455     srh = srl = value = 0;
1456     dlen = 1;
1457     HAL_FLASH_WRITE_DLEN(hflash, dlen);
1458 
1459     res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR2, 0);
1460     if (res == 0)   // support rdsr2, only need status register 2 value
1461     {
1462         srh = HAL_FLASH_READ32(hflash);
1463         srh &= 0xff;
1464     }
1465     else // not support rdsr2, rdsr with 2 bytes each
1466     {
1467         dlen *= 2;
1468         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1469         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1470         srh = HAL_FLASH_READ32(hflash) ;
1471         srl = srh & 0xff;
1472 
1473         srh = (srh >> 8) & 0xff;
1474     }
1475     opbit = addr >> 12;
1476     if (opbit < 1 || opbit > hflash->ctable->mode_reg)
1477         return -1;
1478     opbit = 1 << (opbit - 1);
1479     srh = (srh & 0xc7) | (opbit << 3);
1480 
1481     if ((hflash->ctable->cmd_cfg[SPI_FLASH_CMD_WRSR2].cmd != 0))
1482     {
1483         value = (uint32_t)srh ;
1484 
1485         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WREN, 0);
1486         HAL_FLASH_WRITE_WORD(hflash, value);
1487 
1488         dlen = 1;
1489         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1490 
1491         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WRSR2, 0);
1492 
1493         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1494         do
1495         {
1496             HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1497             res = HAL_FLASH_IS_PROG_DONE(hflash);
1498         }
1499         while (!res);
1500     }
1501     else
1502     {
1503         dlen = 1;
1504         if (res == 0)   // support rdsr2, srl not get from sr1
1505         {
1506             HAL_FLASH_WRITE_DLEN(hflash, dlen);
1507             HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1508             srl = HAL_FLASH_READ32(hflash) & 0xff;
1509         }
1510 
1511         value = ((uint32_t)srh << 8) | (uint32_t)srl;
1512 
1513         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WREN, 0);
1514 
1515         HAL_FLASH_WRITE_WORD(hflash, value);
1516         dlen *= 2;
1517         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1518 
1519         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_WRSR, 0);
1520 
1521         HAL_FLASH_WRITE_DLEN(hflash, 1);
1522         do
1523         {
1524             HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1525             res = HAL_FLASH_IS_PROG_DONE(hflash);
1526         }
1527         while (!res);
1528     }
1529 
1530     return 0;
1531 }
1532 
1533 #define MPI_MAX_FIFO       (64)
HAL_QSPI_READ_OTP(FLASH_HandleTypeDef * hflash,uint32_t addr,uint8_t * buf,uint32_t size)1534 __HAL_ROM_USED int HAL_QSPI_READ_OTP(FLASH_HandleTypeDef *hflash, uint32_t addr, uint8_t *buf, uint32_t size)
1535 {
1536     if (hflash == NULL || hflash->ctable == NULL)
1537     {
1538         //rt_kprintf("Invalid parameter\n");
1539         return 0;
1540     }
1541     if (addr < SPI_FLASH_OTP_BASE || addr > SPI_FLASH_OTP_BASE + (hflash->ctable->mode_reg << 12))
1542     {
1543         //rt_kprintf("addr 0x%x, range 0x%x\n",SPI_FLASH_OTP_BASE+(hflash->ctable->mode_reg<<12));
1544         return 0;
1545     }
1546 
1547     if ((addr & 0x3ff) + size > hflash->ctable->oob_size * 256)
1548     {
1549         //rt_kprintf("size 0x%x, max 0x%x\n",(addr & 0x3ff)+size, hflash->ctable->oob_size *256);
1550         return 0;
1551     }
1552 
1553     uint32_t *data = (uint32_t *)buf;
1554     int remain = size;
1555     int dlen = 0;
1556     int cnt = 0;
1557     int i;
1558     uint32_t temp_addr = addr;
1559     while (remain > 0)
1560     {
1561         dlen = remain > MPI_MAX_FIFO ? MPI_MAX_FIFO : remain;
1562         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1563         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSCUR, temp_addr);
1564         for (i = 0; i < dlen / 4; i++)
1565             data[i + cnt / 4] = HAL_FLASH_READ32(hflash);
1566         cnt += dlen;
1567         temp_addr += dlen;
1568         remain -= dlen;
1569     }
1570 
1571     return size;
1572 }
1573 
HAL_QSPI_GET_OTP_LB(FLASH_HandleTypeDef * hflash,uint32_t addr)1574 __HAL_ROM_USED uint8_t HAL_QSPI_GET_OTP_LB(FLASH_HandleTypeDef *hflash, uint32_t addr)
1575 {
1576     uint32_t srh;
1577     uint32_t dlen;
1578     int res;
1579 
1580     if (hflash == NULL || hflash->ctable == NULL)
1581         return 0xff;
1582     if (addr < SPI_FLASH_OTP_BASE || addr > SPI_FLASH_OTP_BASE + (hflash->ctable->mode_reg << 12))
1583         return 0xff;
1584 
1585     // get LB bits to check if OTP LOCKED (S11 ~ S13)
1586     srh = 0;
1587     dlen = 1;
1588     HAL_FLASH_WRITE_DLEN(hflash, dlen);
1589 
1590     res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR2, 0);
1591     if (res == 0)   // support rdsr2, only need status register 2 value
1592     {
1593         srh = HAL_FLASH_READ32(hflash);
1594         srh &= 0xff;
1595     }
1596     else // not support rdsr2, rdsr with 2 bytes each
1597     {
1598         dlen *= 2;
1599         HAL_FLASH_WRITE_DLEN(hflash, dlen);
1600         HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDSR, 0);
1601         srh = HAL_FLASH_READ32(hflash) ;
1602         srh = (srh >> 8) & 0xff;
1603     }
1604 
1605     return srh >> 3;
1606 }
1607 
HAL_FLASH_DEEP_PWRDOWN(FLASH_HandleTypeDef * hflash)1608 __HAL_ROM_USED int HAL_FLASH_DEEP_PWRDOWN(FLASH_HandleTypeDef *hflash)
1609 {
1610     int res = 1;
1611     if (hflash == NULL || (hflash->Instance->CR & MPI_CR_EN) == 0)
1612         return res;
1613 
1614     //res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_DPD, 0);
1615 
1616     // hardcode DPD command configure and id
1617     HAL_FLASH_MANUAL_CMD(hflash, 0, 0, 0, 0, 0, 0, 0, 1);
1618 
1619     // send command release deep power-mode
1620     res = HAL_FLASH_SET_CMD(hflash, 0xb9, 0);
1621 
1622     // add a delay to make sure into deep power down mode -- tDP
1623 
1624     return res;
1625 }
1626 
HAL_FLASH_RELEASE_DPD(FLASH_HandleTypeDef * hflash)1627 __HAL_ROM_USED int HAL_FLASH_RELEASE_DPD(FLASH_HandleTypeDef *hflash)
1628 {
1629     int res = 1;
1630     uint32_t qspi_en = 0;
1631     if (hflash == NULL)
1632         return res;
1633 
1634     qspi_en = hflash->Instance->CR & MPI_CR_EN;
1635     if (qspi_en == 0)
1636         hflash->Instance->CR |= MPI_CR_EN;
1637 
1638     //res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RDP, 0);
1639 
1640     // when calling this function, flash in sleep mode, flash handle context on flash, so hflash->ctable can not work !!!
1641     // hardcode rdp command configure and id
1642     HAL_FLASH_MANUAL_CMD(hflash, 0, 0, 0, 0, 0, 0, 0, 1);
1643 
1644     // send command release deep power-mode
1645     res = HAL_FLASH_SET_CMD(hflash, 0xab, 0);
1646 
1647     // add a delay to make sure release done -- tRES1
1648 
1649     if (qspi_en == 0)
1650         hflash->Instance->CR &= ~MPI_CR_EN;
1651 
1652     return res;
1653 }
1654 
HAL_QSPI_GET_UID(FLASH_HandleTypeDef * hflash,uint32_t * uid,uint32_t len)1655 __HAL_ROM_USED int HAL_QSPI_GET_UID(FLASH_HandleTypeDef *hflash, uint32_t *uid, uint32_t len)
1656 {
1657     int i, res;
1658     //uint16_t len = 16;
1659 
1660     if (hflash == NULL || uid == NULL)
1661         return -1;
1662 
1663     HAL_FLASH_WRITE_DLEN(hflash, len);    // unique id include 64 bits or 128 bits
1664 
1665     //res = HAL_FLASH_ISSUE_CMD(hflash, SPI_FLASH_CMD_RUID, 0);
1666     // ALL NOR FLASH should have same READ UID COMMAND TIMMING !!!
1667     HAL_FLASH_MANUAL_CMD(hflash, 0, 1, 8, 0, 0, 2, 1, 1);
1668     res = HAL_FLASH_SET_CMD(hflash, 0X4B, 0);
1669     if (res != 0)
1670         return -2;
1671 
1672     //uid[0] = HAL_FLASH_READ32(hflash);
1673     //uid[1] = HAL_FLASH_READ32(hflash);
1674     //uid[2] = HAL_FLASH_READ32(hflash);
1675     //uid[3] = HAL_FLASH_READ32(hflash);
1676     for (i = 0; i < (int)len / 4; i++)
1677         uid[i] = HAL_FLASH_READ32(hflash);
1678 
1679     return 0;
1680 }
1681 
HAL_MPI_CFG_PREFETCH(FLASH_HandleTypeDef * hflash,uint32_t start,uint32_t len)1682 __HAL_ROM_USED HAL_StatusTypeDef HAL_MPI_CFG_PREFETCH(FLASH_HandleTypeDef *hflash, uint32_t start, uint32_t len)
1683 {
1684     if (hflash == NULL)
1685         return HAL_ERROR;
1686 
1687     if (((start & 0x3ff) != 0) || ((len & 0x3ff) != 0))
1688         return HAL_ERROR;
1689 
1690     hflash->Instance->PRSAR = start;
1691     hflash->Instance->PREAR = start + len;
1692 
1693     return HAL_OK;
1694 }
1695 
HAL_MPI_EN_PREFETCH(FLASH_HandleTypeDef * hflash,uint8_t en)1696 __HAL_ROM_USED HAL_StatusTypeDef HAL_MPI_EN_PREFETCH(FLASH_HandleTypeDef *hflash, uint8_t en)
1697 {
1698     if (hflash == NULL)
1699         return HAL_ERROR;
1700 
1701     if (en)
1702         hflash->Instance->CR |= MPI_CR_PREFE;
1703     else
1704         hflash->Instance->CR &= (~MPI_CR_PREFE);
1705 
1706     return HAL_OK;
1707 }
1708 
1709 
1710 #endif  // HAL_QSPI_MODULE_ENABLED
1711 
1712 /// @} FLASH
1713 
1714 /// @} BF0_HAL_Driver