From eca2bc7b17e116f11bab9d84337aedf775c4b3a8 Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Thu, 23 Mar 2017 14:37:22 +0000 Subject: [PATCH] tools: add tool to create empty flash image --- Makefile | 2 ++ scripts/Makefile.host | 7 +++++ source/tools/create_image.c | 69 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 source/tools/create_image.c diff --git a/Makefile b/Makefile index 4cab395..f23642e 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,8 @@ MAKE := make .SECONDARY: +all: tools + clean: @echo "CLEAN" @rm -rf $(BUILD) diff --git a/scripts/Makefile.host b/scripts/Makefile.host index 51cee56..67f6dee 100644 --- a/scripts/Makefile.host +++ b/scripts/Makefile.host @@ -1,2 +1,9 @@ obj-y += source/drivers/sandbox_flash.o obj-y += source/drivers/stdio_console.o + +tools: $(BUILD)/create-image + +$(BUILD)/create-image: $(BUILD)/source/tools/create_image.o + @echo "LD $@" + @mkdir -p $(dir $@) + @$(LD) -o $@ $(CFLAGS) $(LDFLAGS) $^ diff --git a/source/tools/create_image.c b/source/tools/create_image.c new file mode 100644 index 0000000..385b9ad --- /dev/null +++ b/source/tools/create_image.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include + +#define min(x, y) ((x < y) ? (x) : (y)) + +static int parse_size(size_t *size, const char *s) +{ + char *end; + + if (!size || !s) + return -1; + + *size = strtoul(s, &end, 10); + + switch (toupper(*end)) { + case 'G': *size *= 1024; + case 'M': *size *= 1024; + case 'K': *size *= 1024; + case 'B': ++end; break; + case '\0': return 0; + default: return -1; + } + + if (*end) + return -1; + + return 0; +} + +int main(int argc, char *argv[]) +{ + uint8_t buf[4096]; + FILE *fp; + size_t count, size; + int ret = 0; + + if (argc < 3) { + fprintf(stderr, "usage: %s \n", argv[0]); + return -1; + } + + if (parse_size(&size, argv[1]) != 0) { + fprintf(stderr, "error: size must be an integer with an optional K, M " + "or G suffix.\n"); + return -1; + } + + memset(buf, 0xFF, sizeof buf); + + if (!(fp = fopen(argv[2], "wb"))) { + fprintf(stderr, "error: unable to open '%s' for writing.\n", argv[2]); + return -1; + } + + for (; size; size -= count) { + count = min(sizeof buf, size); + + if (fwrite(buf, sizeof *buf, count, fp) < count) { + fprintf(stderr, "error: unable to write to file.\n"); + ret = -1; + } + } + + fclose(fp); + return ret; +}