@@ -29,20 +29,66 @@ AT_QUICKACCESS_SECTION_CODE(void flexspi_update_lut_ram(void));
29
29
AT_QUICKACCESS_SECTION_CODE (status_t flexspi_nor_write_enable_ram (uint32_t baseAddr ));
30
30
AT_QUICKACCESS_SECTION_CODE (status_t flexspi_nor_wait_bus_busy_ram (void ));
31
31
AT_QUICKACCESS_SECTION_CODE (status_t flexspi_nor_flash_erase_sector_ram (uint32_t address ));
32
- AT_QUICKACCESS_SECTION_CODE (static void flexspi_lower_clock_ram (void ));
33
- AT_QUICKACCESS_SECTION_CODE (static void flexspi_clock_update_ram (void ));
34
32
AT_QUICKACCESS_SECTION_CODE (status_t flexspi_nor_flash_page_program_ram (uint32_t address ,
35
33
const uint32_t * src ,
36
34
uint32_t size ));
37
35
AT_QUICKACCESS_SECTION_CODE (void flexspi_nor_flash_read_data_ram (uint32_t addr ,
38
36
uint32_t * buffer ,
39
37
uint32_t size ));
38
+ AT_QUICKACCESS_SECTION_CODE (void * flexspi_memset (void * buf , int c , size_t n ));
39
+ /**
40
+ * @brief Set bytes in memory. If put this code in SRAM, Make sure this code
41
+ * does not call functions in Flash.
42
+ *
43
+ * @return pointer to start of buffer
44
+ */
45
+ void * flexspi_memset (void * buf , int c , size_t n )
46
+ {
47
+ /* do byte-sized initialization until word-aligned or finished */
48
+ unsigned char * d_byte = (unsigned char * )buf ;
49
+ unsigned char c_byte = (unsigned char )c ;
50
+
51
+ while (((unsigned int )d_byte ) & 0x3 ) {
52
+ if (n == 0 ) {
53
+ return buf ;
54
+ }
55
+ * (d_byte ++ ) = c_byte ;
56
+ n -- ;
57
+ };
58
+
59
+ /* do word-sized initialization as long as possible */
60
+
61
+ unsigned int * d_word = (unsigned int * )d_byte ;
62
+ unsigned int c_word = (unsigned int )(unsigned char )c ;
63
+
64
+ c_word |= c_word << 8 ;
65
+ c_word |= c_word << 16 ;
66
+
67
+ while (n >= sizeof (unsigned int )) {
68
+ * (d_word ++ ) = c_word ;
69
+ n -= sizeof (unsigned int );
70
+ }
71
+
72
+ /* do byte-sized initialization until finished */
73
+
74
+ d_byte = (unsigned char * )d_word ;
40
75
76
+ while (n > 0 ) {
77
+ * (d_byte ++ ) = c_byte ;
78
+ n -- ;
79
+ }
80
+
81
+ return buf ;
82
+ }
83
+
84
+ #ifdef HYPERFLASH_BOOT
85
+ AT_QUICKACCESS_SECTION_CODE (void flexspi_lower_clock_ram (void ));
86
+ AT_QUICKACCESS_SECTION_CODE (void flexspi_clock_update_ram (void ));
41
87
void flexspi_update_lut_ram (void )
42
88
{
43
89
flexspi_config_t config ;
44
90
45
- memset (& config , 0 , sizeof (config ));
91
+ flexspi_memset (& config , 0 , sizeof (config ));
46
92
47
93
/*Get FLEXSPI default settings and configure the flexspi. */
48
94
FLEXSPI_GetDefaultConfig (& config );
@@ -77,7 +123,7 @@ status_t flexspi_nor_write_enable_ram(uint32_t baseAddr)
77
123
flexspi_transfer_t flashXfer ;
78
124
status_t status = kStatus_Success ;
79
125
80
- memset (& flashXfer , 0 , sizeof (flashXfer ));
126
+ flexspi_memset (& flashXfer , 0 , sizeof (flashXfer ));
81
127
82
128
/* Write enable */
83
129
flashXfer .deviceAddress = baseAddr ;
@@ -99,7 +145,7 @@ status_t flexspi_nor_wait_bus_busy_ram(void)
99
145
status_t status = kStatus_Success ;
100
146
flexspi_transfer_t flashXfer ;
101
147
102
- memset (& flashXfer , 0 , sizeof (flashXfer ));
148
+ flexspi_memset (& flashXfer , 0 , sizeof (flashXfer ));
103
149
104
150
flashXfer .deviceAddress = 0 ;
105
151
flashXfer .port = kFLEXSPI_PortA1 ;
@@ -138,7 +184,7 @@ status_t flexspi_nor_flash_erase_sector_ram(uint32_t address)
138
184
status_t status = kStatus_Success ;
139
185
flexspi_transfer_t flashXfer ;
140
186
141
- memset (& flashXfer , 0 , sizeof (flashXfer ));
187
+ flexspi_memset (& flashXfer , 0 , sizeof (flashXfer ));
142
188
143
189
/* Write enable */
144
190
status = flexspi_nor_write_enable_ram (address );
@@ -165,7 +211,7 @@ status_t flexspi_nor_flash_erase_sector_ram(uint32_t address)
165
211
return status ;
166
212
}
167
213
168
- static void flexspi_lower_clock_ram (void )
214
+ void flexspi_lower_clock_ram (void )
169
215
{
170
216
unsigned int reg = 0 ;
171
217
@@ -197,7 +243,7 @@ static void flexspi_lower_clock_ram(void)
197
243
}
198
244
}
199
245
200
- static void flexspi_clock_update_ram (void )
246
+ void flexspi_clock_update_ram (void )
201
247
{
202
248
/* Program finished, speed the clock to 133M. */
203
249
/* Wait for bus idle before change flash configuration. */
@@ -229,7 +275,7 @@ status_t flexspi_nor_flash_page_program_ram(uint32_t address, const uint32_t *sr
229
275
flexspi_transfer_t flashXfer ;
230
276
uint32_t offset = 0 ;
231
277
232
- memset (& flashXfer , 0 , sizeof (flashXfer ));
278
+ flexspi_memset (& flashXfer , 0 , sizeof (flashXfer ));
233
279
234
280
flexspi_lower_clock_ram ();
235
281
@@ -271,14 +317,234 @@ status_t flexspi_nor_flash_page_program_ram(uint32_t address, const uint32_t *sr
271
317
return status ;
272
318
}
273
319
320
+ #else
321
+ AT_QUICKACCESS_SECTION_CODE (status_t flexspi_nor_enable_quad_mode_ram (void ));
322
+ status_t flexspi_nor_enable_quad_mode_ram (void )
323
+ {
324
+ flexspi_transfer_t flashXfer ;
325
+ uint32_t writeValue = FLASH_QUAD_ENABLE ;
326
+ status_t status = kStatus_Success ;
327
+
328
+ flexspi_memset (& flashXfer , 0 , sizeof (flashXfer ));
329
+ /* Write enable */
330
+ status = flexspi_nor_write_enable_ram (0 );
331
+
332
+ if (status != kStatus_Success ) {
333
+ return status ;
334
+ }
335
+
336
+ /* Enable quad mode. */
337
+ flashXfer .deviceAddress = 0 ;
338
+ flashXfer .port = kFLEXSPI_PortA1 ;
339
+ flashXfer .cmdType = kFLEXSPI_Write ;
340
+ flashXfer .SeqNumber = 1 ;
341
+ flashXfer .seqIndex = NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG ;
342
+ flashXfer .data = & writeValue ;
343
+ flashXfer .dataSize = 1 ;
344
+
345
+ status = FLEXSPI_TransferBlocking (FLEXSPI , & flashXfer );
346
+ if (status != kStatus_Success ) {
347
+ return status ;
348
+ }
349
+
350
+ status = flexspi_nor_wait_bus_busy_ram ();
351
+
352
+ /* Do software reset. */
353
+ FLEXSPI_SoftwareReset (FLEXSPI );
354
+
355
+ return status ;
356
+ }
357
+
358
+ void flexspi_update_lut_ram (void )
359
+ {
360
+ flexspi_config_t config ;
361
+
362
+ flexspi_memset (& config , 0 , sizeof (config ));
363
+
364
+ /*Get FLEXSPI default settings and configure the flexspi. */
365
+ FLEXSPI_GetDefaultConfig (& config );
366
+
367
+ /*Set AHB buffer size for reading data through AHB bus. */
368
+ config .ahbConfig .enableAHBPrefetch = true;
369
+ config .ahbConfig .enableAHBBufferable = true;
370
+ config .ahbConfig .enableReadAddressOpt = true;
371
+ config .ahbConfig .enableAHBCachable = true;
372
+ config .rxSampleClock = kFLEXSPI_ReadSampleClkLoopbackFromDqsPad ;
373
+ FLEXSPI_Init (FLEXSPI , & config );
374
+
375
+ /* Configure flash settings according to serial flash feature. */
376
+ FLEXSPI_SetFlashConfig (FLEXSPI , & deviceconfig , kFLEXSPI_PortA1 );
377
+
378
+ /* Update LUT table. */
379
+ FLEXSPI_UpdateLUT (FLEXSPI , 0 , customLUT , CUSTOM_LUT_LENGTH );
380
+
381
+ /* Do software reset. */
382
+ FLEXSPI_SoftwareReset (FLEXSPI );
383
+ /* Wait for bus idle. */
384
+ while (!FLEXSPI_GetBusIdleStatus (FLEXSPI )) {
385
+ }
386
+ flexspi_nor_enable_quad_mode_ram ();
387
+ }
388
+
389
+ status_t flexspi_nor_write_enable_ram (uint32_t baseAddr )
390
+ {
391
+ flexspi_transfer_t flashXfer ;
392
+ status_t status = kStatus_Success ;
393
+
394
+ flexspi_memset (& flashXfer , 0 , sizeof (flashXfer ));
395
+ /* Write enable */
396
+ flashXfer .deviceAddress = baseAddr ;
397
+ flashXfer .port = kFLEXSPI_PortA1 ;
398
+ flashXfer .cmdType = kFLEXSPI_Command ;
399
+ flashXfer .SeqNumber = 1 ;
400
+ flashXfer .seqIndex = NOR_CMD_LUT_SEQ_IDX_WRITEENABLE ;
401
+
402
+ status = FLEXSPI_TransferBlocking (FLEXSPI , & flashXfer );
403
+
404
+ return status ;
405
+ }
406
+
407
+ status_t flexspi_nor_wait_bus_busy_ram (void )
408
+ {
409
+ /* Wait status ready. */
410
+ bool isBusy ;
411
+ uint32_t readValue ;
412
+ status_t status = kStatus_Success ;
413
+ flexspi_transfer_t flashXfer ;
414
+
415
+ flexspi_memset (& flashXfer , 0 , sizeof (flashXfer ));
416
+
417
+ flashXfer .deviceAddress = 0 ;
418
+ flashXfer .port = kFLEXSPI_PortA1 ;
419
+ flashXfer .cmdType = kFLEXSPI_Read ;
420
+ flashXfer .SeqNumber = 1 ;
421
+ flashXfer .seqIndex = NOR_CMD_LUT_SEQ_IDX_READSTATUSREG ;
422
+ flashXfer .data = & readValue ;
423
+ flashXfer .dataSize = 1 ;
424
+
425
+ do {
426
+ status = FLEXSPI_TransferBlocking (FLEXSPI , & flashXfer );
427
+
428
+ if (status != kStatus_Success ) {
429
+ return status ;
430
+ }
431
+ if (FLASH_BUSY_STATUS_POL ) {
432
+ if (readValue & (1U << FLASH_BUSY_STATUS_OFFSET )) {
433
+ isBusy = true;
434
+ } else {
435
+ isBusy = false;
436
+ }
437
+ } else {
438
+ if (readValue & (1U << FLASH_BUSY_STATUS_OFFSET )) {
439
+ isBusy = false;
440
+ } else {
441
+ isBusy = true;
442
+ }
443
+ }
444
+
445
+ } while (isBusy );
446
+
447
+ return status ;
448
+ }
449
+
450
+
451
+ status_t flexspi_nor_flash_erase_sector_ram (uint32_t address )
452
+ {
453
+ flexspi_transfer_t flashXfer ;
454
+ status_t status = kStatus_Success ;
455
+
456
+ flexspi_memset (& flashXfer , 0 , sizeof (flashXfer ));
457
+
458
+ /* Write enable */
459
+ flashXfer .deviceAddress = address ;
460
+ flashXfer .port = kFLEXSPI_PortA1 ;
461
+ flashXfer .cmdType = kFLEXSPI_Command ;
462
+ flashXfer .SeqNumber = 1 ;
463
+ flashXfer .seqIndex = NOR_CMD_LUT_SEQ_IDX_WRITEENABLE ;
464
+
465
+ status = FLEXSPI_TransferBlocking (FLEXSPI , & flashXfer );
466
+
467
+ if (status != kStatus_Success ) {
468
+ return status ;
469
+ }
470
+
471
+ flashXfer .deviceAddress = address ;
472
+ flashXfer .port = kFLEXSPI_PortA1 ;
473
+ flashXfer .cmdType = kFLEXSPI_Command ;
474
+ flashXfer .SeqNumber = 1 ;
475
+ flashXfer .seqIndex = NOR_CMD_LUT_SEQ_IDX_ERASESECTOR ;
476
+ status = FLEXSPI_TransferBlocking (FLEXSPI , & flashXfer );
477
+
478
+ if (status != kStatus_Success ) {
479
+ return status ;
480
+ }
481
+
482
+ status = flexspi_nor_wait_bus_busy_ram ();
483
+
484
+ /* Do software reset. */
485
+ FLEXSPI_SoftwareReset (FLEXSPI );
486
+
487
+ return status ;
488
+ }
489
+
490
+ status_t flexspi_nor_flash_page_program_ram (uint32_t address , const uint32_t * src , uint32_t size )
491
+ {
492
+ flexspi_transfer_t flashXfer ;
493
+ status_t status = kStatus_Success ;
494
+ uint32_t offset = 0 ;
495
+
496
+ flexspi_memset (& flashXfer , 0 , sizeof (flashXfer ));
497
+
498
+ while (size > 0 ) {
499
+ /* Write enable */
500
+ status = flexspi_nor_write_enable_ram (address + offset );
501
+
502
+ if (status != kStatus_Success ) {
503
+ return status ;
504
+ }
505
+
506
+ /* Prepare page program command */
507
+ flashXfer .deviceAddress = address + offset ;
508
+ flashXfer .port = kFLEXSPI_PortA1 ;
509
+ flashXfer .cmdType = kFLEXSPI_Write ;
510
+ flashXfer .SeqNumber = 1 ;
511
+ flashXfer .seqIndex = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD ;
512
+ flashXfer .data = (uint32_t * )(src + offset );
513
+ flashXfer .dataSize = BOARD_FLASH_PAGE_SIZE ;
514
+
515
+ status = FLEXSPI_TransferBlocking (FLEXSPI , & flashXfer );
516
+
517
+ if (status != kStatus_Success ) {
518
+ return status ;
519
+ }
520
+
521
+ status = flexspi_nor_wait_bus_busy_ram ();
522
+
523
+ if (status != kStatus_Success ) {
524
+ return status ;
525
+ }
526
+
527
+ size -= BOARD_FLASH_PAGE_SIZE ;
528
+ offset += BOARD_FLASH_PAGE_SIZE ;
529
+ }
530
+
531
+ /* Do software reset. */
532
+ FLEXSPI_SoftwareReset (FLEXSPI );
533
+
534
+ return status ;
535
+ }
536
+
537
+ #endif
274
538
void flexspi_nor_flash_read_data_ram (uint32_t addr , uint32_t * buffer , uint32_t size )
275
539
{
276
540
memcpy (buffer , (void * )addr , size );
277
541
}
278
542
279
543
int32_t flash_init (flash_t * obj )
280
544
{
545
+ core_util_critical_section_enter ();
281
546
flexspi_update_lut_ram ();
547
+ core_util_critical_section_exit ();
282
548
283
549
return 0 ;
284
550
}
@@ -355,12 +621,12 @@ uint32_t flash_get_page_size(const flash_t *obj)
355
621
356
622
uint32_t flash_get_start_address (const flash_t * obj )
357
623
{
358
- return BOARD_FLASH_START_ADDR ;
624
+ return BOARD_FLASHIAP_START_ADDR ;
359
625
}
360
626
361
627
uint32_t flash_get_size (const flash_t * obj )
362
628
{
363
- return BOARD_FLASH_SIZE ;
629
+ return BOARD_FLASHIAP_SIZE ;
364
630
}
365
631
366
632
uint8_t flash_get_erase_value (const flash_t * obj )
0 commit comments