summaryrefslogtreecommitdiff
path: root/firmware/common/rb-loader.c
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2024-03-30 15:02:22 +0000
committerAidan MacDonald <amachronic@protonmail.com>2024-03-31 11:24:07 -0400
commitb0a8cacd1dd11dbf6f8f7b46675d89e5b5b32920 (patch)
tree0284666ea01de50c01bbc1e43e8e7f8a96283131 /firmware/common/rb-loader.c
parent7dc8d754a26c88f376d67e63b1da1adf5e770817 (diff)
downloadrockbox-b0a8cacd1dd11dbf6f8f7b46675d89e5b5b32920.tar.gz
rockbox-b0a8cacd1dd11dbf6f8f7b46675d89e5b5b32920.zip
rolo: simplify parsing scramble header in load_firmware()
The standard load_firmware() function is used on targets which use the "scramble -add" method for generating Rockbox binaries. While it tries to be a bit more generic and allows the CRC/data offsets to be placed anywhere in the file, there are no targets which actually need this flexibility, because they are all using plain old "scramble -add". So we can actually simplify load_firmware() and remove defines from the target headers. All the targets used CRC offset = 0 and data offset = 8, except for a few which I assume never supported ROLO or were never tested -- eg. samsungyh820: the CRC and data offsets cannot both be 0. The actual motivation for this is removing the calls to lseek(), which can help make bootloaders a tiny bit smaller, as lseek is typically not used anywhere else in bootloaders. Change-Id: Ic2d01e5b75a32e88363f085e3e839146a0710bf4
Diffstat (limited to 'firmware/common/rb-loader.c')
-rw-r--r--firmware/common/rb-loader.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/firmware/common/rb-loader.c b/firmware/common/rb-loader.c
index 430ed6ec7b..0256f21884 100644
--- a/firmware/common/rb-loader.c
+++ b/firmware/common/rb-loader.c
@@ -58,16 +58,15 @@ static int load_firmware_filename(unsigned char* buf,
58 goto end; 58 goto end;
59 } 59 }
60 60
61 lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET); 61 /* read 32-bit checksum followed by 4-byte model name,
62 62 * this is the "scramble -add" header written by tools/scramble */
63 if (read(fd, &chksum, 4) < 4) 63 if (read(fd, buf, 8) < 8)
64 { 64 {
65 ret = EREAD_CHKSUM_FAILED; 65 ret = EREAD_CHKSUM_FAILED;
66 goto end; 66 goto end;
67 } 67 }
68 chksum = betoh32(chksum); /* Rockbox checksums are big-endian */
69 68
70 lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET); 69 chksum = load_be32(buf); /* Rockbox checksums are big-endian */
71 70
72 if (read(fd, buf, len) < len) 71 if (read(fd, buf, len) < len)
73 { 72 {