diff options
author | Aidan MacDonald <amachronic@protonmail.com> | 2024-03-30 15:02:22 +0000 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2024-03-31 11:24:07 -0400 |
commit | b0a8cacd1dd11dbf6f8f7b46675d89e5b5b32920 (patch) | |
tree | 0284666ea01de50c01bbc1e43e8e7f8a96283131 /firmware/common | |
parent | 7dc8d754a26c88f376d67e63b1da1adf5e770817 (diff) | |
download | rockbox-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')
-rw-r--r-- | firmware/common/rb-loader.c | 9 |
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 | { |