diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-10-03 21:11:48 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-10-03 21:11:48 +0200 |
commit | bee8dddbfcb07de469105a660e426fa132f96b6a (patch) | |
tree | 11568bb2d8fa6cbbdc1b468093b5202eb5bcddeb /scripts | |
parent | d8b30e6c3823bfe50c3e060aab39b0fab2de933f (diff) | |
parent | 93ca711e64d7a4d79aee15b4ce415688f5415fda (diff) | |
download | barebox-bee8dddbfcb07de469105a660e426fa132f96b6a.tar.gz barebox-bee8dddbfcb07de469105a660e426fa132f96b6a.tar.xz |
Merge branch 'for-next/omap'
Conflicts:
Makefile
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/.gitignore | 1 | ||||
-rw-r--r-- | scripts/Makefile | 2 | ||||
-rw-r--r-- | scripts/mk-am35xx-spi-image.c | 141 |
3 files changed, 143 insertions, 1 deletions
diff --git a/scripts/.gitignore b/scripts/.gitignore index 6e63f85792..3f1cbdb912 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -2,6 +2,7 @@ bareboxenv bin2c gen_netx_image kallsyms +mk-am35xx-spi-image mkimage mkublheader omap_signGP diff --git a/scripts/Makefile b/scripts/Makefile index 7ca5e2973d..55ccdac539 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -9,7 +9,7 @@ hostprogs-y += bin2c hostprogs-y += mkimage hostprogs-y += bareboxenv hostprogs-$(CONFIG_ARCH_NETX) += gen_netx_image -hostprogs-$(CONFIG_ARCH_OMAP) += omap_signGP +hostprogs-$(CONFIG_ARCH_OMAP) += omap_signGP mk-am35xx-spi-image hostprogs-$(CONFIG_ARCH_S5PCxx) += s5p_cksum hostprogs-$(CONFIG_ARCH_DAVINCI) += mkublheader diff --git a/scripts/mk-am35xx-spi-image.c b/scripts/mk-am35xx-spi-image.c new file mode 100644 index 0000000000..ec311fdd4d --- /dev/null +++ b/scripts/mk-am35xx-spi-image.c @@ -0,0 +1,141 @@ +/* + * mk-am35xx-spi-image.c - convert a barebox image for SPI loading on AM35xx + * + * Copyright (C) 2012 Jan Luebbe <j.luebbe@pengutronix.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/** + * @file + * @brief convert a barebox image for SPI loading on AM35xx + * + * FileName: scripts/mk-am35xx-spi-image.c + * + * Booting from SPI on an AM35xx (and possibly other TI SOCs) requires + * a special format: + * + * - 32 bit image size in big-endian + * - 32 bit load address in big-endian + * - binary image converted from little- to big-endian + * + * This tool converts barebox.bin to the required format. + */ + +#define _BSD_SOURCE + +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdint.h> +#include <limits.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> +#include <endian.h> + +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", + prgname); +} + +int main(int argc, char *argv[]) +{ + FILE *input; + int opt; + off_t pos; + size_t size; + uint32_t addr = 0x40200000; + uint32_t temp; + + while((opt = getopt(argc, argv, "a:")) != -1) { + switch (opt) { + case 'a': + addr = strtoul(optarg, NULL, 0); + break; + } + } + + if (optind >= argc) { + usage(argv[0]); + exit(1); + } + + input = fopen(argv[optind], "r"); + if (input == NULL) { + perror("fopen"); + exit(EXIT_FAILURE); + } + + if (fseeko(input, 0, SEEK_END) == -1) { + perror("fseeko"); + exit(EXIT_FAILURE); + } + + pos = ftello(input); + if (pos == -1) { + perror("ftello"); + exit(EXIT_FAILURE); + } + if (pos % 4) { + printf("error: image size must be a multiple of 4 bytes\n"); + exit(EXIT_FAILURE); + } + if (pos > 0x100000) { + printf("error: image should be smaller than 1 MiB\n"); + exit(EXIT_FAILURE); + } + + if (fseeko(input, 0, SEEK_SET) == -1) { + perror("fseeko"); + exit(EXIT_FAILURE); + } + + /* image size */ + temp = htobe32((uint32_t)pos); + fwrite(&temp, sizeof(uint32_t), 1, stdout); + + /* memory address */ + temp = htobe32(addr); + fwrite(&temp, sizeof(uint32_t), 1, stdout); + + for (;;) { + size = fread(&temp, 1, sizeof(uint32_t), input); + if (!size) + break; + if (size != 4) { + perror("fread"); + exit(EXIT_FAILURE); + } + temp = htobe32(le32toh(temp)); + if (fwrite(&temp, 1, sizeof(uint32_t), stdout) != 4) { + perror("fwrite"); + exit(EXIT_FAILURE); + } + } + + if (fclose(input) != 0) { + perror("fclose"); + exit(EXIT_FAILURE); + } + + exit(EXIT_SUCCESS); +} |