summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-09-24 12:03:44 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2014-09-26 09:57:18 +0200
commitad428bcb5d2d42d93c8cb040f26b062c15ea66c4 (patch)
tree58410c3ccf6a4ba694ad009f1c7cb72fbe25ac24 /scripts
parentb1536a3298e25dfdd0136c0fc8d68d2a12cff63c (diff)
downloadbarebox-ad428bcb5d2d42d93c8cb040f26b062c15ea66c4.tar.gz
barebox-ad428bcb5d2d42d93c8cb040f26b062c15ea66c4.tar.xz
scripts: mk-am3xxx-spi-image: fix wrong assumptions about SPI images
We assumed that there is a special image format for SPI. This is not the case. The AM33xx can boot either images generated with omap_signGP or raw images which only have the image size and load address in front of the image. Whether these images are booted from SPI or another boot medium doesn't matter. The only special thing about SPI is that the image is in big endian format. - renames mk-am3xxx-spi-image.c to mk-omap-image.c as the image format is not only supported by AM3xxx but also by the OMAP SoCs - removes the option to specify the SoC - introduces -s to build a big endian image - detects if an image already is an image generated with omap_signGP So the behaviour is like this: raw image -> mk-omap-image -> prepend size/address -> image for SD/MMC raw image -> mk-omap-image -s -> prepend size/address, big endian swap -> image for SPI CH image -> mk-omap-image -> nothing, input == output CH image -> mk-omap-image -s -> big endian swap -> image for SPI Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/.gitignore2
-rw-r--r--scripts/Makefile2
-rw-r--r--scripts/mk-omap-image.c (renamed from scripts/mk-am3xxx-spi-image.c)76
3 files changed, 38 insertions, 42 deletions
diff --git a/scripts/.gitignore b/scripts/.gitignore
index 1df04ba5b1..dc794bc898 100644
--- a/scripts/.gitignore
+++ b/scripts/.gitignore
@@ -10,7 +10,7 @@ kwbimage
kwboot
gen_netx_image
omap_signGP
-mk-am3xxx-spi-image
+mk-omap-image
s5p_cksum
mkublheader
zynq_mkimage
diff --git a/scripts/Makefile b/scripts/Makefile
index 2050ec497d..5483a64245 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -14,7 +14,7 @@ hostprogs-$(CONFIG_IMD) += bareboximd
hostprogs-$(CONFIG_KALLSYMS) += kallsyms
hostprogs-$(CONFIG_ARCH_MVEBU) += kwbimage kwboot
hostprogs-$(CONFIG_ARCH_NETX) += gen_netx_image
-hostprogs-$(CONFIG_ARCH_OMAP) += omap_signGP mk-am3xxx-spi-image
+hostprogs-$(CONFIG_ARCH_OMAP) += omap_signGP mk-omap-image
hostprogs-$(CONFIG_ARCH_S5PCxx) += s5p_cksum
hostprogs-$(CONFIG_ARCH_DAVINCI) += mkublheader
hostprogs-$(CONFIG_ARCH_ZYNQ) += zynq_mkimage
diff --git a/scripts/mk-am3xxx-spi-image.c b/scripts/mk-omap-image.c
index dcb7060d21..d0335ad174 100644
--- a/scripts/mk-am3xxx-spi-image.c
+++ b/scripts/mk-omap-image.c
@@ -48,66 +48,38 @@
#include <getopt.h>
#include <endian.h>
-enum soc {
- SOC_AM33XX,
- SOC_AM35XX,
- SOC_UNKNOWN,
-};
-
-static char *soc_names[] = {
- [SOC_AM33XX] = "am33xx",
- [SOC_AM35XX] = "am35xx",
-};
-
void usage(char *prgname)
{
printf("usage: %s [OPTION] FILE > IMAGE\n"
"\n"
"options:\n"
" -a <address> memory address for the loaded image in SRAM\n"
- " -s <soc> SoC to use (am33xx, am35xx)\n",
+ " -s Write big endian image needed for direct flashing to SPI\n",
prgname);
}
int main(int argc, char *argv[])
{
FILE *input;
- int opt, i;
+ int opt;
off_t pos;
size_t size;
uint32_t addr = 0x40200000;
uint32_t temp;
- enum soc soc = SOC_UNKNOWN;
- char *socname = NULL;
+ int chsettings = 0;
+ int swap = 0;
- while((opt = getopt(argc, argv, "a:s:")) != -1) {
+ while((opt = getopt(argc, argv, "a:s")) != -1) {
switch (opt) {
case 'a':
addr = strtoul(optarg, NULL, 0);
break;
case 's':
- socname = optarg;
+ swap = 1;
break;
}
}
- if (!socname) {
- fprintf(stderr, "SoC not specified. Use -s <soc>\n");
- exit(EXIT_FAILURE);
- }
-
- for (i = 0; i < 2; i++) {
- if (!strcmp(socname, soc_names[i])) {
- soc = i;
- break;
- }
- }
-
- if (soc == SOC_UNKNOWN) {
- fprintf(stderr, "SoC %s unknown\n", socname);
- exit(EXIT_FAILURE);
- }
-
if (optind >= argc) {
usage(argv[0]);
exit(1);
@@ -134,20 +106,43 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
- if (fseeko(input, 0, SEEK_SET) == -1) {
+ if (fseeko(input, 0x14, SEEK_SET) == -1) {
+ perror("fseeko");
+ exit(EXIT_FAILURE);
+ }
+
+ size = fread(&temp, 1, sizeof(uint32_t), input);
+ if (!size) {
+ perror("fseeko");
+ exit(EXIT_FAILURE);
+ }
+
+ /*
+ * Test if this is an image generated with omap_signGP. These don't
+ * need size and load address prepended.
+ */
+ if (le32toh(temp) == 0x45534843)
+ chsettings = 1;
+
+ if (fseeko(input, 0x0, SEEK_SET) == -1) {
perror("fseeko");
exit(EXIT_FAILURE);
}
pos = (pos + 3) & ~3;
- /* image size */
- if (soc == SOC_AM35XX) {
- temp = htobe32((uint32_t)pos);
+ if (!chsettings) {
+ /* image size */
+ temp = pos;
+ if (swap)
+ temp = htobe32(temp);
+
fwrite(&temp, sizeof(uint32_t), 1, stdout);
/* memory address */
- temp = htobe32(addr);
+ temp = addr;
+ if (swap)
+ temp = htobe32(temp);
fwrite(&temp, sizeof(uint32_t), 1, stdout);
}
@@ -159,7 +154,8 @@ int main(int argc, char *argv[])
perror("fread");
exit(EXIT_FAILURE);
}
- temp = htobe32(le32toh(temp));
+ if (swap)
+ temp = htobe32(le32toh(temp));
if (fwrite(&temp, 1, sizeof(uint32_t), stdout) != 4) {
perror("fwrite");
exit(EXIT_FAILURE);