Skip to content

Commit 45679c7

Browse files
rcitachRbb666
authored andcommitted
Improve BLE OTA image generation to avoid executing OPEN every time a flash erase and write operation occurs.
1 parent 5d19f81 commit 45679c7

2 files changed

Lines changed: 87 additions & 47 deletions

File tree

bsp/renesas/ra6w1-ek/board/ports/ra6w1_ospi_flash.c

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,33 @@
1010
#include "hal_data.h"
1111
#include "bsp_sflash_map_ra6w1.h"
1212

13-
static int ra6w1_ospi_flash_init(void)
13+
static rt_bool_t s_ospi_flash_opened;
14+
15+
static int ra6w1_ospi_flash_open(void)
1416
{
17+
fsp_err_t err;
18+
19+
if (s_ospi_flash_opened)
20+
{
21+
return RT_EOK;
22+
}
23+
24+
err = R_OSPI_W_Open((spi_flash_ctrl_t *)&g_ospi_flash_ctrl,
25+
&g_ospi_flash_cfg);
26+
if (err != FSP_SUCCESS)
27+
{
28+
return -RT_ERROR;
29+
}
30+
31+
s_ospi_flash_opened = RT_TRUE;
1532
return RT_EOK;
1633
}
1734

35+
static int ra6w1_ospi_flash_init(void)
36+
{
37+
return ra6w1_ospi_flash_open();
38+
}
39+
1840
static int ra6w1_ospi_flash_read(long offset, rt_uint8_t *buf, rt_size_t size)
1941
{
2042
rt_memcpy((void *) buf, (void *) ((uint32_t)offset | OSPI_W_AUTOMODE_BASE_ADD), size);
@@ -29,7 +51,10 @@ static int ra6w1_ospi_flash_write(long offset, const rt_uint8_t *buf, rt_size_t
2951
uint32_t write_len;
3052
fsp_err_t err;
3153

32-
R_OSPI_W_Open((spi_flash_ctrl_t *)&g_ospi_flash_ctrl, &g_ospi_flash_cfg);
54+
if (ra6w1_ospi_flash_open() != RT_EOK)
55+
{
56+
return -RT_ERROR;
57+
}
3358

3459
while (remaining > 0)
3560
{
@@ -99,7 +124,10 @@ static int ra6w1_ospi_flash_erase(long offset, rt_size_t size)
99124
uint32_t erase_len;
100125
fsp_err_t err;
101126

102-
R_OSPI_W_Open((spi_flash_ctrl_t *)&g_ospi_flash_ctrl, &g_ospi_flash_cfg);
127+
if (ra6w1_ospi_flash_open() != RT_EOK)
128+
{
129+
return -RT_ERROR;
130+
}
103131

104132
while (remaining > 0)
105133
{

bsp/renesas/ra6w1-ek/scripts/gen_rrq61_flash_image.py

Lines changed: 56 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
119134
def 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+
135169
def 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

266271
def 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+
286293
def 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):
316323
def _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

333345
if __name__ == '__main__':

0 commit comments

Comments
 (0)