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