9393#define FESPI_READ_STATUS 0x05 /* Read Status Register */
9494#define FESPI_WRITE_ENABLE 0x06 /* Write Enable */
9595#define FESPI_PAGE_PROGRAM 0x02 /* Page Program */
96+ #define FESPI_ROW_PROGRAM 0x62 /* Row Program */
9697#define FESPI_FAST_READ 0x0B /* Fast Read */
9798#define FESPI_READ 0x03 /* Normal Read */
9899#ifdef SPI_QUAD_MODE
@@ -326,7 +327,6 @@ static RAMFUNCTION void fespi_write_address(uint32_t address)
326327static RAMFUNCTION void fespi_wait_flash_busy (void )
327328{
328329 uint8_t rx ;
329- fespi_sw_setdir (FESPI_DIR_RX );
330330 fespi_csmode_hold ();
331331 fespi_sw_tx (FESPI_READ_STATUS );
332332 rx = fespi_sw_rx ();
@@ -335,7 +335,20 @@ static RAMFUNCTION void fespi_wait_flash_busy(void)
335335 rx = fespi_sw_rx ();
336336 if ((rx & FESPI_RX_BSY ) == 0 ) {
337337 fespi_csmode_auto ();
338- fespi_sw_setdir (FESPI_DIR_TX );
338+ return ;
339+ }
340+ }
341+ }
342+
343+ static RAMFUNCTION void fespi_wait_flash_writing (void )
344+ {
345+ uint8_t rx ;
346+ fespi_sw_tx (FESPI_READ_STATUS );
347+ rx = fespi_sw_rx ();
348+ while (1 ) {
349+ fespi_sw_tx (0 );
350+ rx = fespi_sw_rx ();
351+ if ((rx & FESPI_RX_WE ) == 0 ) {
339352 return ;
340353 }
341354 }
@@ -413,20 +426,37 @@ void hal_prepare_boot(void)
413426{
414427}
415428
429+ #define FLASH_PAGE_SIZE 256
430+
416431/* Flash functions must be relocated to RAM for execution */
417432int RAMFUNCTION hal_flash_write (uint32_t address , const uint8_t * data , int len )
418433{
419434 int i ;
435+ uint32_t off = address & 0xFF ;
436+ uint32_t page = address >> 8 ;
420437 fespi_wait_txwm ();
421438 fespi_swmode ();
422- fespi_wait_flash_busy ();
423- fespi_sw_tx (FESPI_WRITE_ENABLE );
424- fespi_write_address (address );
425- for (i = 0 ; i < len ; i ++ )
426- fespi_sw_tx (data [i ]);
427- fespi_wait_txwm ();
428- fespi_csmode_auto ();
439+
440+ while ((page * FLASH_PAGE_SIZE ) < (address + len )) {
441+ fespi_wait_flash_busy ();
442+ fespi_wait_txwm ();
443+ fespi_sw_setdir (FESPI_DIR_TX );
444+ fespi_csmode_hold ();
445+ fespi_sw_tx (FESPI_WRITE_ENABLE );
446+ fespi_sw_tx (FESPI_PAGE_PROGRAM );
447+ fespi_write_address (page << 8 + off );
448+ for (i = off ; i < FLASH_PAGE_SIZE ; i ++ ) {
449+ fespi_sw_tx (data [i ]);
450+ }
451+ fespi_csmode_auto ();
452+ fespi_sw_setdir (FESPI_DIR_RX );
453+ fespi_wait_txwm ();
454+ page ++ ;
455+ off = 0 ;
456+ }
457+ fespi_wait_flash_writing ();
429458 fespi_hwmode ();
459+
430460 return 0 ;
431461}
432462
@@ -446,12 +476,15 @@ int RAMFUNCTION hal_flash_erase(uint32_t address, int len)
446476 fespi_wait_txwm ();
447477 fespi_swmode ();
448478 fespi_wait_flash_busy ();
479+
449480 for (p = address ; p <= end ; p += FESPI_FLASH_SECTOR_SIZE ) {
450481 fespi_sw_tx (FESPI_WRITE_ENABLE );
451482 fespi_wait_txwm ();
452483 fespi_csmode_hold ();
484+ fespi_sw_setdir (FESPI_DIR_TX );
453485 fespi_sw_tx (FESPI_ERASE_SECTOR );
454486 fespi_write_address (p );
487+ fespi_sw_setdir (FESPI_DIR_RX );
455488 fespi_wait_txwm ();
456489 fespi_csmode_auto ();
457490 fespi_wait_flash_busy ();
0 commit comments