diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2010-07-30 14:42:54 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2010-07-30 14:42:54 +0200 |
commit | fe273e179f246cca1a5cac6f2edebb559c2bcfce (patch) | |
tree | 87278f6d2f33542688a7e4e386541e8c0c272253 /sdma-gen-image.c | |
download | sdma-firmware-fe273e179f246cca1a5cac6f2edebb559c2bcfce.tar.gz sdma-firmware-fe273e179f246cca1a5cac6f2edebb559c2bcfce.tar.xz |
initial
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'sdma-gen-image.c')
-rw-r--r-- | sdma-gen-image.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/sdma-gen-image.c b/sdma-gen-image.c new file mode 100644 index 0000000..a63e669 --- /dev/null +++ b/sdma-gen-image.c @@ -0,0 +1,77 @@ +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> + +#include "sdma-firmware.h" + + +static struct sdma_firmware *firmwares[] = { + &sdma_imx31_v1, + &sdma_imx31_v2, + &sdma_imx35_v1, + &sdma_imx35_v2, +}; + +static int gen_one(struct sdma_firmware *fw) +{ + struct sdma_firmware_header header; + int ret; + char *name; + FILE *f; + + printf("name: %s %d\n", fw->name); + + header.magic = 0x414d4453; + header.version_major = 1; + header.version_minor = fw->version; + header.script_addrs_start = sizeof(header); + header.num_script_addrs = sizeof(struct sdma_script_start_addrs) / sizeof(uint32_t); + header.ram_code_start = header.script_addrs_start + sizeof(struct sdma_script_start_addrs); + header.ram_code_size = fw->blob_size * sizeof(uint16_t); + + ret = asprintf(&name, "%s.bin", fw->name); + if (ret < 0) + return ret; + + f = fopen(name, "w"); + if (!f) { + perror("fopen"); + ret = -1; + goto out_free; + } + + ret = fwrite(&header, sizeof(header), 1, f); + if (ret != 1) + goto out_free; + ret = fwrite(fw->addr, sizeof(struct sdma_script_start_addrs), 1, f); + if (ret != 1) + goto out_free; + ret = fwrite(fw->blob, header.ram_code_size, 1, f); + if (ret != 1) + goto out_free; + + fclose(f); + + return 0; + +out_free: + free(name); + + return ret; +} + +int main(void) +{ + int i, ret; + + for (i = 0; i < ARRAY_SIZE(firmwares); i++) { + ret = gen_one(firmwares[i]); + if (ret) + exit(1); + } + + return 0; +} |