Skip to content

Commit 3f6d2e8

Browse files
authored
Fix/erase flash algo (ARMmbed#90)
* Increase sd blockdevice storage area Now 2M to deal with platforms such as ublox evk odin which have 2M of internal flash and have very large binaries * Deal with variable flash sector size Calculate exact erase size by adding size up sector by sector * Erase flash one sector at a time Due to limitation of mbed-os ARMmbed#6077 * Explicitly set flash start address and size in config to help setting other macros more clearly
1 parent 4d2d63d commit 3f6d2e8

File tree

2 files changed

+121
-69
lines changed

2 files changed

+121
-69
lines changed

mbed_app.json

Lines changed: 76 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
"ARM_UC_USE_PAL_CRYPTO=0",
1111
"ARM_UC_USE_SOTP=1",
1212
"ARM_UC_USE_PAL_BLOCKDEVICE=1",
13-
"MBED_CLOUD_CLIENT_UPDATE_STORAGE=ARM_UCP_FLASHIAP_BLOCKDEVICE"
13+
"MBED_CLOUD_CLIENT_UPDATE_STORAGE=ARM_UCP_FLASHIAP_BLOCKDEVICE",
14+
"DEFAULT_MAX_APPLICATION_SIZE=(MBED_CONF_APP_FLASH_START_ADDRESS + MBED_CONF_APP_FLASH_SIZE - MBED_CONF_APP_APPLICATION_START_ADDRESS)"
1415
],
1516
"config": {
1617
"application-start-address": {
@@ -40,91 +41,115 @@
4041
"help": "Flash sector size for SOTP sector 2",
4142
"macro_name": "PAL_INTERNAL_FLASH_SECTION_2_SIZE",
4243
"value": null
44+
},
45+
"flash-start-address": {
46+
"help": "Start address of internal flash. Only used in this config to help the definition of other macros.",
47+
"value": null
48+
},
49+
"flash-size": {
50+
"help": "Total size of internal flash. Only used in this config to help the definition of other macros.",
51+
"value": null
4352
}
4453
},
4554
"target_overrides": {
4655
"*": {
4756
"target.features_remove": ["LWIP"],
48-
"target.features_add": ["COMMON_PAL"],
49-
"platform.stdio-baud-rate": 115200,
57+
"target.features_add" : ["COMMON_PAL"],
58+
"platform.stdio-baud-rate" : 115200,
5059
"platform.stdio-flush-at-exit": false,
51-
"update-client.storage-address": "(1024*1024*64)",
52-
"update-client.storage-size": "(1024*1024)",
60+
"update-client.storage-address" : "(1024*1024*64)",
61+
"update-client.storage-size" : "(1024*1024*2)",
5362
"update-client.storage-locations": 1,
5463
"update-client.firmware-header-version": "2"
5564
},
5665
"K64F": {
57-
"sotp-section-1-address" : "(32*1024)",
58-
"sotp-section-1-size" : "( 4*1024)",
59-
"sotp-section-2-address" : "(36*1024)",
60-
"sotp-section-2-size" : "( 4*1024)",
61-
"update-client.application-details": "(40*1024)",
62-
"application-start-address" : "(41*1024)",
63-
"max-application-size" : "(1024*1024-MBED_CONF_APP_APPLICATION_START_ADDRESS)"
66+
"flash-start-address" : "0x0",
67+
"flash-size" : "(1024*1024)",
68+
"sotp-section-1-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+32*1024)",
69+
"sotp-section-1-size" : "(4*1024)",
70+
"sotp-section-2-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+36*1024)",
71+
"sotp-section-2-size" : "(4*1024)",
72+
"update-client.application-details": "(MBED_CONF_APP_FLASH_START_ADDRESS+40*1024)",
73+
"application-start-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+41*1024)",
74+
"max-application-size" : "DEFAULT_MAX_APPLICATION_SIZE"
6475
},
6576
"K66F": {
66-
"sotp-section-1-address" : "(32*1024)",
67-
"sotp-section-1-size" : "( 4*1024)",
68-
"sotp-section-2-address" : "(36*1024)",
69-
"sotp-section-2-size" : "( 4*1024)",
70-
"update-client.application-details": "(40*1024)",
71-
"application-start-address" : "(41*1024)",
72-
"max-application-size" : "(2048*1024-MBED_CONF_APP_APPLICATION_START_ADDRESS)"
77+
"flash-start-address" : "0x0",
78+
"flash-size" : "(2048*1024)",
79+
"sotp-section-1-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+32*1024)",
80+
"sotp-section-1-size" : "(4*1024)",
81+
"sotp-section-2-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+36*1024)",
82+
"sotp-section-2-size" : "(4*1024)",
83+
"update-client.application-details": "(MBED_CONF_APP_FLASH_START_ADDRESS+40*1024)",
84+
"application-start-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+41*1024)",
85+
"max-application-size" : "DEFAULT_MAX_APPLICATION_SIZE"
7386
},
7487
"KW24D": {
75-
"sotp-section-1-address" : "(32*1024)",
76-
"sotp-section-1-size" : "( 2*1024)",
77-
"sotp-section-2-address" : "(34*1024)",
78-
"sotp-section-2-size" : "( 2*1024)",
79-
"update-client.application-details": "(36*1024)",
80-
"application-start-address" : "(37*1024)",
81-
"max-application-size" : "(512*1024-MBED_CONF_APP_APPLICATION_START_ADDRESS)"
88+
"flash-start-address" : "0x0",
89+
"flash-size" : "(512*1024)",
90+
"sotp-section-1-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+32*1024)",
91+
"sotp-section-1-size" : "(2*1024)",
92+
"sotp-section-2-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+34*1024)",
93+
"sotp-section-2-size" : "(2*1024)",
94+
"update-client.application-details": "(MBED_CONF_APP_FLASH_START_ADDRESS+36*1024)",
95+
"application-start-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+37*1024)",
96+
"max-application-size" : "DEFAULT_MAX_APPLICATION_SIZE"
8297
},
8398
"NUCLEO_L476RG": {
84-
"sotp-section-1-address" : "(0x08000000+32*1024)",
99+
"flash-start-address" : "0x08000000",
100+
"flash-size" : "(1024*1024)",
101+
"sotp-section-1-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+32*1024)",
85102
"sotp-section-1-size" : "(2*1024)",
86-
"sotp-section-2-address" : "(0x08000000+34*1024)",
103+
"sotp-section-2-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+34*1024)",
87104
"sotp-section-2-size" : "(2*1024)",
88-
"update-client.application-details": "(0x08000000+36*1024)",
89-
"application-start-address" : "(0x08000000+38*1024)",
90-
"max-application-size" : "(1024*1024-MBED_CONF_APP_APPLICATION_START_ADDRESS)"
105+
"update-client.application-details": "(MBED_CONF_APP_FLASH_START_ADDRESS+36*1024)",
106+
"application-start-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+38*1024)",
107+
"max-application-size" : "DEFAULT_MAX_APPLICATION_SIZE"
91108
},
92109
"DISCO_L476VG": {
93-
"sotp-section-1-address" : "(0x08000000+32*1024)",
110+
"flash-start-address" : "0x08000000",
111+
"flash-size" : "(1024*1024)",
112+
"sotp-section-1-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+32*1024)",
94113
"sotp-section-1-size" : "(2*1024)",
95-
"sotp-section-2-address" : "(0x08000000+34*1024)",
114+
"sotp-section-2-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+34*1024)",
96115
"sotp-section-2-size" : "(2*1024)",
97-
"update-client.application-details": "(0x08000000+36*1024)",
98-
"application-start-address" : "(0x08000000+38*1024)",
99-
"max-application-size" : "(1024*1024-MBED_CONF_APP_APPLICATION_START_ADDRESS)"
116+
"update-client.application-details": "(MBED_CONF_APP_FLASH_START_ADDRESS+36*1024)",
117+
"application-start-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+38*1024)",
118+
"max-application-size" : "DEFAULT_MAX_APPLICATION_SIZE"
100119
},
101120
"NUCLEO_F429ZI": {
102-
"sotp-section-1-address" : "(0x08000000+32*1024)",
121+
"flash-start-address" : "0x08000000",
122+
"flash-size" : "(2048*1024)",
123+
"sotp-section-1-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+32*1024)",
103124
"sotp-section-1-size" : "(16*1024)",
104-
"sotp-section-2-address" : "(0x08000000+48*1024)",
125+
"sotp-section-2-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+48*1024)",
105126
"sotp-section-2-size" : "(16*1024)",
106-
"update-client.application-details": "(0x08000000+64*1024)",
107-
"application-start-address" : "(0x08000000+65*1024)",
108-
"max-application-size" : "(2048*1024-MBED_CONF_APP_APPLICATION_START_ADDRESS)"
127+
"update-client.application-details": "(MBED_CONF_APP_FLASH_START_ADDRESS+64*1024)",
128+
"application-start-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+65*1024)",
129+
"max-application-size" : "DEFAULT_MAX_APPLICATION_SIZE"
109130
},
110131
"UBLOX_EVK_ODIN_W2": {
111132
"target.device_has_remove": ["EMAC"],
112-
"sotp-section-1-address" : "(0x08000000+32*1024)",
133+
"flash-start-address" : "0x08000000",
134+
"flash-size" : "(2048*1024)",
135+
"sotp-section-1-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+32*1024)",
113136
"sotp-section-1-size" : "(16*1024)",
114-
"sotp-section-2-address" : "(0x08000000+48*1024)",
137+
"sotp-section-2-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+48*1024)",
115138
"sotp-section-2-size" : "(16*1024)",
116-
"update-client.application-details": "(0x08000000+64*1024)",
117-
"application-start-address" : "(0x08000000+65*1024)",
118-
"max-application-size" : "(2048*1024-MBED_CONF_APP_APPLICATION_START_ADDRESS)"
139+
"update-client.application-details": "(MBED_CONF_APP_FLASH_START_ADDRESS+64*1024)",
140+
"application-start-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+65*1024)",
141+
"max-application-size" : "DEFAULT_MAX_APPLICATION_SIZE"
119142
},
120143
"UBLOX_C030_U201": {
121-
"sotp-section-1-address" : "(0x08000000+32*1024)",
144+
"flash-start-address" : "0x08000000",
145+
"flash-size" : "(1024*1024)",
146+
"sotp-section-1-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+32*1024)",
122147
"sotp-section-1-size" : "(16*1024)",
123-
"sotp-section-2-address" : "(0x08000000+48*1024)",
148+
"sotp-section-2-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+48*1024)",
124149
"sotp-section-2-size" : "(16*1024)",
125-
"update-client.application-details": "(0x08000000+64*1024)",
126-
"application-start-address" : "(0x08000000+65*1024)",
127-
"max-application-size" : "(1024*1024-MBED_CONF_APP_APPLICATION_START_ADDRESS)"
150+
"update-client.application-details": "(MBED_CONF_APP_FLASH_START_ADDRESS+64*1024)",
151+
"application-start-address" : "(MBED_CONF_APP_FLASH_START_ADDRESS+65*1024)",
152+
"max-application-size" : "DEFAULT_MAX_APPLICATION_SIZE"
128153
}
129154
}
130155
}

source/active_application.cpp

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -187,25 +187,52 @@ bool eraseActiveFirmware(uint32_t firmwareSize)
187187
{
188188
tr_debug("eraseActiveFirmware");
189189

190-
/* get sector size of where the new firmware would end */
191-
uint32_t lastSectorSize =
192-
flash.get_sector_size(MBED_CONF_APP_APPLICATION_START_ADDRESS +
193-
firmwareSize);
194-
195-
/* full size of header and application */
196-
uint32_t sizeRoundedUp = FIRMWARE_METADATA_HEADER_SIZE + firmwareSize;
197-
198-
/* full size rounded up to erase sector boundary */
199-
sizeRoundedUp = ((sizeRoundedUp + lastSectorSize - 1) / lastSectorSize)
200-
* lastSectorSize;
201-
202-
tr_debug("Erasing from 0x%08" PRIX32 " to 0x%08" PRIX32,
203-
(uint32_t) FIRMWARE_METADATA_HEADER_ADDRESS,
204-
(uint32_t) FIRMWARE_METADATA_HEADER_ADDRESS + sizeRoundedUp);
190+
/* Find the exact end sector boundary. Some platforms have different sector
191+
sizes from sector to sector. Hence we count the sizes 1 sector at a time here */
192+
uint32_t erase_address = FIRMWARE_METADATA_HEADER_ADDRESS;
193+
uint32_t size_needed = FIRMWARE_METADATA_HEADER_SIZE + firmwareSize;
194+
while (erase_address < (FIRMWARE_METADATA_HEADER_ADDRESS + size_needed))
195+
{
196+
erase_address += flash.get_sector_size(erase_address);
197+
}
205198

206-
/* erase flash to make place for new application */
207-
int result = flash.erase(FIRMWARE_METADATA_HEADER_ADDRESS,
208-
sizeRoundedUp);
199+
/* check that the erase will not exceed MBED_CONF_APP_MAX_APPLICATION_SIZE */
200+
int result = -1;
201+
if (erase_address < (MBED_CONF_APP_MAX_APPLICATION_SIZE + \
202+
MBED_CONF_APP_APPLICATION_START_ADDRESS))
203+
{
204+
tr_debug("Erasing from 0x%08" PRIX32 " to 0x%08" PRIX32,
205+
(uint32_t) FIRMWARE_METADATA_HEADER_ADDRESS,
206+
(uint32_t) erase_address);
207+
208+
/* Erase flash to make place for new application. Erasing sector by sector as some
209+
platforms have varible sector sizes and mbed-os cannot deal with erasing multiple
210+
sectors successfully in that case. https://github.com/ARMmbed/mbed-os/issues/6077 */
211+
erase_address = FIRMWARE_METADATA_HEADER_ADDRESS;
212+
while (erase_address < (FIRMWARE_METADATA_HEADER_ADDRESS + size_needed))
213+
{
214+
uint32_t sector_size = flash.get_sector_size(erase_address);
215+
result = flash.erase(erase_address,
216+
sector_size);
217+
if (result != 0)
218+
{
219+
tr_debug("Erasing from 0x%08" PRIX32 " to 0x%08" PRIX32 " failed with retval %i",
220+
erase_address, erase_address + sector_size, result);
221+
break;
222+
}
223+
else
224+
{
225+
erase_address += sector_size;
226+
}
227+
}
228+
}
229+
else
230+
{
231+
tr_error("Firmware size 0x%" PRIX32 " rounded up to the nearest sector boundary 0x%" \
232+
PRIX32 " is larger than the maximum application size 0x%" PRIX32,
233+
firmwareSize, erase_address - MBED_CONF_APP_APPLICATION_START_ADDRESS,
234+
MBED_CONF_APP_MAX_APPLICATION_SIZE);
235+
}
209236

210237
return (result == 0);
211238
}

0 commit comments

Comments
 (0)