@@ -92,6 +92,8 @@ def get_image_header(header):
9292 data = bytearray ()
9393 if header .is_corrupt :
9494 raise ValueError ('image_header_corrupt is not supported' )
95+ if len (header .version ) > 64 :
96+ raise ValueError ('image header version is longer than 64 bytes' )
9597 data .extend (b'DA16' )
9698 data .extend (to_bytes (header .timestamp , 4 ))
9799 data .extend (header .version )
@@ -116,6 +118,19 @@ def get_image_header(header):
116118 data .extend (b'\xFF ' * num_bytes_uninitialized )
117119 return data
118120
121+
122+ def get_image_header_for_data (in_file_data , header_fw_version ):
123+ """Build the Renesas image header for a raw application binary."""
124+ ih_values = ImageHeaderValues (
125+ is_corrupt = False ,
126+ security = False ,
127+ version = header_fw_version .encode (),
128+ timestamp = 0x5939110D ,
129+ image_size = len (in_file_data ),
130+ image_crc = binascii .crc32 (in_file_data ) & 0xFFFFFFFF ,
131+ )
132+ return get_image_header (ih_values )
133+
119134def get_firmware_version_e2s (fw_version_file ):
120135 """
121136 Reads the firmware version from fw_version.h.
@@ -132,6 +147,25 @@ def get_firmware_version_e2s(fw_version_file):
132147
133148 return "1.0.0" # Default version
134149
150+
151+ def get_header_fw_version (ra6w_grp , out_file_name ):
152+ """Return the firmware version stored in an image header."""
153+ fw_version = get_fw_version ()
154+ if not fw_version :
155+ # This condition will be true when we are building project
156+ # using e2studio and project is prepared outside the repo.
157+ script_dir = os .path .dirname (os .path .abspath (__file__ ))
158+ fw_version_file = os .path .abspath (os .path .join (script_dir , "../ra/fsp/src/rm_wifi/fw_version.h" ))
159+ if not os .path .isfile (fw_version_file ):
160+ fw_version_file = os .path .abspath (os .path .join (script_dir , "../ra/fsp/inc/fw_version.h" ))
161+ fw_version = get_firmware_version_e2s (fw_version_file )
162+ elif 'rm_wifi_test_app' in out_file_name or 'vndm_wlan' in out_file_name :
163+ fw_version = fw_version + "-e2studio"
164+ else :
165+ fw_version = fw_version + "-cmake"
166+
167+ return ra6w_grp + '-' + fw_version
168+
135169def gen_flash_image (in_file , out_file , ra6w_grp ):
136170 """Generate output flash image."""
137171 in_file_data = in_file .read ()
@@ -156,38 +190,9 @@ def gen_flash_image(in_file, out_file, ra6w_grp):
156190 # non_secure_cfg.xml.AT25SL641-8MB, hence:
157191 headers_data .extend (headers_data )
158192
159- # Set f/w version info
160- fw_version = get_fw_version ()
161- if not fw_version :
162- # This condition will be true when we are building project
163- # using e2studio and project is prepared outside the repo
164- # In this case fetch the value from fw_version.h which is generated
165- # when packs are created.
166- script_dir = os .path .dirname (os .path .abspath (__file__ )) # Get script directory
167- fw_version_file = os .path .abspath (os .path .join (script_dir , "../ra/fsp/src/rm_wifi/fw_version.h" ))
168- if not os .path .isfile (fw_version_file ):
169- # Try another location
170- fw_version_file = os .path .abspath (os .path .join (script_dir , "../ra/fsp/inc/fw_version.h" ))
171- fw_version = get_firmware_version_e2s (fw_version_file )
172-
173- else :
174- # Check if out_file_name contains 'rm_wifi_test_app.img'
175- if 'rm_wifi_test_app' in out_file_name or 'vndm_wlan' in out_file_name :
176- fw_version = fw_version + "-e2studio"
177- else :
178- # If not, append "-cmake"
179- fw_version = fw_version + "-cmake"
180- header_fw_version = ra6w_grp + '-' + fw_version
181- # From non_secure_cfg.xml.AT25SL641-8MB (image header):
182- ih_values = ImageHeaderValues (
183- is_corrupt = False ,
184- security = False ,
185- version = header_fw_version .encode (),
186- timestamp = 0x5939110D ,
187- image_size = len (in_file_data ),
188- image_crc = binascii .crc32 (in_file_data ),
189- )
190- img_header = get_image_header (ih_values )
193+ header_fw_version = get_header_fw_version (ra6w_grp , out_file_name )
194+ fw_version = header_fw_version [len (ra6w_grp ) + 1 :]
195+ img_header = get_image_header_for_data (in_file_data , header_fw_version )
191196 headers_data .extend (img_header )
192197 out_file .write (headers_data )
193198 out_file .write (in_file_data )
@@ -261,28 +266,30 @@ def gen_flash_image(in_file, out_file, ra6w_grp):
261266 gen_ota_flash_images (in_file_data , fw_version , prefix_file_name , ra6w_grp )
262267
263268 except FileNotFoundError :
264- print ("configuration.xml file not found, skipping OTA image generation." )
269+ print ("configuration.xml file not found, skipping optional OTA test image generation." )
265270
266271def gen_ota_flash_image (in_file_data , header_fw_version , ota_file_name ):
267272 """Generate ota flash image."""
268273 # From non_secure_cfg.xml.AT25SL641-8MB (image header):
269- ih_values = ImageHeaderValues (
270- is_corrupt = False ,
271- security = False ,
272- version = header_fw_version .encode (),
273- timestamp = 0x5939110D ,
274- image_size = len (in_file_data ),
275- image_crc = binascii .crc32 (in_file_data ),
276- )
277-
278- img_header = get_image_header (ih_values )
274+ img_header = get_image_header_for_data (in_file_data , header_fw_version )
279275 headers_data = bytearray ()
280276 headers_data .extend (img_header )
281277 ota_out_file = open ('./' + ota_file_name + '.img' , 'wb' )
282278 ota_out_file .write (headers_data )
283279 ota_out_file .write (in_file_data )
284280 ota_out_file .close ()
285281
282+
283+ def gen_ota_image (in_file , out_file , ra6w_grp ):
284+ """Generate a single OTA image: image header followed by raw firmware."""
285+ in_file_data = in_file .read ()
286+ in_file .close ()
287+
288+ header_fw_version = get_header_fw_version (ra6w_grp , out_file .name )
289+ out_file .write (get_image_header_for_data (in_file_data , header_fw_version ))
290+ out_file .write (in_file_data )
291+ out_file .close ()
292+
286293def gen_ota_flash_images (in_file_data , fw_version , prefix_file_name , ra6w_grp ):
287294 # Same version ex) RA6W1-0000000000-00000
288295 test_fw_version = ra6w_grp + '-' + fw_version
@@ -316,6 +323,8 @@ def gen_ota_flash_images(in_file_data, fw_version, prefix_file_name, ra6w_grp):
316323def _main ():
317324 parser = argparse .ArgumentParser (
318325 description = 'Generate flash image for EK-RRQ61000 board.' )
326+ parser .add_argument ('--ota' , '--ota-image' , dest = 'ota_image' , action = 'store_true' ,
327+ help = 'generate a single OTA image (DA16 image header + raw firmware)' )
319328 parser .add_argument ('in_file' , metavar = 'IN' , type = argparse .FileType ('rb' ),
320329 help = 'input file (.bin produced by objcopy)' )
321330 parser .add_argument ('out_file' , metavar = 'OUT' ,
@@ -327,7 +336,10 @@ def _main():
327336 nargs = "?" ,
328337 default = "RA6W1-RRQ61001" )
329338 args = parser .parse_args ()
330- gen_flash_image (args .in_file , args .out_file , args .ra6w_grp )
339+ if args .ota_image :
340+ gen_ota_image (args .in_file , args .out_file , args .ra6w_grp )
341+ else :
342+ gen_flash_image (args .in_file , args .out_file , args .ra6w_grp )
331343
332344
333345if __name__ == '__main__' :
0 commit comments