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 The mk-am35xx-spi-image tool converts barebox.bin to this format. Signed-off-by: Jan Luebbe <jlu@xxxxxxxxxxxxxx> --- arch/arm/Makefile | 8 +++ arch/arm/mach-omap/Kconfig | 7 +++ scripts/.gitignore | 5 +- scripts/Makefile | 2 +- scripts/mk-am35xx-spi-image.c | 126 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 scripts/mk-am35xx-spi-image.c diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 1225df7..c2eb598 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -186,6 +186,14 @@ endif all: $(KBUILD_IMAGE) +barebox.spi: barebox.bin + @echo " SPI " $@ + $(Q)scripts/mk-am35xx-spi-image barebox.bin > barebox.spi + +ifeq ($(CONFIG_OMAP_BUILD_SPI),y) +all: barebox.spi +endif + archprepare: maketools maketools: $(Q)$(MAKE) $(build)=arch/arm/tools include/generated/mach-types.h diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig index 386c484..aa9ab8c 100644 --- a/arch/arm/mach-omap/Kconfig +++ b/arch/arm/mach-omap/Kconfig @@ -91,6 +91,13 @@ config OMAP_BUILD_IFT prompt "build ift binary" bool +config OMAP_BUILD_SPI + prompt "build SPI binary" + bool + help + Say Y here if you want to build an barebox.spi image as used + on the AM35xx chips when booting form SPI NOR flash. + config ARCH_TEXT_BASE hex default 0x80e80000 if MACH_OMAP343xSDP diff --git a/scripts/.gitignore b/scripts/.gitignore index 11fd2df..8772205 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -1,6 +1,7 @@ bareboxenv bin2c -mkimage -kallsyms gen_netx_image +kallsyms +mk-am35xx-spi-image +mkimage omap_signGP diff --git a/scripts/Makefile b/scripts/Makefile index 784d205..9b6b628 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 always := $(hostprogs-y) $(hostprogs-m) diff --git a/scripts/mk-am35xx-spi-image.c b/scripts/mk-am35xx-spi-image.c new file mode 100644 index 0000000..133f2b7 --- /dev/null +++ b/scripts/mk-am35xx-spi-image.c @@ -0,0 +1,126 @@ +/* + * mkublheader.c - produce the header needed to load barebox on OMAP-L138 + * + * Copyright (C) 2012 Jan Luebbe <j.luebbe@xxxxxxxxxxxxxx> + * + * 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. + */ + +#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); +} -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox