Commit edc48b5e authored by Bernhard Nortmann's avatar Bernhard Nortmann
Browse files

fel: refactor aw_fel_write()



This patch introduces a new function aw_write_buffer() to
allow a better distinction between FEL write operations.

aw_fel_write() is meant for "privileged" internal use, while
aw_write_buffer() now represents the preferred entry point
for user code like the "write", "fill" or "clear" commands.

There is some deliberate code duplication here that makes sense
when combined with the next patch, where the aw_usb_write()
call will differ. We want aw_fel_write() to enforce no progress
update/callback, while aw_write_buffer() will (optionally)
support it.
Signed-off-by: default avatarBernhard Nortmann <bernhard.nortmann@web.de>
Reviewed-by: default avatarSiarhei Siamashka <siarhei.siamashka@gmail.com>
parent 70951fa9
...@@ -254,14 +254,6 @@ void aw_fel_read(libusb_device_handle *usb, uint32_t offset, void *buf, size_t l ...@@ -254,14 +254,6 @@ void aw_fel_read(libusb_device_handle *usb, uint32_t offset, void *buf, size_t l
void aw_fel_write(libusb_device_handle *usb, void *buf, uint32_t offset, size_t len) void aw_fel_write(libusb_device_handle *usb, void *buf, uint32_t offset, size_t len)
{ {
/* safeguard against overwriting an already loaded U-Boot binary */
if (uboot_size > 0 && offset <= uboot_entry + uboot_size && offset + len >= uboot_entry) {
fprintf(stderr, "ERROR: Attempt to overwrite U-Boot! "
"Request 0x%08X-0x%08X overlaps 0x%08X-0x%08X.\n",
offset, offset + (int)len,
uboot_entry, uboot_entry + uboot_size);
exit(1);
}
aw_send_fel_request(usb, AW_FEL_1_WRITE, offset, len); aw_send_fel_request(usb, AW_FEL_1_WRITE, offset, len);
aw_usb_write(usb, buf, len); aw_usb_write(usb, buf, len);
aw_read_fel_status(usb); aw_read_fel_status(usb);
...@@ -273,6 +265,33 @@ void aw_fel_execute(libusb_device_handle *usb, uint32_t offset) ...@@ -273,6 +265,33 @@ void aw_fel_execute(libusb_device_handle *usb, uint32_t offset)
aw_read_fel_status(usb); aw_read_fel_status(usb);
} }
/*
* This function is a higher-level wrapper for the FEL write functionality.
* Unlike aw_fel_write() above - which is reserved for internal use - this
* routine is meant to be called from "user" code, and supports (= allows)
* progress callbacks.
* The return value represents elapsed time in seconds (needed for execution).
*/
double aw_write_buffer(libusb_device_handle *usb, void *buf, uint32_t offset,
size_t len)
{
/* safeguard against overwriting an already loaded U-Boot binary */
if (uboot_size > 0 && offset <= uboot_entry + uboot_size
&& offset + len >= uboot_entry)
{
fprintf(stderr, "ERROR: Attempt to overwrite U-Boot! "
"Request 0x%08X-0x%08X overlaps 0x%08X-0x%08X.\n",
offset, offset + len,
uboot_entry, uboot_entry + uboot_size);
exit(1);
}
double start = gettime();
aw_send_fel_request(usb, AW_FEL_1_WRITE, offset, len);
aw_usb_write(usb, buf, len);
aw_read_fel_status(usb);
return gettime() - start;
}
void hexdump(void *data, uint32_t offset, size_t size) void hexdump(void *data, uint32_t offset, size_t size)
{ {
size_t j; size_t j;
...@@ -362,7 +381,7 @@ void aw_fel_fill(libusb_device_handle *usb, uint32_t offset, size_t size, unsign ...@@ -362,7 +381,7 @@ void aw_fel_fill(libusb_device_handle *usb, uint32_t offset, size_t size, unsign
{ {
unsigned char buf[size]; unsigned char buf[size];
memset(buf, value, size); memset(buf, value, size);
aw_fel_write(usb, buf, offset, size); aw_write_buffer(usb, buf, offset, size);
} }
/* /*
...@@ -1068,7 +1087,7 @@ void aw_fel_write_uboot_image(libusb_device_handle *usb, ...@@ -1068,7 +1087,7 @@ void aw_fel_write_uboot_image(libusb_device_handle *usb,
pr_info("Writing image \"%.*s\", %u bytes @ 0x%08X.\n", pr_info("Writing image \"%.*s\", %u bytes @ 0x%08X.\n",
IH_NMLEN, buf + HEADER_NAME_OFFSET, data_size, load_addr); IH_NMLEN, buf + HEADER_NAME_OFFSET, data_size, load_addr);
aw_fel_write(usb, buf + HEADER_SIZE, load_addr, data_size); aw_write_buffer(usb, buf + HEADER_SIZE, load_addr, data_size);
/* keep track of U-Boot memory region in global vars */ /* keep track of U-Boot memory region in global vars */
uboot_entry = load_addr; uboot_entry = load_addr;
...@@ -1270,17 +1289,13 @@ int main(int argc, char **argv) ...@@ -1270,17 +1289,13 @@ int main(int argc, char **argv)
aw_fel_print_version(handle); aw_fel_print_version(handle);
skip=1; skip=1;
} else if (strcmp(argv[1], "write") == 0 && argc > 3) { } else if (strcmp(argv[1], "write") == 0 && argc > 3) {
double t1, t2;
size_t size; size_t size;
void *buf = load_file(argv[3], &size); void *buf = load_file(argv[3], &size);
uint32_t offset = strtoul(argv[2], NULL, 0); uint32_t offset = strtoul(argv[2], NULL, 0);
t1 = gettime(); double elapsed = aw_write_buffer(handle, buf, offset, size);
aw_fel_write(handle, buf, offset, size); if (elapsed > 0)
t2 = gettime(); pr_info("%.1f kB written in %.1f sec (speed: %.1f kB/s)\n",
if (t2 > t1) kilo(size), elapsed, kilo(size) / elapsed);
pr_info("Written %.1f KB in %.1f sec (speed: %.1f KB/s)\n",
(double)size / 1000., t2 - t1,
(double)size / (t2 - t1) / 1000.);
/* /*
* If we have transferred a script, try to inform U-Boot * If we have transferred a script, try to inform U-Boot
* about its address. * about its address.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment