@@ -76,6 +76,23 @@ static void periph_unsecure(void)
7676}
7777#endif
7878
79+ static void hal_flash_fix_ecc (void )
80+ {
81+ uint8_t page_buf [512 ];
82+ uint32_t addr ;
83+ uint32_t start = WOLFBOOT_PARTITION_BOOT_ADDRESS ;
84+ uint32_t end = WOLFBOOT_PARTITION_SWAP_ADDRESS + WOLFBOOT_SECTOR_SIZE ;
85+
86+ memset (page_buf , 0xFF , sizeof (page_buf ));
87+
88+ for (addr = start ; addr < end ; addr += pflash_page_size ) {
89+ if (FLASH_VerifyErase (& pflash , addr , pflash_page_size )
90+ == kStatus_FLASH_Success ) {
91+ FLASH_Program (& pflash , addr , page_buf , pflash_page_size );
92+ }
93+ }
94+ }
95+
7996void hal_init (void )
8097{
8198#ifdef __WOLFBOOT
@@ -91,6 +108,7 @@ void hal_init(void)
91108#if defined(__WOLFBOOT ) || !defined(TZEN )
92109 memset (& pflash , 0 , sizeof (pflash ));
93110 FLASH_Init (& pflash );
111+ hal_flash_fix_ecc ();
94112#endif
95113
96114#if defined(TZEN ) && !defined(NONSECURE_APP )
@@ -120,16 +138,41 @@ void hal_prepare_boot(void)
120138
121139int RAMFUNCTION hal_flash_write (uint32_t address , const uint8_t * data , int len )
122140{
123- if (
124- address % pflash_page_size == 0 &&
125- len % pflash_page_size == 0 &&
126- FLASH_Program (& pflash , address , data , len ) == kStatus_FLASH_Success
127- )
128- {
129- return 0 ;
141+ uint8_t page_buf [512 ];
142+ uint32_t page_addr ;
143+ uint32_t offset ;
144+ uint32_t chunk ;
145+
146+ while (len > 0 ) {
147+ page_addr = address & ~(pflash_page_size - 1 );
148+ offset = address - page_addr ;
149+ chunk = pflash_page_size - offset ;
150+ if ((uint32_t )len < chunk )
151+ chunk = (uint32_t )len ;
152+
153+ if (FLASH_VerifyErase (& pflash , page_addr , pflash_page_size )
154+ == kStatus_FLASH_Success ) {
155+ memset (page_buf , 0xFF , pflash_page_size );
156+ } else {
157+ memcpy (page_buf , (void * )page_addr , pflash_page_size );
158+
159+ if (FLASH_Erase (& pflash , page_addr , pflash_page_size ,
160+ kFLASH_ApiEraseKey ) != kStatus_FLASH_Success )
161+ return -1 ;
162+ }
163+
164+ memcpy (page_buf + offset , data , chunk );
165+
166+ if (FLASH_Program (& pflash , page_addr , page_buf , pflash_page_size )
167+ != kStatus_FLASH_Success )
168+ return -1 ;
169+
170+ address += chunk ;
171+ data += chunk ;
172+ len -= (int )chunk ;
130173 }
131174
132- return -1 ;
175+ return 0 ;
133176}
134177
135178void RAMFUNCTION hal_flash_unlock (void )
@@ -142,26 +185,26 @@ void RAMFUNCTION hal_flash_lock(void)
142185
143186int RAMFUNCTION hal_flash_erase (uint32_t address , int len )
144187{
145- if (
146- address % pflash_page_size == 0 &&
147- len % pflash_page_size == 0 &&
148- FLASH_Erase (& pflash , address , len , kFLASH_ApiEraseKey )
149- == kStatus_FLASH_Success
150- )
151- {
152- return 0 ;
153- }
188+ uint8_t page_buf [512 ];
189+ uint32_t pos ;
154190
155- return -1 ;
156- }
191+ if ( address % pflash_page_size != 0 || len % pflash_page_size != 0 )
192+ return -1 ;
157193
158- #ifdef NO_DIRECT_READ_OF_ERASED_SECTOR
159- int RAMFUNCTION hal_flash_is_erased_at (uint32_t address )
160- {
161- address &= ~(WOLFBOOT_SECTOR_SIZE - 1 );
162- return FLASH_VerifyErase (& pflash , address , WOLFBOOT_SECTOR_SIZE ) == kStatus_FLASH_Success ;
194+ memset (page_buf , 0xFF , sizeof (page_buf ));
195+
196+ for (pos = address ; pos < address + (uint32_t )len ; pos += pflash_page_size ) {
197+ if (FLASH_Erase (& pflash , pos , pflash_page_size , kFLASH_ApiEraseKey )
198+ != kStatus_FLASH_Success )
199+ return -1 ;
200+
201+ if (FLASH_Program (& pflash , pos , page_buf , pflash_page_size )
202+ != kStatus_FLASH_Success )
203+ return -1 ;
204+ }
205+
206+ return 0 ;
163207}
164- #endif
165208
166209#ifdef WOLFCRYPT_SECURE_MODE
167210void hal_trng_init (void )
@@ -262,4 +305,4 @@ void uart_write(const char *buf, unsigned int sz)
262305 sz -= line_sz + 1U ;
263306 }
264307}
265- #endif
308+ #endif
0 commit comments