aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware-utils/src
diff options
context:
space:
mode:
authorINAGAKI Hiroshi <musashino.open@gmail.com>2018-09-10 09:29:39 +0200
committerJohn Crispin <john@phrozen.org>2018-09-10 09:29:39 +0200
commit7a67b437e7f72f765fb5affe686f308cb42a09e7 (patch)
tree178b6eb730930637e6486d662b618c6174200fe8 /tools/firmware-utils/src
parent628eb271dc5868d3c5bd6a643c213783cce4fd0a (diff)
downloadupstream-7a67b437e7f72f765fb5affe686f308cb42a09e7.tar.gz
upstream-7a67b437e7f72f765fb5affe686f308cb42a09e7.tar.bz2
upstream-7a67b437e7f72f765fb5affe686f308cb42a09e7.zip
firmware-utils: mkedimaximg: add "big-endianness mode" option
In addition to the default little-endianness format, I added a mode so that we can generate firmware with big-endianness format. example: ELECOM WRC-300GHBK2-I (QCA9563) Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
Diffstat (limited to 'tools/firmware-utils/src')
-rw-r--r--tools/firmware-utils/src/mkedimaximg.c43
1 files changed, 35 insertions, 8 deletions
diff --git a/tools/firmware-utils/src/mkedimaximg.c b/tools/firmware-utils/src/mkedimaximg.c
index d8a017e6a8..541eaaaa3f 100644
--- a/tools/firmware-utils/src/mkedimaximg.c
+++ b/tools/firmware-utils/src/mkedimaximg.c
@@ -17,12 +17,19 @@
#include <sys/stat.h>
#include <endian.h> /* for __BYTE_ORDER */
+#define FALSE 0
+#define TRUE 1
+
#if (__BYTE_ORDER == __LITTLE_ENDIAN)
# define HOST_TO_LE16(x) (x)
# define HOST_TO_LE32(x) (x)
+# define HOST_TO_BE16(x) bswap_16(x)
+# define HOST_TO_BE32(x) bswap_32(x)
#else
# define HOST_TO_LE16(x) bswap_16(x)
# define HOST_TO_LE32(x) bswap_32(x)
+# define HOST_TO_BE16(x) (x)
+# define HOST_TO_BE32(x) (x)
#endif
struct header
@@ -47,6 +54,7 @@ struct buf
};
static char *progname;
+static int force_be = FALSE;
static void usage(int status)
{
@@ -61,7 +69,8 @@ static void usage(int status)
" -i <file> read input from file <file>\n"
" -o <file> write output to file <file>\n"
" -f <flash> set flash address to <flash>\n"
- " -S <start> set start address to <start>\n");
+ " -S <start> set start address to <start>\n"
+ " -b big-endianness mode\n");
exit(status);
}
@@ -83,8 +92,12 @@ static unsigned short fwcsum (struct buf *buf) {
int i;
unsigned short ret = 0;
- for (i = 0; i < buf->size / 2; i++)
- ret -= ((unsigned short *) buf->start)[i];
+ for (i = 0; i < buf->size / 2; i++) {
+ if (force_be == FALSE)
+ ret -= ((unsigned short *) buf->start)[i];
+ else
+ ret -= HOST_TO_BE16(((unsigned short *) buf->start)[i]);
+ }
return ret;
}
@@ -144,7 +157,7 @@ int main(int argc, char **argv)
header.flash = header.size = header.start = 0;
progname = basename(argv[0]);
- while((c = getopt(argc, argv, "i:o:m:s:f:S:h")) != -1) {
+ while((c = getopt(argc, argv, "i:o:m:s:f:S:h:b")) != -1) {
switch (c) {
case 'i':
ifinfo.name = optarg;
@@ -181,6 +194,9 @@ int main(int argc, char **argv)
usage(EXIT_FAILURE);
}
break;
+ case 'b':
+ force_be = TRUE;
+ break;
default:
usage(EXIT_FAILURE);
break;
@@ -241,12 +257,23 @@ int main(int argc, char **argv)
if (fwread(&ifinfo, &ibuf))
usage(EXIT_FAILURE);
- header.flash = HOST_TO_LE32(header.flash);
- header.size = HOST_TO_LE32(obuf.size - sizeof(struct header));
- header.start = HOST_TO_LE32(header.start);
+ if (force_be == FALSE) {
+ header.flash = HOST_TO_LE32(header.flash);
+ header.size = HOST_TO_LE32(obuf.size - sizeof(struct header));
+ header.start = HOST_TO_LE32(header.start);
+ } else {
+ header.flash = HOST_TO_BE32(header.flash);
+ header.size = HOST_TO_BE32(obuf.size - sizeof(struct header));
+ header.start = HOST_TO_BE32(header.start);
+ }
+
memcpy (obuf.start, &header, sizeof(struct header));
- csum = HOST_TO_LE16(fwcsum(&ibuf));
+ if (force_be == FALSE)
+ csum = HOST_TO_LE16(fwcsum(&ibuf));
+ else
+ csum = HOST_TO_BE16(fwcsum(&ibuf));
+
memcpy(obuf.start + obuf.size - sizeof(unsigned short),
&csum, sizeof(unsigned short));